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"))