diff --git a/uTable.sln b/uTable.sln
index e768c75..c054b90 100644
--- a/uTable.sln
+++ b/uTable.sln
@@ -1,11 +1,11 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 18
-VisualStudioVersion = 18.8.12023.21 stable
+VisualStudioVersion = 18.8.12023.21
MinimumVisualStudioVersion = 10.0.40219.1
Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "uTable", "utable\uTable.vbproj", "{F81002BD-7D4C-48FF-A334-07769E79EFCA}"
EndProject
-Project("{C7167F0D-BC9F-4E6E-AFE1-012C56B48DB5}") = "uTablePackage", "uTablePackage\uTablePackage.wapproj", "{183729D8-02F1-4DD9-B373-60B4D49C1523}"
+Project("{C7167F0D-BC9F-4E6E-AFE1-012C56B48DB5}") = "uTablePackage", "uTablePackage\uTablePackage.wapproj", "{624BD3B2-B3CE-4940-9AEA-A74D137E824A}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -41,36 +41,36 @@ Global
{F81002BD-7D4C-48FF-A334-07769E79EFCA}.Release|x64.Build.0 = Release|Any CPU
{F81002BD-7D4C-48FF-A334-07769E79EFCA}.Release|x86.ActiveCfg = Release|Win32
{F81002BD-7D4C-48FF-A334-07769E79EFCA}.Release|x86.Build.0 = Release|Win32
- {183729D8-02F1-4DD9-B373-60B4D49C1523}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {183729D8-02F1-4DD9-B373-60B4D49C1523}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {183729D8-02F1-4DD9-B373-60B4D49C1523}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
- {183729D8-02F1-4DD9-B373-60B4D49C1523}.Debug|ARM.ActiveCfg = Debug|ARM
- {183729D8-02F1-4DD9-B373-60B4D49C1523}.Debug|ARM.Build.0 = Debug|ARM
- {183729D8-02F1-4DD9-B373-60B4D49C1523}.Debug|ARM.Deploy.0 = Debug|ARM
- {183729D8-02F1-4DD9-B373-60B4D49C1523}.Debug|ARM64.ActiveCfg = Debug|ARM64
- {183729D8-02F1-4DD9-B373-60B4D49C1523}.Debug|ARM64.Build.0 = Debug|ARM64
- {183729D8-02F1-4DD9-B373-60B4D49C1523}.Debug|ARM64.Deploy.0 = Debug|ARM64
- {183729D8-02F1-4DD9-B373-60B4D49C1523}.Debug|x64.ActiveCfg = Debug|x64
- {183729D8-02F1-4DD9-B373-60B4D49C1523}.Debug|x64.Build.0 = Debug|x64
- {183729D8-02F1-4DD9-B373-60B4D49C1523}.Debug|x64.Deploy.0 = Debug|x64
- {183729D8-02F1-4DD9-B373-60B4D49C1523}.Debug|x86.ActiveCfg = Debug|x86
- {183729D8-02F1-4DD9-B373-60B4D49C1523}.Debug|x86.Build.0 = Debug|x86
- {183729D8-02F1-4DD9-B373-60B4D49C1523}.Debug|x86.Deploy.0 = Debug|x86
- {183729D8-02F1-4DD9-B373-60B4D49C1523}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {183729D8-02F1-4DD9-B373-60B4D49C1523}.Release|Any CPU.Build.0 = Release|Any CPU
- {183729D8-02F1-4DD9-B373-60B4D49C1523}.Release|Any CPU.Deploy.0 = Release|Any CPU
- {183729D8-02F1-4DD9-B373-60B4D49C1523}.Release|ARM.ActiveCfg = Release|ARM
- {183729D8-02F1-4DD9-B373-60B4D49C1523}.Release|ARM.Build.0 = Release|ARM
- {183729D8-02F1-4DD9-B373-60B4D49C1523}.Release|ARM.Deploy.0 = Release|ARM
- {183729D8-02F1-4DD9-B373-60B4D49C1523}.Release|ARM64.ActiveCfg = Release|ARM64
- {183729D8-02F1-4DD9-B373-60B4D49C1523}.Release|ARM64.Build.0 = Release|ARM64
- {183729D8-02F1-4DD9-B373-60B4D49C1523}.Release|ARM64.Deploy.0 = Release|ARM64
- {183729D8-02F1-4DD9-B373-60B4D49C1523}.Release|x64.ActiveCfg = Release|x64
- {183729D8-02F1-4DD9-B373-60B4D49C1523}.Release|x64.Build.0 = Release|x64
- {183729D8-02F1-4DD9-B373-60B4D49C1523}.Release|x64.Deploy.0 = Release|x64
- {183729D8-02F1-4DD9-B373-60B4D49C1523}.Release|x86.ActiveCfg = Release|x86
- {183729D8-02F1-4DD9-B373-60B4D49C1523}.Release|x86.Build.0 = Release|x86
- {183729D8-02F1-4DD9-B373-60B4D49C1523}.Release|x86.Deploy.0 = Release|x86
+ {624BD3B2-B3CE-4940-9AEA-A74D137E824A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {624BD3B2-B3CE-4940-9AEA-A74D137E824A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {624BD3B2-B3CE-4940-9AEA-A74D137E824A}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
+ {624BD3B2-B3CE-4940-9AEA-A74D137E824A}.Debug|ARM.ActiveCfg = Debug|ARM
+ {624BD3B2-B3CE-4940-9AEA-A74D137E824A}.Debug|ARM.Build.0 = Debug|ARM
+ {624BD3B2-B3CE-4940-9AEA-A74D137E824A}.Debug|ARM.Deploy.0 = Debug|ARM
+ {624BD3B2-B3CE-4940-9AEA-A74D137E824A}.Debug|ARM64.ActiveCfg = Debug|ARM64
+ {624BD3B2-B3CE-4940-9AEA-A74D137E824A}.Debug|ARM64.Build.0 = Debug|ARM64
+ {624BD3B2-B3CE-4940-9AEA-A74D137E824A}.Debug|ARM64.Deploy.0 = Debug|ARM64
+ {624BD3B2-B3CE-4940-9AEA-A74D137E824A}.Debug|x64.ActiveCfg = Debug|x64
+ {624BD3B2-B3CE-4940-9AEA-A74D137E824A}.Debug|x64.Build.0 = Debug|x64
+ {624BD3B2-B3CE-4940-9AEA-A74D137E824A}.Debug|x64.Deploy.0 = Debug|x64
+ {624BD3B2-B3CE-4940-9AEA-A74D137E824A}.Debug|x86.ActiveCfg = Debug|x86
+ {624BD3B2-B3CE-4940-9AEA-A74D137E824A}.Debug|x86.Build.0 = Debug|x86
+ {624BD3B2-B3CE-4940-9AEA-A74D137E824A}.Debug|x86.Deploy.0 = Debug|x86
+ {624BD3B2-B3CE-4940-9AEA-A74D137E824A}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {624BD3B2-B3CE-4940-9AEA-A74D137E824A}.Release|Any CPU.Build.0 = Release|Any CPU
+ {624BD3B2-B3CE-4940-9AEA-A74D137E824A}.Release|Any CPU.Deploy.0 = Release|Any CPU
+ {624BD3B2-B3CE-4940-9AEA-A74D137E824A}.Release|ARM.ActiveCfg = Release|ARM
+ {624BD3B2-B3CE-4940-9AEA-A74D137E824A}.Release|ARM.Build.0 = Release|ARM
+ {624BD3B2-B3CE-4940-9AEA-A74D137E824A}.Release|ARM.Deploy.0 = Release|ARM
+ {624BD3B2-B3CE-4940-9AEA-A74D137E824A}.Release|ARM64.ActiveCfg = Release|ARM64
+ {624BD3B2-B3CE-4940-9AEA-A74D137E824A}.Release|ARM64.Build.0 = Release|ARM64
+ {624BD3B2-B3CE-4940-9AEA-A74D137E824A}.Release|ARM64.Deploy.0 = Release|ARM64
+ {624BD3B2-B3CE-4940-9AEA-A74D137E824A}.Release|x64.ActiveCfg = Release|x64
+ {624BD3B2-B3CE-4940-9AEA-A74D137E824A}.Release|x64.Build.0 = Release|x64
+ {624BD3B2-B3CE-4940-9AEA-A74D137E824A}.Release|x64.Deploy.0 = Release|x64
+ {624BD3B2-B3CE-4940-9AEA-A74D137E824A}.Release|x86.ActiveCfg = Release|x86
+ {624BD3B2-B3CE-4940-9AEA-A74D137E824A}.Release|x86.Build.0 = Release|x86
+ {624BD3B2-B3CE-4940-9AEA-A74D137E824A}.Release|x86.Deploy.0 = Release|x86
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
diff --git a/utable/Forms/SetCourse.vb b/utable/Forms/SetCourse.vb
index 3faa66d..3df067e 100644
--- a/utable/Forms/SetCourse.vb
+++ b/utable/Forms/SetCourse.vb
@@ -377,7 +377,14 @@ Public Class SetCourse
Private Sub DeleteBT_Click(sender As Object, e As EventArgs) Handles DeleteBT.Click
If MsgBox("정말로 지우시겠습니까?", vbQuestion + vbYesNo) = vbYes Then
- writeTable(readTable().Replace(vbCrLf + "" + olddata + "", Nothing))
+ Dim updatedData As String = Nothing
+
+ If Not TryRemoveTableCourse(readTable(), olddata, updatedData) Then
+ MsgBox("삭제할 수업을 현재 시간표에서 찾지 못했습니다. 시간표를 새로고침한 후 다시 시도해 주세요.", vbExclamation)
+ Exit Sub
+ End If
+
+ writeTable(updatedData)
TableForm.updateCell()
Close()
End If
diff --git a/utable/Modules/DataModule.vb b/utable/Modules/DataModule.vb
index 5ba5773..50cd6f5 100644
--- a/utable/Modules/DataModule.vb
+++ b/utable/Modules/DataModule.vb
@@ -81,6 +81,11 @@ Module DataModule
Return GetElementInnerXml(child)
End Function
+ 'course 바로 아래의 서식용 공백은 비교에서 제외하되, 각 필드의 내용은 보존한다.
+ Private Function GetCourseComparisonData(element As XElement) As String
+ Return String.Concat(element.Elements().Select(Function(child) child.ToString(SaveOptions.DisableFormatting)))
+ End Function
+
Private Function ToTableCourse(element As XElement) As TableCourse
Return New TableCourse With {
.RawData = GetElementInnerXml(element).Trim(),
@@ -101,7 +106,26 @@ Module DataModule
Return document.Root.Elements("course").Select(Function(element) ToTableCourse(element)).ToList()
End Function
- 'olddata처럼 course 내부 fragment만 가진 기존 화면을 위한 단일 과목 파서.
+ '표시 중인 과목의 원본 fragment와 일치하는 course 요소를 XML 구조에서 제거한다.
+ '문자열 치환과 달리 줄바꿈이나 들여쓰기 형식에 영향을 받지 않는다.
+ Public Function TryRemoveTableCourse(datastr As String, rawCourseData As String, ByRef result As String) As Boolean
+ Dim document As XDocument = ParseTableFragment(datastr)
+ Dim rawCourse As XElement = ParseTableFragment("" + rawCourseData + "").Root.Element("course")
+ Dim targetData As String = GetCourseComparisonData(rawCourse)
+ Dim target As XElement = document.Root.Elements("course").FirstOrDefault(
+ Function(element) GetCourseComparisonData(element) = targetData)
+
+ If target Is Nothing Then
+ result = datastr
+ Return False
+ End If
+
+ target.Remove()
+ result = SerializeTableFragment(document)
+ Return True
+ End Function
+
+ 'olddata처럼 course 내부 fragment만 가진 기존 화면을 위한 단일 과목 파서
Public Function getTableCourse(datastr As String) As TableCourse
Dim document As XDocument = ParseTableFragment("" + datastr + "")
Return ToTableCourse(document.Root.Element("course"))