http://www.mediawiki.org/wiki/Special:Code/MediaWiki/93729

Revision: 93729
Author:   brion
Date:     2011-08-02 11:49:59 +0000 (Tue, 02 Aug 2011)
Log Message:
-----------
ParserPlayground work in progress on extensions: <references> initial support.

* Need to automate addition of parse rules for tag hook extensions.
* Need to clean up the ref implementation so it does groups and such right :)
* Need to fix links in ref impl

Modified Paths:
--------------
    trunk/extensions/ParserPlayground/modules/ext.cite.taghook.ref.js
    trunk/extensions/ParserPlayground/modules/ext.parserPlayground.js
    trunk/extensions/ParserPlayground/modules/ext.parserPlayground.renderer.js
    trunk/extensions/ParserPlayground/modules/pegParser.pegjs.txt
    trunk/extensions/ParserPlayground/tests/parserTests.js

Modified: trunk/extensions/ParserPlayground/modules/ext.cite.taghook.ref.js
===================================================================
--- trunk/extensions/ParserPlayground/modules/ext.cite.taghook.ref.js   
2011-08-02 11:47:36 UTC (rev 93728)
+++ trunk/extensions/ParserPlayground/modules/ext.cite.taghook.ref.js   
2011-08-02 11:49:59 UTC (rev 93729)
@@ -93,6 +93,11 @@
 };
 
 MWReferencesTagHook = function( env ) {
+       if (!('cite' in env)) {
+               env.cite = {
+                       refGroups: {}
+               };
+       }
        var refGroups = env.cite.refGroups;
        
        var arrow = '↑';
@@ -127,7 +132,7 @@
                out.content.push(' ');
                out.content.push({
                        type: 'placeholder',
-                       content: ref.node.content
+                       content: ref.node.content || []
                });
                return out;
        };
