diff --git a/res/main.less b/res/main.less index 2348a38..6011089 100644 --- a/res/main.less +++ b/res/main.less @@ -178,7 +178,7 @@ .example { clear: left; margin-left: 1em; - + .example-dot, .example-rest { float: left; max-width: 90%; @@ -289,6 +289,10 @@ .example-component-none { color: @gray; } + + .example-component-no-space { + color: @silver; + } } diff --git a/src/message/__init__.py b/src/message/__init__.py index 039c309..3df9fc7 100644 --- a/src/message/__init__.py +++ b/src/message/__init__.py @@ -4,7 +4,7 @@ from message.show_messages import ShowEntryLabelsEdit, ShowEditTranslation, Show from message.simple_edits import EditSenseLabel, EditSenseDefinition, EditComment, AddSenseLabel, AddSense, AddExampleTranslation, DoChosenExamples, AddToLabelList, AddToGenericList, EditVariants, EditRelatedEntries, EditEntryLabels, ExampleClusterEdit, ExampleClusterAdd from message.show_menu import ShowTranslationMenu, ShowSenseMenu, ShowExampleMenu from message.sense_edit import SenseMoveUp, SenseMoveDown, SenseBin -from message.example_edit import ExampleMoveUp, ExampleMoveDown, ExampleBin, ExampleRoleChange, ExampleComponentAdd, ExampleComponentRemove, EditExampleText, ToggleExamples, ToggleClusters +from message.example_edit import ExampleMoveUp, ExampleMoveDown, ExampleBin, ExampleRoleChange, ExampleComponentSpace, ExampleComponentAdd, ExampleComponentRemove, EditExampleText, ToggleExamples, ToggleClusters from message.delete_messages import DeleteComment, DeleteVariants, DeleteRelatedEntries, DeleteEntryLabels from message.ske_messages import ShowSkeModal, SearchInSkeModal, SkeInsert diff --git a/src/message/example_edit.py b/src/message/example_edit.py index d4ff5c6..d77a276 100644 --- a/src/message/example_edit.py +++ b/src/message/example_edit.py @@ -67,6 +67,16 @@ class ExampleRoleChange(NoReset): component_new_role = None example.copy().components[component_num].role = component_new_role + + +class ExampleComponentSpace(NoReset): + def update_model(self, model): + example = self.get_arg(0, Example) + component_num = self.get_arg(1, int) + + component = example.copy().components[component_num] + component.no_space = not component.no_space + class ExampleComponentAdd(NoReset): def update_model(self, model): diff --git a/src/model/example/component_lexeme.py b/src/model/example/component_lexeme.py index d166f7c..7f4343a 100644 --- a/src/model/example/component_lexeme.py +++ b/src/model/example/component_lexeme.py @@ -5,6 +5,7 @@ class ComponentLexeme(Data): self.other_attributes = {} self.text = "" self.role = "" + self.no_space = False def import_xml(self, xml): if xml.nodeName == "#text": @@ -13,6 +14,9 @@ class ComponentLexeme(Data): else: self.text = xml.textContent self.role = xml.getAttribute("role") + + if xml.hasAttribute("space"): + self.no_space = xml.getAttribute("space") == "false" for oth_attr in ["lexical_unit_lexeme_id", "slolex", "kol"]: if xml.hasAttribute(oth_attr): @@ -21,7 +25,7 @@ class ComponentLexeme(Data): def isValid(self): return len(self.text) > 0 - def export(self, doc): + def export(self, doc, is_multiword, last_component): if self.role is None: return doc.createTextNode(self.text) @@ -29,12 +33,17 @@ class ComponentLexeme(Data): result.setAttribute("role", self.role) result.textContent = self.text + # no space is only allowed in in multiword examples that are not last component + if self.no_space is True and is_multiword and not last_component: + result.setAttribute("space", "false") + for key, value in self.other_attributes.items(): result.setAttribute(key, value) return result def view_style(self): + # no-space is handled in multiword-example directly result = ".comp-text" if self.role is not None: result += ".comp-role" diff --git a/src/model/example/corpus_example.py b/src/model/example/corpus_example.py index 06184fc..aa08ed5 100644 --- a/src/model/example/corpus_example.py +++ b/src/model/example/corpus_example.py @@ -9,8 +9,11 @@ class CorpusExample: if example_xml.hasAttribute(oth_attr): self.other_attributes[oth_attr] = example_xml.getAttribute(oth_attr) - def export(self, doc): + def export(self, doc, modified): result = doc.createElement("corpusExample") + if modified: + result.setAttribute("modified", "true") + for key, value in self.other_attributes.items(): result.setAttribute(key, value) return result diff --git a/src/model/example/example.py b/src/model/example/example.py index 298ad4a..453fb5d 100644 --- a/src/model/example/example.py +++ b/src/model/example/example.py @@ -32,7 +32,7 @@ class Example(Data): self.inner.import_xml(inner_xml) - for comp_xml in inner_xml.childNodes: + for idx, comp_xml in enumerate(inner_xml.childNodes): comp = ComponentLexeme() comp.import_xml(comp_xml) if comp.isValid(): @@ -41,13 +41,11 @@ class Example(Data): def export(self, doc): result = doc.createElement("exampleContainer") - if self.edited: - result.setAttribute("modified", "true") - - inner = self.inner.export(doc) + inner = self.inner.export(doc, self.edited) # TODO: bad quick fix - for comp in self.components: - inner.appendChild(comp.export(doc)) + for idx, comp in enumerate(self.components): + inner.appendChild(comp.export( + doc, self.is_multiword(), idx == len(self.components) - 1)) result.appendChild(inner) return result diff --git a/src/model/example/multiword_example.py b/src/model/example/multiword_example.py index 421cca6..6ee6918 100644 --- a/src/model/example/multiword_example.py +++ b/src/model/example/multiword_example.py @@ -26,7 +26,7 @@ class MultiwordExample: ExampleClusters.register_index(cluster) return cluster - def export(self, doc): + def export(self, doc, _modified): result = doc.createElement("multiwordExample") for key, value in self.other_attributes.items(): @@ -49,5 +49,11 @@ class MultiwordExample: return None def view(self, components): - return " ".join([comp.text for comp in components]) + result = "" + for comp in components: + result += comp.text + if not comp.no_space: + result += " " + + return result.strip() diff --git a/src/view/modals.py b/src/view/modals.py index 812d96b..06d2a43 100644 --- a/src/view/modals.py +++ b/src/view/modals.py @@ -47,19 +47,32 @@ def edit_example(example, sense): return message.msg(message.ExampleRoleChange, example_original, idx, role) divs = [] - buttons_right = lambda idx: [ - h("span.example-component-button.example-component-headword", - {"on": {"click": role_msg(idx, "headword")}}, "H"), - h("span.example-component-button.example-component-collocate", - {"on": {"click": role_msg(idx, "collocate")}}, "C"), - h("span.example-component-button.example-component-other", - {"on": {"click": role_msg(idx, "other")}}, "O"), - h("span.example-component-button.example-component-none", - {"on": {"click": role_msg(idx, "none")}}, "N"), - h("span.example-component-button", - {"on": {"click": message.msg(message.ExampleComponentAdd, example_original, idx)}}, "+"), - h("span.example-component-button", - {"on": {"click": message.msg(message.ExampleComponentRemove, example_original, idx)}}, "-")] + def list_of_right_buttons(idx, component): + result = [ + h("span.example-component-button.example-component-headword", + {"on": {"click": role_msg(idx, "headword")}}, "H"), + h("span.example-component-button.example-component-collocate", + {"on": {"click": role_msg(idx, "collocate")}}, "C"), + h("span.example-component-button.example-component-other", + {"on": {"click": role_msg(idx, "other")}}, "O"), + h("span.example-component-button.example-component-none", + {"on": {"click": role_msg(idx, "none")}}, "N")] + + if example.is_multiword(): + additional_class = ".example-component-no-space" if component.no_space else "" + result.append(h("span.example-component-button" + additional_class, + {"on": + {"click": + message.msg(message.ExampleComponentSpace, example_original, idx)}}, + "␣")) + + result.extend([ + h("span.example-component-button", + {"on": {"click": message.msg(message.ExampleComponentAdd, example_original, idx)}}, "+"), + h("span.example-component-button", + {"on": {"click": message.msg(message.ExampleComponentRemove, example_original, idx)}}, "-")]) + + return result for idx, component in enumerate(example.components): role_txt = component.role if component.role is not None else "none" @@ -75,7 +88,7 @@ def edit_example(example, sense): divs.append(h("div.flex.five.example-component", {}, [ h("div.one-fifth", {}, left), h("div.three-fifth", {}, middle), - h("div.one-fifth", {}, buttons_right(idx))])) + h("div.one-fifth", {}, list_of_right_buttons(idx, component))])) return modal_template(divs, "Edit Example", (message.EditExampleText, example_original))