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