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 name="ChangeListManager">
<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$/entry.py" beforeDir="false" afterPath="$PROJECT_DIR$/entry.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/frame/CompareViews.py" beforeDir="false" afterPath="$PROJECT_DIR$/frame/CompareViews.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/parse/StoryMap.py" beforeDir="false" afterPath="$PROJECT_DIR$/parse/StoryMap.py" afterDir="false" />
</list>
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
@ -25,6 +23,9 @@
<component name="Git.Settings">
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
</component>
<component name="ProblemsViewState">
<option name="selectedTabId" value="CurrentFile" />
</component>
<component name="ProjectColorInfo">{
&quot;associatedIndex&quot;: 1
}</component>

View File

@ -1,21 +1,231 @@
import xml.dom.minidom as mdom
from typing import List, Tuple, Dict
from abc import abstractmethod
from enum import Enum
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):
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.parent_story = ""
self.story_refer = ""
self.fragm_refer = ""
self.fragm_sort_i = 0
self.prev_node: 'FragmentSlice' = None # 上游节点
self.next_node: 'FragmentSlice' = None # 下游节点
self.refers_slice: Dict[str, 'FragmentSlice'] = {} # 引用切面
self.prev_node: 'FragmentSlice' | None = None # 上游节点
self.next_node: 'FragmentSlice' | None = None # 下游节点
self.refers_slice: Dict[str, 'FragmentSlice'] = {} # 引用切面
self.text_sections: List[str] = [] # 文本段落
self.text_sections: List[str] = [] # 文本段落
pass
def get_from_memory(self) -> str:
@ -33,8 +243,8 @@ class ArticleSlice(EmptyNode):
self.volume_blongs = v_name
self.article_fullname = f"{v_name}@{a_name}"
self.refer_target: List[str] = [] # 引用切面
self.text_sections: List[str] = [] # 文本段落
self.refer_target: List[str] = [] # 引用切面
self.text_sections: List[str] = [] # 文本段落
pass
def get_from_memory(self) -> str:
@ -62,7 +272,7 @@ class StoryMap:
self.slice_list.append(node)
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:
if fit.is_define_node[0]:
if fit.is_define_node[1] == name:
@ -95,7 +305,7 @@ class XAST_ParseTool:
pass
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")
for node in storys:
if node.getAttribute("name") == name:
@ -107,7 +317,7 @@ class XAST_ParseTool:
def __storynode_initfrags(self, node: StoryMap, e: mdom.Element):
first_elem: mdom.Element = e.firstChild
while first_elem != None:
while first_elem is not None:
if hasattr(first_elem, "tagName"):
dom_tag = first_elem.tagName
if first_elem.tagName == "fragment":
@ -127,7 +337,7 @@ class XAST_ParseTool:
def __fragmnode_init_desc(self, node: FragmentSlice, e: mdom.Element):
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":
line = node_elem.getAttribute("text")
node.text_sections.append(line)
@ -192,7 +402,7 @@ class XAST_ParseTool:
return values
def __volume_node_parse(self, vnode: mdom.Element)-> List[ArticleSlice]:
def __volume_node_parse(self, vnode: mdom.Element) -> List[ArticleSlice]:
retvalues = []
vname = vnode.getAttribute("name")
@ -210,6 +420,7 @@ class XAST_ParseTool:
pass
return retvalues
pass