This commit is contained in:
codeboss 2024-08-04 09:50:17 +08:00
parent 239b9a15bb
commit bb8e507d26
2 changed files with 227 additions and 15 deletions

View File

@ -5,10 +5,8 @@
</component> </component>
<component name="ChangeListManager"> <component name="ChangeListManager">
<list default="true" id="f609c0f2-cd0d-4eea-87f1-8caf02d3f04f" name="Changes" comment=""> <list default="true" id="f609c0f2-cd0d-4eea-87f1-8caf02d3f04f" name="Changes" comment="">
<change beforePath="$PROJECT_DIR$/.idea/inspectionProfiles/profiles_settings.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/inspectionProfiles/profiles_settings.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" /> <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/entry.py" beforeDir="false" afterPath="$PROJECT_DIR$/entry.py" afterDir="false" /> <change beforePath="$PROJECT_DIR$/parse/StoryMap.py" beforeDir="false" afterPath="$PROJECT_DIR$/parse/StoryMap.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/frame/CompareViews.py" beforeDir="false" afterPath="$PROJECT_DIR$/frame/CompareViews.py" afterDir="false" />
</list> </list>
<option name="SHOW_DIALOG" value="false" /> <option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" /> <option name="HIGHLIGHT_CONFLICTS" value="true" />
@ -25,6 +23,9 @@
<component name="Git.Settings"> <component name="Git.Settings">
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" /> <option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
</component> </component>
<component name="ProblemsViewState">
<option name="selectedTabId" value="CurrentFile" />
</component>
<component name="ProjectColorInfo">{ <component name="ProjectColorInfo">{
&quot;associatedIndex&quot;: 1 &quot;associatedIndex&quot;: 1
}</component> }</component>

View File

