MediaWiki:Skin/Projekt:Adventure2/parser/raw: Unterschied zwischen den Versionen

aus Kamelopedia, der wüsten Enzyklopädie
Zur Navigation springen Zur Suche springen
(Erster Versuch: ask())
K (Textersetzung - „kamelopedia.mormo.org“ durch „kamelopedia.net“)
 
(5 dazwischenliegende Versionen von einem anderen Benutzer werden nicht angezeigt)
Zeile 6: Zeile 6:
 
   * + Use results cache
 
   * + Use results cache
 
   * + Track line and column
 
   * + Track line and column
 +
  *
 +
  * Put the results here: http://kamelopedia.net/index.php?title=MediaWiki:Skin/Projekt:Adventure2/parser.js&action=edit
 
   */
 
   */
 
   
 
   
Zeile 59: Zeile 61:
 
   / 'page' L v:PageVirtual R {return function(){return !!a2.util.hasVirtual(v);};}
 
   / 'page' L v:PageVirtual R {return function(){return !!a2.util.hasVirtual(v);};}
 
   / 'have' L v:ItemVirtual R {return function(){return !!a2.util.hasVirtual(v);};}
 
   / 'have' L v:ItemVirtual R {return function(){return !!a2.util.hasVirtual(v);};}
 +
  / 'visible' L o:Overlay R {return function(){return $("#overlay_"+o+":visible").length;};}
 +
  / 'timeoutIsSet' L R {return function(){return a2.util.timeoutIsSet();};}
 
   
 
   
 
  ConditionArgs
 
  ConditionArgs
Zeile 76: Zeile 80:
 
   / f:'remove' L i:Item R {return function(real){a2.util.remove(i)};}
 
   / f:'remove' L i:Item R {return function(real){a2.util.remove(i)};}
 
   / f:'print' L s:String R {return function(real){a2.util.print(s)};}
 
   / f:'print' L s:String R {return function(real){a2.util.print(s)};}
   / f:"ask" L s:String C c:StringKwArgClause R {return function(real){a2.print(s,c);};}  
+
   / f:"ask" L s:String C c:StringKwArgClause R {return function(real){a2.util.print(s,c);};}  
 
   / f:'clearTimeout' L R {return function(real){a2.timer.clear();};}
 
   / f:'clearTimeout' L R {return function(real){a2.timer.clear();};}
 
   / f:'showOverlay' L o:Overlay R {return function(real){ $("#overlay_"+o).show();};}
 
   / f:'showOverlay' L o:Overlay R {return function(real){ $("#overlay_"+o).show();};}
Zeile 83: Zeile 87:
 
   / f:'remove' L '${' rt:(TriggerItemOrVirtOp / "combine" / "apply") rn:[12] '}' R {return function(real){if (rt == real[0] && a2.virtualTriggerMap[rt] && a2.virtualTriggerMap[rt][parseInt(rn)-1]) a2.util.remove(real[parseInt(rn)]);};}
 
   / f:'remove' L '${' rt:(TriggerItemOrVirtOp / "combine" / "apply") rn:[12] '}' R {return function(real){if (rt == real[0] && a2.virtualTriggerMap[rt] && a2.virtualTriggerMap[rt][parseInt(rn)-1]) a2.util.remove(real[parseInt(rn)]);};}
 
   / "setTimeout" L t:Time R C a:ActionFunctions {return function(real){a2.timer.set(t, function(){a(real)});};}  
 
   / "setTimeout" L t:Time R C a:ActionFunctions {return function(real){a2.timer.set(t, function(){a(real)});};}  
 +
  / f:'play' L chan:Channel C file:String R {return function(real){a2.audio.play(chan, file)};}
 +
  / f:'stop' L chan:Channel R {return function(real){a2.audio.stop(chan)};}
  
 
  /* PAGES AND ITEMS */
 
  /* PAGES AND ITEMS */
 +
 +
Channel
 +
  = "music" {return "music";}
 +
  / "noise" {return "noise";}
 +
  / "background" {return "background";}
  
 
  PageDec
 
  PageDec

Aktuelle Version vom 31. Dezember 2013, 02:10 Uhr

/*
 * A2 event syntax parser using pegjs
 * http://pegjs.majda.cz/online
 *
 * Parser variable: a2.parser
 * + Use results cache
 * + Track line and column
 *
 * Put the results here: http://kamelopedia.net/index.php?title=MediaWiki:Skin/Projekt:Adventure2/parser.js&action=edit
 */

start
  = S? d:Declaration* {return d;}
Declaration
  = EventDec
  / PageDec
  / ItemDec
/* EVENTS */
EventDec
  = S? 'event' n:(S Identifier)? CC
    tr:TriggerClause
    co:ConditionClause?
    ac:ActionClause?
    End S? { return ["event", {name:n?n[1]:":anonymous:", trigger:tr, condition:(co?co:function(){return true;}), action:(ac?ac:function(){return true;})}]; }

TriggerClause
  = 'on' S S? tr:TriggerFunctions CC {return tr;}

TriggerFunctions
  = t:TriggerFunction C o:TriggerFunctions {o.push(t); return o;}
  / t:TriggerFunction {return [t];}

TriggerFunction
  = t:TriggerPageOrVirtOp L a:(Page/PageVirtual) R {return t+"."+a;}
  / t:TriggerItemOrVirtOp L a:(Item/ItemVirtual) R {return t+"."+a;}
  / t:"click" L a:Identifier R {return t+"."+a;}
  / t:"combine" L a:(Item/ItemVirtual) C b:(Item/ItemVirtual) R {return [t,a,b].join(".")}
  / t:"apply" L a:(Item/ItemVirtual) C b:Identifier R {return [t,a,b].join(".")}