@@ -138,12 +143,13 @@
                }, node.params);
                if (options.group in refGroups) {
                        var group = refGroups[options.group];
+                       var listItems = $.map(group.refs, renderLine);
                        return {
                                type: 'ol',
                                attrs: {
                                        'class': 'references'
                                },
-                               content: $.each(group, renderLine),
+                               content: listItems,
                                origNode: node
                        }
                } else {

Modified: trunk/extensions/ParserPlayground/modules/ext.parserPlayground.js
===================================================================
--- trunk/extensions/ParserPlayground/modules/ext.parserPlayground.js   
2011-08-02 11:47:36 UTC (rev 93728)
+++ trunk/extensions/ParserPlayground/modules/ext.parserPlayground.js   
2011-08-02 11:49:59 UTC (rev 93729)
@@ -126,7 +126,8 @@
                                // hack
                                pp.env = new MWParserEnvironment({
                                        tagHooks: {
-                                               'ref': MWRefTagHook
+                                               'ref': MWRefTagHook,
+                                               'references': 
MWReferencesTagHook
                                        }
                                });
                                if (pp.parser instanceof MediaWikiParser) {

Modified: 
trunk/extensions/ParserPlayground/modules/ext.parserPlayground.renderer.js
===================================================================
--- trunk/extensions/ParserPlayground/modules/ext.parserPlayground.renderer.js  
2011-08-02 11:47:36 UTC (rev 93728)
+++ trunk/extensions/ParserPlayground/modules/ext.parserPlayground.renderer.js  
2011-08-02 11:49:59 UTC (rev 93729)
@@ -121,7 +121,10 @@
                        }
                        break;
                case 'span':
-                       var $span = $('<span>');
+               case 'ol':
+               case 'ul':
+               case 'li':
+                       var $span = $('<' + tree.type + '>');
                        if ('attrs' in tree) {
                                $.map(tree.attrs, function(val, key) {
                                        $span.attr(key, val); // @fixme safety!
@@ -147,73 +150,6 @@
                        var $ext = $('<span>'); // hmmmm
                        subParseArray([transformed], $ext);
                        node = $ext[0];
-                       // @fixme 
-                       /*
-                       if (tree.name == 'ref') {
-                               // Save the reference for later!
-                               // @fixme names etc?
-                               if (self.context.refs === undefined) {
-                                       self.context.refs = [];
-                                       self.context.refsByName = {};
-                               }
-                               var refNum;
-                               var name = extensionAttribute(tree, 'name');
-                               if (name !== null && name in 
self.context.refsByName) {
-                                       // Already seen!
-                                       refNum = self.context.refsByName[name];
-                                       var origRef = self.context.refs[refNum 
- 1];
-                                       if ('content' in tree && tree.content 
&& !('content' in origRef && origRef.content)) {
-                                               // Earlier one was empty; 
replace it with this one.
-                                               self.context.refs[refNum - 1] = 
tree;
-                                       }
-                               } else {
-                                       // New one!
-                                       self.context.refs.push(tree);
-                                       refNum = self.context.refs.length;
-                                       if (name !== null) {
-                                               self.context.refsByName[name] = 
refNum;
-                                       }
-                               }
-
-                               var ref = $('<span class="ref 
parseNode">[</span>');
-                               $('<a></a>')
-                                       .text(refNum + '')
-                                       .attr('src', '#ref-' + refNum)
-                                       .appendTo(ref);
-                               ref.append(']');
-                               node = ref[0];
-                       } else if (tree.name == 'references') {
-                               // Force inline expansion of references with a 
given group
-                               // @fixme support multiple groups etc
-                               var references = $('<ol class="references 
parseNode"></ol>');
-                               var oldRefs = self.context.refs;
-                               self.context.refs = [];
-                               $.each(oldRefs, function(i, subtree) {
-                                       var ref = $('<li class="ref parseNode" 
id="ref-' + i + '"></li>');
-                                       if ('content' in subtree) {
-                                               subParseArray(subtree.content, 
ref);
-                                       }
-                                       ref.data('parseNode', subtree); // 
assign the node for the tree inspector
-                                       if (inspectorMap) {
-                                               inspectorMap.put(subtree, 
ref[0]); // store for reverse lookup
-                                       }
-                                       references.append(ref);
-                               });
-                               node = references[0];
-                       } else if (tree.name == 'cite') {
-                               // Kinda like a ref but inline.
-                               // @fixme validate and output the tag parameters
-                               var cite = $('<span class="cite 
parseNode"></span>');
-                               if ('content' in tree) {
-                                       subParseArray(tree.content, cite);
-                               }
-                               node = cite[0];
-                       } else {
-                               // @fixme unrecognized exts should output as 
text + rendered contents?
-                               callback(null, 'Unrecognized extension in parse 
tree');
-                               return;
-                       }
-                       */
                        break;
                case 'comment':
                        var h = $('<span class="parseNode 
comment"></span>').text('<!--' + tree.text + '-->');

Modified: trunk/extensions/ParserPlayground/modules/pegParser.pegjs.txt
===================================================================
--- trunk/extensions/ParserPlayground/modules/pegParser.pegjs.txt       
2011-08-02 11:47:36 UTC (rev 93728)
+++ trunk/extensions/ParserPlayground/modules/pegParser.pegjs.txt       
2011-08-02 11:49:59 UTC (rev 93729)
@@ -109,7 +109,7 @@
 
 inline_element
   = comment
-  / ref
+  / xmlish_tag
   / extlink
   / template
   / link
@@ -182,7 +182,7 @@
 
 template_param_text_chunk
   = comment
-  / ref
+  / xmlish_tag
   / extlink
   / template
   / link
@@ -237,6 +237,10 @@
   = h:( !italic_marker x:(anything) { return x } )+ { return h.join(''); }
 
 
+xmlish_tag =
+    ref /
+    references
+
 ref = ref_full / ref_empty
 
 /* Can we do backreferences to genericize this? */
@@ -281,6 +285,51 @@
   return a;
 }
 
+/* fixme probably have to programatically add these */
+references = references_full / references_empty
+
+references_full
+  = start:references_start ">" content:references_content* 
close:references_end {
+    return {
+        type: 'ext',
+        name: 'references',
+        params: start.params,
+               ws: start.ws,
+        content: content,
+        close: close
+    }
+}
+
+references_empty
+  = start:references_start close:(space* "/>") {
+    return {
+        type: 'ext',
+        name: 'references',
+               ws: start.ws,
+        params: start.params,
+               close: close
+    }
+}
+
+references_start
+  = "<references" params:ext_param* ws:space* {
+  return {
+       params: params,
+       ws: ws
+  };
+}
+
+references_end
+  = all:("</references" space* ">") {
+  return all.join('');
+}
+
+references_content
+  = !references_end a:inline_element {
+  return a;
+}
+
+
 ext_param
   = space* name:ext_param_name "=" val:ext_param_val {
   val.name = name;

Modified: trunk/extensions/ParserPlayground/tests/parserTests.js
===================================================================
--- trunk/extensions/ParserPlayground/tests/parserTests.js      2011-08-02 
11:47:36 UTC (rev 93728)
+++ trunk/extensions/ParserPlayground/tests/parserTests.js      2011-08-02 
11:49:59 UTC (rev 93729)
@@ -119,7 +119,8 @@
                } else {
                        var environment = new MWParserEnvironment({
                                tagHooks: {
-                                       'ref': MWRefTagHook
+                                       'ref': MWRefTagHook,
+                                       'references': MWReferencesTagHook
                                }
                        });
                        var renderer = new MWTreeRenderer(environment);


_______________________________________________
MediaWiki-CVS mailing list
MediaWiki-CVS@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-cvs

Reply via email to