@ -1,21 +1,231 @@
import xml.dom.minidom as mdom import xml.dom.minidom as mdom
from typing import List, Tuple, Dict from typing import List, Tuple, Dict
from abc import abstractmethod
from enum import Enum
from frame.ReferView import EmptyNode from frame.ReferView import EmptyNode
class SliceType(Enum):
StoryDefine = 0,
TextParagraph = 1,
FragmentDefine = 2,
FragmentRefer = 3,
VolumeDefine = 4,
ArticleDefine = 5,
class ElementSlice:
@abstractmethod
def type(self) -> SliceType:
raise NotImplementedError("type")
@abstractmethod
def parent_slice(self) -> 'ElementSlice' | None:
raise NotImplementedError()
@abstractmethod
def set_prev(self, inst: 'ElementSlice' | None):
raise NotImplementedError()
@abstractmethod
def prev_sibling(self) -> 'ElementSlice' | None:
raise NotImplementedError()
@abstractmethod
def set_next(self, inst: 'ElementSlice' | None):
raise NotImplementedError()
@abstractmethod
def next_sibling(self) -> 'ElementSlice' | None:
raise NotImplementedError()
@abstractmethod
def index(self) -> int:
raise NotImplementedError()
class Collection:
@abstractmethod
def children(self) -> List[ElementSlice]:
raise NotImplementedError()
class SiblingsImpl(ElementSlice):
def __init__(self):
self.__prev_sib: 'StoryDefine' | None = None
self.__next_sib: 'StoryDefine' | None = None
pass
def parent_slice(self) -> 'ElementSlice' | None:
pass
def set_prev(self, inst: 'ElementSlice' | None):
pass
def prev_sibling(self) -> 'ElementSlice' | None:
pass
def set_next(self, inst: 'ElementSlice' | None):
pass
def next_sibling(self) -> 'ElementSlice' | None:
pass
def index(self) -> int:
pass
class StoryDefine(ElementSlice, Collection):
def __init__(self, nm: str, idx: int):
self.__index = idx
self.__name = nm
self.__prev_sib: 'StoryDefine' | None = None
self.__next_sib: 'StoryDefine' | None = None
self.__children: List[ElementSlice] = []
pass
def type(self) -> SliceType:
return SliceType.StoryDefine
def parent_slice(self) -> 'ElementSlice' | None:
return None
def set_prev(self, inst: 'ElementSlice' | None):
self.__prev_sib = inst
pass
def prev_sibling(self) -> 'ElementSlice' | None:
return self.__prev_sib
pass
def set_next(self, inst: 'ElementSlice' | None):
self.__next_sib = inst
pass
def next_sibling(self) -> 'ElementSlice' | None:
return self.__next_sib
pass
def index(self) -> int:
return self.__index
pass
def children(self) -> List[ElementSlice]:
return self.__children
def name(self) -> str:
return self.__name
def calc_index(inst: ElementSlice) -> int:
temp_refer = inst.prev_sibling()
index_v = 0
while temp_refer is not None:
index_v += 1
temp_refer = temp_refer.prev_sibling()
pass
return index_v
class TextParagraph(ElementSlice):
def __init__(self, parent: ElementSlice):
self.__parent_node = parent
self.__prev_node: ElementSlice | None = None
self.__next_node: ElementSlice | None = None
self.__text_lines: List[str] = []
pass
def type(self) -> SliceType:
return SliceType.TextParagraph
def parent_slice(self) -> 'ElementSlice' | None:
return self.__parent_node
def set_prev(self, inst: 'ElementSlice' | None):
self.__prev_node = inst
pass
def prev_sibling(self) -> 'ElementSlice' | None:
return self.__prev_node
def set_next(self, inst: 'ElementSlice' | None):
self.__next_node = inst
inst.set_prev(self)
pass
def next_sibling(self) -> 'ElementSlice' | None:
return self.__next_node
def index(self) -> int:
return calc_index(self)
class FragmentDefine(ElementSlice):
def __init__(self, nm:str, parent: ElementSlice):
self.__name = nm
self.__parent_inst = parent
self.__prev_node: ElementSlice | None = None
self.__next_node: ElementSlice | None = None
self.__refer_nodes: List[ElementSlice] = []
self.__description: TextParagraph = TextParagraph(self)
pass
def type(self) -> SliceType:
return SliceType.FragmentDefine
def parent_slice(self) -> 'ElementSlice' | None:
return self.__parent_inst
def set_prev(self, inst: 'ElementSlice' | None):
self.__prev_node = inst
pass
def prev_sibling(self) -> 'ElementSlice' | None:
return self.__prev_node
def set_next(self, inst: 'ElementSlice' | None):
self.__next_node = inst
inst.set_prev(self)
pass
def next_sibling(self) -> 'ElementSlice' | None:
return self.__next_node
def index(self) -> int:
return calc_index(self)
def name(self) -> str:
return self.__name
def refer_slices(self) -> List[ElementSlice]:
return self.__refer_nodes
def refer_append(self, e:ElementSlice):
return self.__refer_nodes.append(e)
def text_description(self) -> TextParagraph:
return self.__description
class FragmentRefer(ElementSlice):
def __init__(self, parent: ElementSlice):
class FragmentSlice(EmptyNode): class FragmentSlice(EmptyNode):
def __init__(self, def_mark: bool = False, name: str= ""): def __init__(self, def_mark: bool = False, name: str = ""):
self.is_define_node = (def_mark, name) self.is_define_node = (def_mark, name)
self.parent_story = "" self.parent_story = ""
self.story_refer = "" self.story_refer = ""
self.fragm_refer = "" self.fragm_refer = ""
self.fragm_sort_i = 0 self.fragm_sort_i = 0
self.prev_node: 'FragmentSlice' = None # 上游节点 self.prev_node: 'FragmentSlice' | None = None # 上游节点
self.next_node: 'FragmentSlice' = None # 下游节点 self.next_node: 'FragmentSlice' | None = None # 下游节点
self.refers_slice: Dict[str, 'FragmentSlice'] = {} # 引用切面 self.refers_slice: Dict[str, 'FragmentSlice'] = {} # 引用切面
self.text_sections: List[str] = [] # 文本段落 self.text_sections: List[str] = [] # 文本段落
pass pass
def get_from_memory(self) -> str: def get_from_memory(self) -> str:
@ -33,8 +243,8 @@ class ArticleSlice(EmptyNode):
self.volume_blongs = v_name self.volume_blongs = v_name
self.article_fullname = f"{v_name}@{a_name}" self.article_fullname = f"{v_name}@{a_name}"
self.refer_target: List[str] = [] # 引用切面 self.refer_target: List[str] = [] # 引用切面
self.text_sections: List[str] = [] # 文本段落 self.text_sections: List[str] = [] # 文本段落
pass pass
def get_from_memory(self) -> str: def get_from_memory(self) -> str:
@ -62,7 +272,7 @@ class StoryMap:
self.slice_list.append(node) self.slice_list.append(node)
pass pass
def get_fragment_defined(self, name: str) -> FragmentSlice|None: def get_fragment_defined(self, name: str) -> FragmentSlice | None:
for fit in self.slice_list: for fit in self.slice_list:
if fit.is_define_node[0]: if fit.is_define_node[0]:
if fit.is_define_node[1] == name: if fit.is_define_node[1] == name:
@ -95,7 +305,7 @@ class XAST_ParseTool:
pass pass
return values return values
def __extract_empty_storymap(self, name: str) -> Tuple[StoryMap, mdom.Element]: def __extract_empty_storymap(self, name: str) -> Tuple[StoryMap, mdom.Element] | None:
storys = self.dom_tree.getElementsByTagName("story") storys = self.dom_tree.getElementsByTagName("story")
for node in storys: for node in storys:
if node.getAttribute("name") == name: if node.getAttribute("name") == name:
@ -107,7 +317,7 @@ class XAST_ParseTool:
def __storynode_initfrags(self, node: StoryMap, e: mdom.Element): def __storynode_initfrags(self, node: StoryMap, e: mdom.Element):
first_elem: mdom.Element = e.firstChild first_elem: mdom.Element = e.firstChild
while first_elem != None: while first_elem is not None:
if hasattr(first_elem, "tagName"): if hasattr(first_elem, "tagName"):
dom_tag = first_elem.tagName dom_tag = first_elem.tagName
if first_elem.tagName == "fragment": if first_elem.tagName == "fragment":
@ -127,7 +337,7 @@ class XAST_ParseTool:
def __fragmnode_init_desc(self, node: FragmentSlice, e: mdom.Element): def __fragmnode_init_desc(self, node: FragmentSlice, e: mdom.Element):
node_elem: mdom.Element = e.firstChild node_elem: mdom.Element = e.firstChild
while node_elem != None: while node_elem is not None:
if hasattr(node_elem, "tagName") and node_elem.tagName == "text-section": if hasattr(node_elem, "tagName") and node_elem.tagName == "text-section":
line = node_elem.getAttribute("text") line = node_elem.getAttribute("text")
node.text_sections.append(line) node.text_sections.append(line)
@ -192,7 +402,7 @@ class XAST_ParseTool:
return values return values
def __volume_node_parse(self, vnode: mdom.Element)-> List[ArticleSlice]: def __volume_node_parse(self, vnode: mdom.Element) -> List[ArticleSlice]:
retvalues = [] retvalues = []
vname = vnode.getAttribute("name") vname = vnode.getAttribute("name")
@ -210,6 +420,7 @@ class XAST_ParseTool:
pass pass
return retvalues return retvalues
pass pass