diff --git a/_version.py b/_version.py
index 1589024..2833b4c 100755
--- a/_version.py
+++ b/_version.py
@@ -1,7 +1,7 @@
#!/usr/bin/python
# -*- coding: utf-8 -*-
-__version__ = "3.0.3"
+__version__ = "4.0.0"
__author__ = "Amir Zeldes, Luke Gessler"
__copyright__ = "Copyright 2015-2021, Amir Zeldes"
__license__ = "MIT License"
diff --git a/admin.py b/admin.py
index b64f18d..d6d223d 100644
--- a/admin.py
+++ b/admin.py
@@ -136,6 +136,7 @@ def is_email(email):
+
@@ -719,6 +720,31 @@ def is_email(email):
cpout += '''
'''
cpout += ''''''
+ # spans/multinucs
+ cpout += '''
Allow adding tree-breaking secondary edges using ctrl+drag.
''' + + try: + secedge_state = get_setting("use_secedges") + except IndexError: + secedge_state="False" + + if "switch_secedges" in theform: + if int(get_schema()) < 7: + update_schema() + if theform["switch_secedges"] == "switch_secedges": + if secedge_state == "True": + secedge_state = "False" + else: + secedge_state = "True" + save_setting("use_secedges",secedge_state) + if secedge_state == "True": + opposite_secedge = "Disable" + else: + opposite_secedge = "Enable" + cpout += '''Update the schema without losing data between major schema upgrades.
''' diff --git a/css/rst.css b/css/rst.css index fcf1566..f99c39f 100644 --- a/css/rst.css +++ b/css/rst.css @@ -184,19 +184,44 @@ div.shield-of-justice { } .edu--clickable .tok:not(.tok--selected):hover { - background: rgba(255,255,0,0.3); + background-color: rgba(255,255,0,0.6); } .tok--highlighted { - background: rgba(255,255,0,0.3); + background-color: rgba(255,255,0,0.8) !important; +} +.tok--highlighted.signal-color { + background-color: rgba(var(--rgb), 0.8) !important; } .tok--highlighted-by-button { - background: rgba(255,255,0,0.2); -} + --rgb: 255,255,0; + background-color: rgba(var(--rgb),0.2); +} + +.tok--highlighted-by-button.signal-type-1{--rgb: 255,0,0;background-color: rgba(var(--rgb),0.2);} /*red*/ +.tok--highlighted-by-button.signal-type-2{--rgb: 247,231,51;background-color: rgba(var(--rgb),0.2);} /*yellow*/ +.tok--highlighted-by-button.signal-type-3{--rgb: 251,183,52;background-color: rgba(var(--rgb),0.2);} /*orange*/ +.tok--highlighted-by-button.signal-type-4{--rgb: 128,128,0;background-color: rgba(var(--rgb),0.2);} /*ochre*/ +.tok--highlighted-by-button.signal-type-5{--rgb: 255,0,255;background-color: rgba(var(--rgb),0.2);} /*pink*/ +.tok--highlighted-by-button.signal-type-6{--rgb: 0,0,255;background-color: rgba(var(--rgb),0.2);} /*blue*/ +.tok--highlighted-by-button.signal-type-7{--rgb: 4,93,161;background-color: rgba(var(--rgb),0.2);} /*glas*/ +.tok--highlighted-by-button.signal-type-8{--rgb: 0,255,0;background-color: rgba(var(--rgb),0.2);} /*green*/ +.tok--highlighted-by-button.signal-type-9{--rgb: 0,255,255;background-color: rgba(var(--rgb),0.2);} /*cyan*/ +.tok--highlighted-by-button.signal-type-10{--rgb: 105,3,117;background-color: rgba(var(--rgb),0.2);}/*violet*/ +.tok--highlighted-by-button.signal-type-11{--rgb: 15,8,75;background-color: rgba(var(--rgb),0.2);} /* gray*/ +.tok--highlighted-by-button.signal-type-12{--rgb: 199,214,109;background-color: rgba(var(--rgb),0.2);} +.tok--highlighted-by-button.signal-type-13{--rgb: 131,10,72;background-color: rgba(var(--rgb),0.2);} +.tok--highlighted-by-button.signal-type-14{--rgb: 174,132,126;background-color: rgba(var(--rgb),0.2);} +.tok--highlighted-by-button.signal-type-15{--rgb: 0,255,0;background-color: rgba(var(--rgb),0.2);} +.tok--highlighted-by-button.signal-type-16{--rgb: 255,255,0;background-color: rgba(var(--rgb),0.2);} +.tok--highlighted-by-button.signal-type-17{--rgb: 0,255,255;background-color: rgba(var(--rgb),0.2);} +.tok--highlighted-by-button.signal-type-18{--rgb: 255,0,255;background-color: rgba(var(--rgb),0.2);} +.tok--highlighted-by-button.signal-type-19{--rgb: 255,0,255;background-color: rgba(var(--rgb),0.2);} +.tok--highlighted-by-button.signal-type-20{--rgb: 255,0,255;background-color: rgba(var(--rgb),0.2);} .edu--clickable .tok--selected { - background: rgba(255,255,0,0.7); + background-color: rgba(255,255,0,0.7); } @@ -341,7 +366,7 @@ select.rst_rel { .seg_end:before{content:"\a0\a0"} .seg_end:hover:before{content:"x"} -.tab{position: absolute;left: 0px; top:86px; background-color:white;height: 700px; width: 500px;padding-left:5px} +.tab{position: absolute;left: 0px; top:86px; background-color:white;height: 800px; width: 500px;padding-left:5px} .tab_btn{width:82px;top:85px;position:absolute;z-index:2;border-width:1px;border-color: black black black black; border-style: solid; text-align:center; border-top-left-radius: 6px; border-top-right-radius: 6px; cursor: pointer; background-color: buttonface; border-bottom-color: black} .tab_btn:after{content: "\a0"; width:8px; border-bottom-style: solid; border-bottom-width:1px;border-bottom-color: black; left: 82px;position:absolute;top:0px} button:hover:enabled, .nav_button:hover:enabled{ color: red; background: #f5f5f5; } @@ -542,6 +567,33 @@ input:checked + .slider:before { height: 80%; } -.ui-dialog { z-index: 1000 !important ;} +.ui-dialog { z-index: 10000 !important ;} + +#quick_container{padding-top:5px} + +.custom-menu { + display: none; + z-index: 10000; + position: absolute; + overflow: hidden; + border: 1px solid #CCC; + white-space: nowrap; + font-family: sans-serif; + background: #FFF; + color: #333; + border-radius: 5px; + padding: 0; +} + +/* Each of the items in the list */ +.custom-menu li { + padding: 8px 12px; + cursor: pointer; + list-style-type: none; + transition: all .3s ease; + user-select: none; +} -#quick_container{padding-top:5px} \ No newline at end of file +.custom-menu li:hover { + background-color: #DEF; +} \ No newline at end of file diff --git a/get_structure.py b/get_structure.py index 576e5d0..b1a67d6 100644 --- a/get_structure.py +++ b/get_structure.py @@ -23,7 +23,8 @@ def get_structure_main(**kwargs): current_project = "quick" rels = {} - nodes, signals = read_rst(rs3,rels,as_string=True) + nodes, signals, signal_type_dict = read_rst(rs3,rels,as_string=True) + secedges = [] for nid in nodes: node = nodes[nid] node.relkind = "rst" @@ -31,8 +32,12 @@ def get_structure_main(**kwargs): node.relkind = "multinuc" elif node.relname == "span": node.relkind = "span" + if node.secedges != "": + secedges += node.secedges.split(";") + secedge_data = ";".join(secedges) rels = sorted([(k,v) for k,v in iteritems(rels)]) - output = build_canvas(current_doc, current_project, rels, nodes, signal_data=signals, show_signals=False, validations="validate_empty;validate_flat;validate_mononuc") + output = build_canvas(current_doc, current_project, rels, nodes, secedge_data=secedge_data, signal_data=signals, + validations="validate_empty;validate_flat;validate_mononuc", signal_type_dict=signal_type_dict) return output def get_structure_main_server(): diff --git a/modules/formats/db2rst.py b/modules/formats/db2rst.py index f5dd142..9242b66 100644 --- a/modules/formats/db2rst.py +++ b/modules/formats/db2rst.py @@ -1,7 +1,54 @@ -import re +import re, sys -def db2rst(rels, nodes, signals): +def db2rst(rels, nodes, secedges, signals, signal_types, doc, project, user): + def sequential_ids(rst_xml): + # Ensure no gaps in node IDs and corresponding adjustments to signals and secedges. + # Assume input xml IDs are already sorted, but with possible gaps + output = [] + temp = [] + current_id = 1 + id_map = {} + for line in rst_xml.split("\n"): + if ' id="' in line: + xml_id = re.search(r' id="([^"]+)"', line).group(1) + if ('