TriggerPageOrVirtOp
  = 'enter'
  / 'leave'
TriggerItemOrVirtOp
  = 'add'
  / 'remove'
  / 'activate'

ConditionClause
  = 'if' S co:ConditionFunction CC {return co;}

ConditionFunction
  = 'page' L p:Page R {return function(){return a2.cpage == p};}
  / 'any' L a:ConditionArgs R {return function(){for(var j=0; j<a.length; j++) if (a[j]()) return true; return false; }}
  / 'all' L a:ConditionArgs R {return function(){for(var j=0; j<a.length; j++) if (!a[j]()) return false; return true; }}
  / 'not' L f:ConditionFunction R {return function(){ return !f()};}
  / 'have' L i:Item R {return function(){return !!a2.items[i]};}
  / 'page' L v:PageVirtual R {return function(){return !!a2.util.hasVirtual(v);};}
  / 'have' L v:ItemVirtual R {return function(){return !!a2.util.hasVirtual(v);};}
  / 'visible' L o:Overlay R {return function(){return $("#overlay_"+o+":visible").length;};}
  / 'timeoutIsSet' L R {return function(){return a2.util.timeoutIsSet();};}

ConditionArgs
  = f:ConditionFunction C a:ConditionArgs {a.push(f); return a;}
  / f:ConditionFunction {return [f];}

ActionClause
  = 'do' S ac:ActionFunctions CC {return ac;}

ActionFunctions
  = f:ActionFunction C a:ActionFunctions {return function(real){f(real); a(real);};}
  / ActionFunction
ActionFunction
  = f:'goto' L p:Page R {return function(real){a2.util.goto(p)};}
  / f:'add' L i:Item R {return function(real){a2.util.add(i)};}
  / f:'remove' L i:Item R {return function(real){a2.util.remove(i)};}
  / f:'print' L s:String R {return function(real){a2.util.print(s)};}
  / f:"ask" L s:String C c:StringKwArgClause R {return function(real){a2.util.print(s,c);};} 
  / f:'clearTimeout' L R {return function(real){a2.timer.clear();};}
  / f:'showOverlay' L o:Overlay R {return function(real){ $("#overlay_"+o).show();};}
  / f:'hideOverlay' L o:Overlay R {return function(real){ $("#overlay_"+o).hide();};}
  / f:'remove' L i:ItemVirtual R {return function(real){a2.util.removeAll(i)};}
  / f:'remove' L '${' rt:(TriggerItemOrVirtOp / "combine" / "apply") rn:[12] '}' R {return function(real){if (rt == real[0] && a2.virtualTriggerMap[rt] && a2.virtualTriggerMap[rt][parseInt(rn)-1]) a2.util.remove(real[parseInt(rn)]);};}
  / "setTimeout" L t:Time R C a:ActionFunctions {return function(real){a2.timer.set(t, function(){a(real)});};} 
  / f:'play' L chan:Channel C file:String R {return function(real){a2.audio.play(chan, file)};}
  / f:'stop' L chan:Channel R {return function(real){a2.audio.stop(chan)};}
/* PAGES AND ITEMS */
Channel
  = "music" {return "music";}
  / "noise" {return "noise";}
  / "background" {return "background";}
PageDec
  = "page" CC
    pv:PageVirtualClause?
    End {return ["page", {virt:pv}];}
PageVirtualClause
  = "provides" S v:PageVirtualList CC {return v;}
PageVirtualList
  = v:PageVirtual C vl:PageVirtualList {vl.push(v); return vl;}
  / v:PageVirtual {return [v];}
ItemDec
  = "item" CC
    t:TitleClause?
    iv:ItemVirtualClause?
    End {return ["item", {virt:iv, title:t}];}
TitleClause
  = "title" S s:String CC {return s;}
ItemVirtualClause
  = "provides" S v:ItemVirtualList CC {return v;}
ItemVirtualList
  = v:ItemVirtual C vl:ItemVirtualList {vl.push(v); return vl;}
  / v:ItemVirtual {return [v];}
StringKwArgClause
  = k:StringKwArg C r:StringKwArgClause {return [k].concat(r); }
  / k:StringKwArg { return [k]; }
StringKwArg
  = i:Identifier S? '=' S? s:String {return [i,s];}
/* UTILITIES */

L
  = S? '(' S?

R
  = S? ')' S?

C
  = S? ',' S?

CC
  = S? ';' S?

Identifier
  = i1:[a-zäöü_] i2:[a-zäöü_]* {return i1+i2.join("");}

PageVirtual
  = p:"@" i:Identifier {return p+i;}
ItemVirtual
  = p:":" i:Identifier {return p+i;}
Page
  = p:[0-9]+ {return p.join("");}
Time
  = p:[1-9] q:[0-9]* {return parseInt(p+q.join(""));}

Item
  = Identifier
Overlay
  = p:[a-z]+ {return p.join("");}

S
  = [ \t\n]* "/*" ([^*] / [*][^/] )* "*/" S?
  / [ \t\n]* "//" [^\n]* S?
  / [ \t\n]+

String
  = "'" s:SingleStringChar* "'" { return s.join("");}
  / '"' s:DoubleStringChar* '"' { return s.join("");}
SingleStringChar
  = EscapeSequence
  / [^']
DoubleStringChar
  = EscapeSequence
  / [^"]


EscapeSequence
  = "\\n" {return "\n";}
  / "\\\"" {return '"';}
  / "\\\'" {return "'";}
End
  = "end" S? "." S?