Difference between revisions of "JKey Player & JKey Editor"
From Biowikifarm Metawiki
(Created page with '== Installation == * Javascript-Files: MediaWiki:JKey.js, MediaWiki:JKeyEditor.js & * Editor-Tpl-Files: MediaWiki:Lead/HtmlEditorTemplate == Parser Definition == * Hürde: Leer...') |
|||
(23 intermediate revisions by the same user not shown) | |||
Line 1: | Line 1: | ||
== Installation == | == Installation == | ||
− | * Javascript-Files: MediaWiki:JKey.js | + | * Javascript-Files: [[MediaWiki:JKey.js]] & [[MediaWiki:JKeyEditor.js]] |
− | * Editor-Tpl-Files: MediaWiki:Lead/HtmlEditorTemplate | + | * Editor-Tpl-Files: [[MediaWiki:Lead/HtmlEditorTemplate]] |
+ | |||
+ | == Todos JKey Player == | ||
+ | * neue Bilder für historyActiveOn & historyActiveOff | ||
+ | * Stresstest | ||
+ | |||
+ | == Todos JKey Editor == | ||
+ | * neues Bild für edtIconActionEdit | ||
+ | * Renummerierung der Couplets beim Bewegen | ||
+ | : a) Referenzen der zu den coupletIDs gehörenden objs mit den itemIDs im coupletMemory tauschen | ||
+ | : b) transformiert: für alle itemIDs zugehörig zu einer coupletID (siehe coupletMemory) die ...unnamed_x (die mit class jedtCoupletID_jedtParseLeadID) suchen und analog zu coupletID den Wechsel anpassen | ||
+ | : c) transformiert: analog ...unnamed_x (die mit class jedtNextCouplet), sprich "Next Lead" anpassen, wenn nötig | ||
+ | : d) transformiert: alle ...unnames_xc (die mit class jedtCoupletBacklink) anpassen, wenn nötig | ||
+ | : e) nicht transformiert: dt-nodeid suchen und Inhalt in der cell direkt ändern; nach leadalt suchen und schaun ob "(\d+)" und anpassen, wenn nötig | ||
+ | : f) nicht transformiert: "span.leadon a" links anpassen, wenn nötig | ||
+ | : g) natürlich auch "alle anderen Couplets" betrachten und ändern, die auf die "bewegten" verweisen ("Next Lead" || "span.leadon a") | ||
+ | : h) Achtung: für alle Couplets, die nicht in den Bearbeiten-Modus überführt wurden, ist das Flag wasEdited natürlich noch nicht gesetzt worden im coupletMemory - also entwedern neues Flag mit neuem Wert einführen im itemID obj und dann beim Serialisieren beachten oder direkt im jedtParsedPageData in den uniqueParsedID objs ändern (letzteres würde verlangen, das die felder dann einzeln serialisiert werden); bei "alle anderen Couplets" auch Änderungen merken | ||
+ | : i) die IDs der beiden getauschten Rows mit class edtCouplet sowie table mit class coupletItems anpassen -> letzten Teil ..._coupletX bzw ..._coupletItemsX das X | ||
+ | * Renummerierung aller Couplets beim Speichern | ||
+ | * Stresstest | ||
+ | |||
+ | == Infos JKey Player == | ||
+ | * wenn in "Key Start" ein field: "flags" existiert, kann mit den Werten "jkey-autostart" und "jkey-nocontrols" zusätzliche Funktionalität gesteuert werden | ||
+ | * "jkey-autostart" - Schlüssel automatisch in den interaktiven Modus wechseln | ||
+ | * "jkey-nocontrols" - keine Player Controls anbieten | ||
+ | |||
+ | == Infos JKey Editor == | ||
+ | * jedtParsedPageData enthält die geparste Struktur einer WikiSeite | ||
+ | * für jeden Schlüssel, wenn er bearbeitet wird, werden zusätzliche Felder (wasEdited, domRef, coupletMemory) innerhalb des zugehörigen "Key Start"-Templates eingefügt, durch die der Bearbeiten-Vorgang dokumentiert wird (weitere Änderungen an der Struktur werden nicht vorgenommen) | ||
+ | * Bsp. einer geparsten Struktur: | ||
+ | : "0":{ // beliebiges Template, was keine Felder besitzt ("0" entspricht einer "unique parsed ID") | ||
+ | :: type: "{{", | ||
+ | :: closingType: "}}", | ||
+ | :: startIndex: 0, | ||
+ | :: endIndex: 23, | ||
+ | :: name: "Documentation/subpage", | ||
+ | :: whitespaceAtEnd:"" | ||
+ | :}, | ||
+ | : "1": { // Lücke mit textuellem Inhalt | ||
+ | :: type: "contentGap", | ||
+ | :: startIndex: 25, | ||
+ | :: endIndex: 918, | ||
+ | :}, | ||
+ | : "2": { // öffnendes Key-Template (zusätzlich durch den Editor hinzugefügt: wasEdited, domRef, coupletMemory); jeder Schlüssel erwartet ein schliessendes Key-Template | ||
+ | :: type: "{{", | ||
+ | :: closingType: "}}", | ||
+ | :: startIndex: 918, | ||
+ | :: endIndex: 1717, | ||
+ | :: name: "Key Start", | ||
+ | :: whitespaceAtEnd: "\n" | ||
+ | :: wasEdited: true, | ||
+ | :: domRef: div#wild.decisiontree, // direkte Referenz zum obj im DOM | ||
+ | :: fields: { | ||
+ | ::: "0": { | ||
+ | :::: closingType: "|", | ||
+ | :::: startIndex: 930, | ||
+ | :::: endIndex: 943, | ||
+ | :::: name: "id", | ||
+ | :::: content: "wild", | ||
+ | :::: whitespaceAtStart: " ", | ||
+ | :::: whitespaceAtEnd: "\n ", | ||
+ | :::: isLastField: false, | ||
+ | :::: isUnnamedField: false, | ||
+ | ::: }, | ||
+ | ::: ... | ||
+ | :: }, | ||
+ | :: coupletMemory: { // enthält Struktur des Schlüssels (coupletIDs + ihre "decisions"); ist nur im Key Start und hier wird bei jeder Änderung des Nutzers der Inhalt angepasst | ||
+ | ::: "1": { // coupletID extrahiert aus den Feldern innerhalb der uniqueParsedID | ||
+ | :::: "4": { // itemID -> zugehörigen "decisions" zur coupletID; "4" ist der Verweis auf die uniqueParsedID | ||
+ | ::::: wasOrigin : true, // default gesetzt bei original geparstem "decisons" | ||
+ | ::::: wasEdited : false // wird gesetzt, sobald Couplet in Bearbeiten-Modus transformiert wird | ||
+ | ::::: hasNamedID : true | ||
+ | :::: }, | ||
+ | :::: "4n1": { // neue itemID entstanden durch die AddNew action; n ist der separator; Zahl davor ist Verweis auf uniqueParsedID und dessen obj | ||
+ | ::::: wasOrigin : false, // wird gesetzt, wenn AddNew action ausgeführt wird | ||
+ | ::::: wasEdited : true // wird gesetzt, wenn AddNew action ausgeführt wird | ||
+ | ::::: hasNamedID : true | ||
+ | :::: }, | ||
+ | :::: ... | ||
+ | ::: }, | ||
+ | ::: ... | ||
+ | :: } | ||
+ | : }, | ||
+ | : "3": { | ||
+ | :: type: "contentGap", | ||
+ | :: startIndex: 1719, | ||
+ | :: endIndex: 1720, | ||
+ | :}, | ||
+ | : "4": { // Template für eine "decision"; itemIDs innerhalb des coupletMemorys zeigen hierauf | ||
+ | :: type: "{{", | ||
+ | :: closingType: "}}", | ||
+ | :: startIndex: 1720, | ||
+ | :: endIndex: 2670, | ||
+ | :: name:"Lead", | ||
+ | :: whitespaceAtEnd:" " | ||
+ | :: fields: { | ||
+ | :::: "0": { | ||
+ | ::::: closingType: "|", | ||
+ | ::::: startIndex: 1727, | ||
+ | ::::: endIndex: 1731, | ||
+ | ::::: name: 1, | ||
+ | ::::: content: "1", | ||
+ | ::::: whitespaceAtStart: " ", | ||
+ | ::::: whitespaceAtEnd: " ", | ||
+ | ::::: isLastField: false, | ||
+ | ::::: isUnnamedField: true, | ||
+ | :::: } | ||
+ | :::: ... | ||
+ | ::: } | ||
+ | :} ... | ||
+ | : "tplNames": { // enthält alle aufgetretenen Template-Namen für das dynamische Nachladen von HtmlEditorTemplate's | ||
+ | :: Lead: 32, // 32 entspricht Anzahl, wie oft das Template während des Parsevorgangs aufgetreten ist | ||
+ | :: ... | ||
+ | :}, | ||
== Parser Definition == | == Parser Definition == | ||
Line 10: | Line 123: | ||
: b) underscores gegen blank normalisieren (so rum!) "{{Key_Start" = "{{Key Start" | : b) underscores gegen blank normalisieren (so rum!) "{{Key_Start" = "{{Key Start" | ||
: Ergebnis Templatename bekannt, evtl. Key Start gefunden. | : Ergebnis Templatename bekannt, evtl. Key Start gefunden. | ||
− | : Hinweis: theoretisch kann Templatename selbst durch Template erzeugt werden also "{{X{{REST}}|..." wobei REST ein Y liefert und der Template name dann wäre. | + | : Hinweis: theoretisch kann Templatename selbst durch Template erzeugt werden also "{{X{{REST}}|..." wobei REST ein Y liefert und der Template name dann wäre. (DIES UNTERSTÜTZEN WIR NICHT!) |
− | + | ||
* Hürde: nächste pipe finden, die nicht in [[]] oder {{}} geschachtelt ist: | * Hürde: nächste pipe finden, die nicht in [[]] oder {{}} geschachtelt ist: | ||
Line 25: | Line 137: | ||
* sowohl parameter name als auch parameter value werden auf beiden Seiten whitespace-trimmed (aber im parameter value, sind returns und blanks signifikant) | * sowohl parameter name als auch parameter value werden auf beiden Seiten whitespace-trimmed (aber im parameter value, sind returns und blanks signifikant) | ||
− | * <nowiki></nowiki> & <!-- --> tags und dessen childs ignorieren | + | * <nowiki><nowiki></nowiki></nowiki> & <nowiki><!-- --></nowiki> tags und dessen childs ignorieren = überspringen |
+ | |||
+ | == parentlead == | ||
+ | : http://biowikifarm.net/testwiki/index.php?title=Nested_Key_Test gibt eine Fehlermeldung. | ||
+ | |||
+ | : Grund ist ziemlich klar, die erst seit einigen Wochen bestehende Möglichkeit von nested Unterschlüsseln. | ||
+ | |||
+ | : Vermutete Lösung: Wenn es ein "parentlead=" value gibt, gelten Regeln für das parsen der LeadID. | ||
+ | |||
+ | : Bei z.B.: | ||
+ | :: <nowiki>{{Lead | parentlead=1 | a1| Statement a | result= Aus bus ssp. ixus}}</nowiki> | ||
+ | :: <nowiki>{{Lead | parentlead=1 | a2| Statement b | b }}</nowiki> | ||
+ | :: <nowiki>{{Lead | parentlead=1 | a3| Statement c | result= Aus bus ssp. ypsilon}}</nowiki> | ||
+ | |||
+ | : Ist die couplet-ID die 1a und die alternative "" bzw "*" | ||
+ | |||
+ | : Die Hauptschwierigkeit ist, dass es naturlich auch 1a gibt, wobei der LeadID Parser dann 1 + a parsen soll. | ||
+ | |||
+ | : Es gibt auch: | ||
+ | |||
+ | :: <nowiki>{{Lead | #1 | Statement a | result= Aus bus ssp. ixus}}</nowiki> | ||
+ | :: <nowiki>{{Lead | #2| Statement b | b }}</nowiki> | ||
+ | :: <nowiki>{{Lead | $1 | Statement c | result= Aus bus ssp. ypsilon}}</nowiki> | ||
+ | :: <nowiki>{{Lead | $2</nowiki> | ||
+ | |||
+ | : Schlüsselnummerierungen | ||
+ | : Vielleicht: | ||
+ | :: WENN links eine Ziffer, dann sind Buchstaben UND XXX als Alternative wegzuparsen, | ||
+ | :: WENN links keine Ziffer (Buchstabe oder auch Symbol!), dann Ziffern UND XXX wegparsen, wobei XXX = *. ', "-" usw. | ||
+ | |||
+ | : Das Parentlead sollte editierbar sein, ist evtl. im HTML-Form noch nicht enthalten. | ||
+ | </nowiki> |