From 2cd300bb7e3fe33a23608276c03a17d98ad3ef86 Mon Sep 17 00:00:00 2001 From: Ozbolt Menegatti Date: Wed, 6 Mar 2019 23:32:02 +0100 Subject: [PATCH] First commit... --- README.txt | 38 +++++ copy.py | 24 +++ hamburger.png | Bin 0 -> 1000 bytes main.css | 119 +++++++++++++++ main.js | 412 ++++++++++++++++++++++++++++++++++++++++++++++++++ main.xslt | 246 ++++++++++++++++++++++++++++++ 6 files changed, 839 insertions(+) create mode 100644 README.txt create mode 100644 copy.py create mode 100644 hamburger.png create mode 100644 main.css create mode 100644 main.js create mode 100644 main.xslt diff --git a/README.txt b/README.txt new file mode 100644 index 0000000..65af644 --- /dev/null +++ b/README.txt @@ -0,0 +1,38 @@ +Mal dokumentacije + +Datoteke: + +1) hamburger.png - slikca za hamburger meni +2) main.js - javascript koda, +3) main.css - stili +4) main.xslt - pretvorba xml -> html +5) copy.py - neke vrste linker + +Da proizvedemo koncno kodo, pozenemo `python3 copy.py`. Ta potem koncno kodo vrze v "Ctrl-C" (x11 clipboard...), tako da lahko zatem kar prilepimo kodo v lexonomy. Dela na ta nacin, da zamenja "XSLFILE" z vsebino main.xslt, "CSS" z vsebino main.css in "HAMBURGER" z base64 kodirano vsebino hamburger.png datoteke. + +main.xslt je delno popravljen in pociscen xslt iz "view" pogleda, ampak se vedno je kar v bogem stanju. Videti je, da se uporabljajo atributi iz xml-a, ki jih tam sploh ni. Ti atributi se v xml dodajo pred pretvorbo z uporabo javascripta. + +main.css so pac stili, tu spreminjamo barve, fonte ipd. Zal je veliko stilov ostalo tudi v xslt (nisem vse lepo popucal in locil...). + +Potem pa main.js. Tu je veliko stvari in upam, da sem stvari lepo locil, tu je opis bolj vaznih funkcij: + +- prevodi: seznam elementov v xml datoteki +- zgledi: seznam elementov v xml datoteki +- vecjez: seznam elementov v xml datoteki, ki vsebujejo prevode +- xml: sama xml datoteka +- original: uporabljeno za debugging, se lahko zbrise +- prevod_locations: jquery selectorji za mesta, kjer se nahajajo vecjez starsi od prevodov. +- zgledi_locations: podobno kot zgoraj, samo za zglede +- storeXml: vzame xml datoteko in pobere ven prevode, zglede, doda prevod_id-je, line_num in zgled_id, spremeni informacijo o semicolon. Vse pac kar potrebujemo, da lahko xslt ustvari uporaben html +- loadDependencies: nalozi z interneta knjizice, zaenkrat samo sweet-modal +- moveLeft, moveRight, cut, move_to_end, bin, change, semicolon: hamburger meni akcije za prevode. +- add: akcija za + knof pri prevedkih +- action: kontroler za vse akcije v hamburger meniju. +- zgledPrevod: funkcija, ki se izvede, ce dodamo nov prevod za zgled +- registerCallbacks: z jquerijem registriramo vse klike in tako... +- clanekOldCode: definira/registrira akcije zgornjih modrih knofov (to je se del kode iz view) +- editor: "min" koda: nalozi xml, ga "popravi", renderira z xsltProcessor() objektom, doda css stile in potem pozene potrebne klice +- show_modal: funkcija, ki uporabi sweet-modal za dodajanje prevedkov +- harvester: funkcija ki se izvede ob "save" - tu samo postimamo elemente in vrnemo storeXml +- xslt, css: vsebina teh dveh datotek. + diff --git a/copy.py b/copy.py new file mode 100644 index 0000000..4f8db62 --- /dev/null +++ b/copy.py @@ -0,0 +1,24 @@ +#!/usr/bin/python3 + +import base64 + +def copy(string): + import subprocess + subprocess.run(["xclip", "-selection", "c"], input=string, encoding='utf8') + +with open("main.js", 'r') as fp: + script = fp.read() + +with open("main.xslt", "r") as fp: + xslt = fp.read() + +with open("hamburger.png", "rb") as fp: + img = fp.read() + +with open("main.css", "r") as fp: + css = fp.read() + +script = script.replace("XSLFILE", "`{}`".format(xslt)) +script = script.replace("CSS", "`{}`".format(css)) +script = script.replace("HAMBURGER", base64.b64encode(img).decode('ascii')) +copy(script) diff --git a/hamburger.png b/hamburger.png new file mode 100644 index 0000000000000000000000000000000000000000..e5c4f51ecd3538d3e6a6caa41fedbb74bf795511 GIT binary patch literal 1000 zcmeAS@N?(olHy`uVBq!ia0vp^2|ygc!3HFsJt~+Aq}Y|gW!U_%O?XxI14-? ziy0X7ltGxWVyS%@P>{XE)7O>#F_Q#?iu&{J-GM+M$r9Iy66gHf+|;}h2Ir#G#FEq$ zh4Rdj3F!Z|9!%dlewkYF?4PB&#X;znkof2`xtq%=R>^ z>}hqV5ieL{=lD_ALxD#twe1p%C96}Hj{6DL==`QHQ|_#px<*iTt^T(3`J3;mGcq_G zU1pzXUsF@#vHiB__0m+k`Nk`Gr}(I;&hKd>Iyq{Fu4wZIV4{x3}>!cyx8_Sa;fVahk4?zfsqWY*xXEAzDXOOkQgj zGf4CwH{fZ0pXO`E!~FPTMX6-e>Z=lcYT>J|zArtHVBnxPJ=sCfdiv=^0|}OV*OJ|_ zDVrnNL?>>(sUvfo^FB9I!}aUoAzGqr+ft{WPW@7~H-C0v=Z4P>)2EAPnn+#B+UlZt zH1#x_5s$OaqmcFT^74@# zZ(|hM7}mWm(pGX3=VJZx`|teQmu=4<{`=RK`Szyltx*rsVlv9N1bIcRomOHcs~1_f z@bcwgL*HPY!yJF+zI|yUsEpOqz%Ve;*kXHkTP`Tva?Daqqzr-S!)qzf=R5c8nezGb z=LhZA{4=Wd%6Tmn^53}a&F$N_4>bB}Gsql&cw*BIw`qkL^X1}WV_Es%t`1wxqp@z| zRGB-g>I+_Hm_(Jims`p5J-e*2^vZR6do|aV(`O{MoS4&kLoeizySuxO)8EMcIm8Q3j2r1?A<(7bx+>Ykn=R-u3=> zMP1!9^TgBd{{Wp;F*Pxx{7a3U`0>IcrLl?3U(>u)g#Pb2Gx_aH!`H%f&-k5w+;8*- PW vecjez', + 'pomen > skladenjske_skupine > skladenjska_struktura > kolokacije > vecjez', + 'pomen > stalne_zveze > stalna_zveza > vecjez', + 'frazeoloske_zveze > frazeoloska_enota > vecjez' +], +zgledi_locations: [ + 'zgledi > vecjez', + 'zgledi' +], +empty_prevod: '', +oznake: ["a", "b", "c", "iztok", "ozbo", "hhhh"], + +storeXml: function(xml) { + this.xml = xml; + this.prevodi = []; + this.vecjez = []; + this.zgledi = []; + + for(let fstring of this.prevod_locations) { + for(let vecjez of xml.find(fstring)) { + for(let pp of $(vecjez).find('pp')) { + $(pp).prev().attr('semicolon', 'true'); + } + + for(let lprevod of $(vecjez).find("prevod")) { + var prevod = $(lprevod); + if(prevod.text()) { + prevod.attr('prevod_id', this.prevodi.length); + this.prevodi.push(prevod); + } + prevod.attr('line_num', this.vecjez.length); + prevod.attr('semicolon', prevod.attr('semicolon') || false); + } + this.vecjez.push($(vecjez)); + } + } + + for(let fstring of this.zgledi_locations) { + for(let zgledi of xml.find(fstring)) { + for(let lzgled of $(zgledi).find('zgled')) { + var zgled = $(lzgled); + zgled.attr('jezik', zgled.attr('ime_korpusa') == "hunTenTen12" ? "hun" : "slo"); + zgled.attr('zgled_id', this.zgledi.length); + this.zgledi.push(zgled); + } + for(let lprevod of $(zgledi).find('prevod')) { + if(!$(lprevod).text().trim().length) { + $(lprevod).remove(); + } + } + } + } +}, +loadDependencies: function(url) { + this.loadJs("https://cdn.jsdelivr.net/npm/sweet-modal@1.3.2/dist/min/jquery.sweet-modal.min.js"); + this.loadCss('https://cdn.jsdelivr.net/npm/sweet-modal@1.3.2/dist/min/jquery.sweet-modal.min.css'); +}, +loadCss: function(url) { + var link = document.createElement('link'); + link.rel = 'stylesheet'; + link.type = 'text/css'; + link.href = url; + link.media = 'all'; + $('head').append(link); +}, +loadJs: function(url) { + var newscript = document.createElement('script'); + newscript.type = 'text/javascript'; + newscript.async = true; + newscript.src = url; + $('head').append(newscript); +}, +isLast: function(el) { + return el.next().hasClass("myed-prevod-add") || el.next().hasClass('myed-prevod-bin'); +}, +isFirst: function(el) { + return !el.prev().hasClass('myed-prevod-div') || el.prev().is(':hidden'); +}, +moveLeft: function(el) { + if(!this.isFirst(el)) { + var xml_el = this.prevodi[el.attr('prevod_id')]; + + el.prev().before(el); + xml_el.prev().before(xml_el); + Screenful.Editor.changed(); + } +}, +moveRight: function(el) { + if(el.next().length && !this.isLast(el)) { + var xml_el = this.prevodi[el.attr('prevod_id')]; + + el.next().after(el); + xml_el.next().after(xml_el); + Screenful.Editor.changed(); + } +}, +cut: function(el) { + var xml_el = this.prevodi[el.attr('prevod_id')]; + el.toggleClass('myed-prevod-cut'); + xml_el.attr('cut', el.hasClass('myed-prevod-cut')); + + // move to end if cutted + if(el.hasClass('myed-prevod-cut')) { + this.move_to_end(el); + } + Screenful.Editor.changed(); +}, +move_to_end: function(el) { + var xml_el = this.prevodi[el.attr('prevod_id')]; + while(el.next().length && !this.isLast(el)) { + el.next().after(el); + xml_el.next().after(xml_el); + } +}, +bin: function(el) { + el.toggleClass('myed-prevod-bin'); + this.move_to_end(el); + this.prevodi[el.attr('prevod_id')].attr('bin', el.hasClass('myed-prevod-bin')); + Screenful.Editor.changed(); +}, +change: function(el, func_after) { + var text_el = el.find('.myed-prevod-text'); + var razlaga_el = el.find('.myed-prevod-razlaga'); + var self = this; + + self.show_modal(text_el.text(), razlaga_el.text(), function(status, text, razlaga) { + if(status) { + text_el.text(text); + razlaga_el.text(razlaga); + + var xml_el = self.prevodi[el.attr('prevod_id')]; + xml_el.find('tekst').text(text); + + if(xml_el.find('rzg').length == 0) { + xml_el.append("", this.xml); + } + xml_el.find('rzg').text(razlaga); + + Screenful.Editor.changed(); + } + + if(func_after) { + func_after(status); + } + el.focus(); + }); +}, +add: function(el) { + var self = this; + + var to_clone = $('.myed-prevod-div').first(); + var clone = $('
' + to_clone.html() + "
"); + clone.attr('tabindex', '1'); + clone.attr('prevod_id', this.prevodi.length); + + clone.insertBefore(el); + var xml_container = this.vecjez[el.attr('line_num')]; + var new_child = $(this.empty_prevod, this.xml); + + xml_container.append(new_child); + this.prevodi.push(new_child); + this.change(clone, function(result) { if(!result) { self.bin(clone); }}); +}, +semicolon: function(el) { + var scel = el.find('.myed-prevod-semicolon'); + + scel.toggleClass('myed-prevod-semicolon-hidden'); + var xml_el = this.prevodi[el.attr('prevod_id')]; + xml_el.attr('semicolon', !scel.hasClass('myed-prevod-semicolon-hidden')); +}, +action: function(el, action) { + if(action == 'left') { + this.moveLeft(el); + } + else if(action == 'right') { + this.moveRight(el); + } + else if(action == "cut") { + this.cut(el); + } + else if(action == "bin") { + this.bin(el); + } + else if(action == "edit") { + this.change(el, null); + } + else if(action == "semicolon") { + this.semicolon(el); + } +}, +zgledPrevod: function(el, val) { + var zgled_id = el.attr('zgled_id'); + var zgled = this.zgledi[zgled_id]; + var new_el = $(`${ val }`); + + el.parent().text(val); + el.remove(); + + zgled.after(new_el); + Screenful.Editor.changed(); +}, +registerCallbacks: function() { + var self = this; + var root = $(".clanek"); + + function get_prevod_div(element) { + while(element.parent().length) { + if(element.hasClass('myed-prevod-div')) { + return element; + } + element = element.parent(); + } + return null; + } + + root.on('change', '.myed-clanek-select', function(e) { + var el = get_prevod_div($(this)); + var action = $(this).find(":selected").val(); + self.action(el, action); + $(this).prop("selectedIndex", -1); + }); + + root.on('click', '.myed-prevod-add', function(e) { + self.add($(this)); + }); + + root.on('keydown', '.myed-prevod-div', function(e) { + var action = { + 13: "edit", + 37: "left", + 39: "right", + 46: "cut" + }[e.keyCode]; + + if(action) { + self.action($(this), action); + $(this).focus(); + } + }); + + root.on('click', '.myed-zgled-prevod-btn', function(e) { + var el = $(this); + $.sweetModal.prompt('Prevod Zgleda', 'Vstavi:', '', function(val) { + self.zgledPrevod(el, val); + }); + }); + + // fixing modal stuff + $('body').on('keydown', '.sweet-modal-prompt', function(e) { + if(e.keyCode == 13) { + $('.greenB').first().trigger('click') + return false; + } + else if(e.keyCode == 27) { + $('.redB').first().trigger('click') + return false; + } + }); +}, +clanekOldCode: function() { + // script from original xslt, don't really wanna touch this! + var clanekShowHide = function(button) { + if(button.target.tagName !== "INPUT") { + // this actually triggers a few times, so... + return; + } + + var clanek = $('.clanek'); + var boolCollocations = clanek.find(".lblCollocations input").prop("checked"); + var boolExamples = clanek.find(".lblExamples input").prop("checked"); + + if(boolExamples) { + clanek.find(".hiddenExample").slideDown(); + } + else { + clanek.find(".hiddenExample").slideUp(); + } + if(boolCollocations) { + clanek.find(".hiddenBlock").slideDown(); + } + else { + clanek.find(".hiddenBlock").slideUp(); + } + }; + + var clanek = $('.clanek'); + var lblCollocations = clanek.find(".lblCollocations"); + var lblExamples = clanek.find(".lblExamples"); + + lblExamples.hide(); + lblCollocations.hide() + + if(clanek.find(".hiddenBlock").length > 0) { + lblCollocations.show() + lblCollocations.first().on("click", clanekShowHide); + clanek.find(".buttons").show(); + } + if(clanek.find("*:visible > .hiddenExample").length > 0) { + lblExamples.show() + lblExamples.first().on("click", clanekShowHide); + clanek.find(".buttons").show(); + } + + // this is actually new but belongs here + $(".lblPrevodi").first().on('click', function(e) { + if(e.target.tagName !== "INPUT") { + return; + } + $('.myed-zgled-prevod-btn').parent().toggle(); + }); + $('.myed-zgled-prevod-btn').parent().toggle(); +}, +editor: function(div, entry, uneditable) { + var xslt_content = new window.DOMParser().parseFromString(this.xslt, "text/xml"); + var xml = $($.parseXML(entry.content)); + + // for "dodajanje prevodov" we need a model div to copy. + // we create one here, that is then made invisible, but is + // available for copying + $(this.empty_prevod, xml).insertBefore(xml.find('prevod').first()); + + // adding prevod_id to prevodi + this.storeXml(xml); + sessionStorage.myed_original = entry.content; + + var xsltProcessor = new XSLTProcessor(); + xsltProcessor.importStylesheet(xslt_content); + resultDocument = xsltProcessor.transformToFragment(xml[0], document); + $(div).append(resultDocument); + + // now I need to hide first prevod that was inserted into + // xml by this script, in order to be able to clone it + $('.myed-prevod-div').first().hide(); + xml.find('prevod').first().remove(); + + var styleTag = document.createElement('style'); + styleTag.type = 'text/css'; + styleTag.appendChild(document.createTextNode(this.css)); + document.head.appendChild(styleTag); + + this.clanekOldCode(); + this.loadDependencies(); + this.registerCallbacks(); + + // select nothing in all hamburger dropdowns + $('.myed-clanek-select').prop("selectedIndex", -1); +}, +show_modal: function(prevedek, razlaga, callback) { + function grabContent(status) { + if(!callback) return; + var prevedek_t = $('#myed-sm-prevedek').val(); + var razlaga_t = $('#myed-sm-razlaga').val(); + callback(status, prevedek_t, razlaga_t); + }; + + var options = ""; + for(let option of this.oznake) { + options += ``; + } + + $.sweetModal({ + title: 'Spreminjanje Prevedka', + content: ` + Prevedek:

+ Razlaga:

+ Oznaka: več kolokacij | több kollokáció + + + + + + + + +
+ +
+ + + + +
+
+
+ +
+
+
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + ( + + ) + + + + + + + + + + + + + + ( + + ) + + + + + + + + + + myed-prevod-div + myed-prevod-cut + myed-prevod-bin + + + 1 + + + + + + + + + + + myed-prevod-semicolon + myed-prevod-semicolon-hidden + + ; + + + + + + myed-prevod-add + 1 + + button + + + Dodaj prevedek / HUN + + + + + + + + + + + margin: 0.26em 0 0.25em 0; + hiddenExample +
+ ■ +
+
+
+ +
+ + + + + + + myed-zgled-prevod-btn + + button + + + + + +
+
+
+
+
+ + + + + + + + + + + margin: 0.25em 0 0.25em 0; + hiddenBlock + + + color: #cc3366; + font-weight: bold; + + + + + + + + + + + + + + + + + +
+
STALNE ZVEZE | ÁLLANDÓSULT SZÓKAPCSOLATOK
+ +
+
+ +
+
FRAZE | FRAZÉMÁK
+ +
+
+ +