2013-03-26 00:40:20 +00:00
|
|
|
/* ----------------------------------------------------------------------
|
|
|
|
* This file implements <ref> and <references> extension tag handling
|
|
|
|
* natively in Parsoid.
|
|
|
|
* ---------------------------------------------------------------------- */
|
2012-10-30 00:51:07 +00:00
|
|
|
"use strict";
|
|
|
|
|
Extension handling rewrite + cite extension refactoring.
Tokenization
------------
* Fixed tokenizer to correctly parse extension tags in different
contexts: with start and end tags, in self-closing tag mode,
and to correctly handle scenarios when the exension end-tag is
followed by a '#' (the special char used to skip over extension
content).
* Removed the distinction in the tokenizer between installed
extensions and natively supported extension tags (<ref> and
<references> for ex.). They all tokenize and get processed
identically and get handled by different paths in the extension
handler.
* Template and TemplateArg tokens now carry tpl. transclusion
source alongwith them since tsr information will not be
accurate when they show up in extension contexts that in turn
showed up in template context that were expanded by the php
preprocessor.
Ex: {{echo|<ref>{{echo|foo}}</ref>}}
The tsr for the ref-tag will correspond to the
template-source of the echo-template, NOT the original top-level
page. So, env.page.src.substring(..) will return incorrect
source for the innermost {{echo|foo}}. This fix of carrying
along tpl transclusion source in the token itself eliminates
this problem.
Knowledge of native extensions
------------------------------
* Natively implemented extension tags (<ref> and <references>)
are hardcoded in env.conf.parsoid. At some point, it would
be good to have a registration mechanism for parsoid-native
extensions.
Extension handling
------------------
* Extracted extension handling out of the template handler into
its own handler class. Right now, this class inherits from the
template handler in order to be able to reuse a lot of the
expansion and encapsulation functionality currently in the
Template Handler.
* This handler now handles extensions that are:
(a) natively implemented and registered with Parsoid.
(b) implemented as a PHP extension and expanded by relying on
the PHP preprocessor.
For (a), it uses information from env.conf.parsoid to find
ext-handlers for natively implemented ext-tags. However, this
can be cleaned up at some point by making available a registration
mechanism.
Cite/Ref/References
-------------------
* Reworked the cite handler to split up ref-token processing
and references token processing.
* The handler now processes ref-tokens, parses content all
the way to html output and encapsulates the html in an
attribute of a meta-token that serves as a placeholder for
where the ref-token occured.
* References are handled as a DOM post-pass where these meta
placeholder tokens are collected, content extracted from
the attribute and spit out at the site of a references tag.
The DOM walking is in DOMPostProcessor.js, but the actual
processing is part of the Cite.js to keep all cite extension
handling code in one place.
Parser pipeline
---------------
* Restructured parser pipeline recipes based on changes to Cite,
TemplateHandler, and ExtensionHandler.
* Added a couple functions to the parser pipeline:
1. resetState to reset state before starting a new top-level parse
when pipelines are reused across top-level parses (ex: parser
tests)
2. setSourceOffsets to set start/end offsets of the source being
handled by the pipeline. This is required to correctly set tsr
values when extension content (which is a substring of original
top-level text) is parsed in its own pipeline.
Other fixes
-----------
* Removed env parameter from the Params object since it was not
being used and seemed like unnecessary state propagation.
* Removed a FIXME in DOMUtils.buildTokensFromDOM by reusing code
in the tokenizer that converts "\n" in text to NlTks.
* Cleanup of Util.shiftTokenTSR.
* ext.util.TokenCollection is now no longer used by anything.
Added a FIXME and left around in case we are able to improve
tokenizing and handling of *include* tags that can eliminate the
need for the messy TokenAndAttrCollector.
Test results
------------
* No change in parser tests results.
* Tested with a few different files.
- en:BO page seems to be parsed about 10% faster than before
(needs verification).
- Referencs on the en:BO page seem to be more accurate than
before.
Change-Id: I8a095fa9fa976c7b3a2a4bd968dc9db4270b105f
2013-03-09 00:07:59 +00:00
|
|
|
var Util = require( './mediawiki.Util.js' ).Util,
|
2013-05-02 16:17:08 +00:00
|
|
|
DU = require( './mediawiki.DOMUtils.js').DOMUtils,
|
2013-04-22 19:51:09 +00:00
|
|
|
defines = require('./mediawiki.parser.defines.js'),
|
2013-02-15 21:25:14 +00:00
|
|
|
$ = require( './fakejquery' );
|
2013-05-02 16:17:08 +00:00
|
|
|
|
2013-04-22 19:51:09 +00:00
|
|
|
// define some constructor shortcuts
|
|
|
|
var KV = defines.KV,
|
2013-04-25 13:43:49 +00:00
|
|
|
SelfclosingTagTk = defines.SelfclosingTagTk;
|
2012-05-03 11:05:28 +00:00
|
|
|
|
2013-03-26 00:40:20 +00:00
|
|
|
// FIXME: Move out to some common helper file?
|
|
|
|
// Helper function to process extension source
|
|
|
|
function processExtSource(manager, extToken, opts) {
|
|
|
|
var extSrc = extToken.getAttribute('source'),
|
|
|
|
tagWidths = extToken.dataAttribs.tagWidths,
|
|
|
|
content = extSrc.substring(tagWidths[0], extSrc.length - tagWidths[1]);
|
|
|
|
|
|
|
|
// FIXME: Should this be specific to the extension
|
|
|
|
// or is it okay to do this unconditionally for all?
|
|
|
|
// Right now, this code is run only for ref and references,
|
|
|
|
// so not a real problem, but if this is used on other extensions,
|
|
|
|
// requires addressing.
|
|
|
|
//
|
|
|
|
// Strip white-space only lines
|
|
|
|
var wsMatch = content.match(/^((?:\s*\n)?)((?:.|\n)*)$/),
|
|
|
|
leadingWS = wsMatch[1];
|
|
|
|
|
|
|
|
// Update content to normalized form
|
|
|
|
content = wsMatch[2];
|
|
|
|
|
|
|
|
if (!content || content.length === 0) {
|
|
|
|
opts.emptyContentCB(opts.res);
|
|
|
|
} else {
|
|
|
|
// Pass an async signal since the ext-content is not processed completely.
|
|
|
|
opts.parentCB({tokens: opts.res, async: true});
|
|
|
|
|
|
|
|
// Pipeline for processing ext-content
|
|
|
|
var pipeline = manager.pipeFactory.getPipeline(
|
|
|
|
opts.pipelineType,
|
|
|
|
Util.extendProps({}, opts.pipelineOpts, {
|
|
|
|
wrapTemplates: true,
|
|
|
|
// SSS FIXME: Doesn't seem right.
|
|
|
|
// Should this be the default in all cases?
|
|
|
|
inBlockToken: true
|
|
|
|
})
|
|
|
|
);
|
|
|
|
|
|
|
|
// Set source offsets for this pipeline's content
|
|
|
|
var tsr = extToken.dataAttribs.tsr;
|
|
|
|
pipeline.setSourceOffsets(tsr[0]+tagWidths[0]+leadingWS.length, tsr[1]-tagWidths[1]);
|
|
|
|
|
|
|
|
// Set up provided callbacks
|
|
|
|
if (opts.chunkCB) {
|
|
|
|
pipeline.addListener('chunk', opts.chunkCB);
|
|
|
|
}
|
|
|
|
if (opts.endCB) {
|
|
|
|
pipeline.addListener('end', opts.endCB);
|
|
|
|
}
|
|
|
|
if (opts.documentCB) {
|
|
|
|
pipeline.addListener('document', opts.documentCB);
|
|
|
|
}
|
|
|
|
|
|
|
|
// Off the starting block ... ready, set, go!
|
|
|
|
pipeline.process(content);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-12-13 14:48:47 +00:00
|
|
|
/**
|
2013-03-26 00:40:20 +00:00
|
|
|
* Simple token transform version of the Ref extension tag
|
2011-12-13 14:48:47 +00:00
|
|
|
*
|
2011-12-13 18:45:09 +00:00
|
|
|
* @class
|
|
|
|
* @constructor
|
2011-12-13 14:48:47 +00:00
|
|
|
*/
|
2013-03-26 00:40:20 +00:00
|
|
|
function Ref(cite) {
|
|
|
|
this.cite = cite;
|
|
|
|
this.reset();
|
2011-12-13 14:48:47 +00:00
|
|
|
}
|
|
|
|
|
Extension handling rewrite + cite extension refactoring.
Tokenization
------------
* Fixed tokenizer to correctly parse extension tags in different
contexts: with start and end tags, in self-closing tag mode,
and to correctly handle scenarios when the exension end-tag is
followed by a '#' (the special char used to skip over extension
content).
* Removed the distinction in the tokenizer between installed
extensions and natively supported extension tags (<ref> and
<references> for ex.). They all tokenize and get processed
identically and get handled by different paths in the extension
handler.
* Template and TemplateArg tokens now carry tpl. transclusion
source alongwith them since tsr information will not be
accurate when they show up in extension contexts that in turn
showed up in template context that were expanded by the php
preprocessor.
Ex: {{echo|<ref>{{echo|foo}}</ref>}}
The tsr for the ref-tag will correspond to the
template-source of the echo-template, NOT the original top-level
page. So, env.page.src.substring(..) will return incorrect
source for the innermost {{echo|foo}}. This fix of carrying
along tpl transclusion source in the token itself eliminates
this problem.
Knowledge of native extensions
------------------------------
* Natively implemented extension tags (<ref> and <references>)
are hardcoded in env.conf.parsoid. At some point, it would
be good to have a registration mechanism for parsoid-native
extensions.
Extension handling
------------------
* Extracted extension handling out of the template handler into
its own handler class. Right now, this class inherits from the
template handler in order to be able to reuse a lot of the
expansion and encapsulation functionality currently in the
Template Handler.
* This handler now handles extensions that are:
(a) natively implemented and registered with Parsoid.
(b) implemented as a PHP extension and expanded by relying on
the PHP preprocessor.
For (a), it uses information from env.conf.parsoid to find
ext-handlers for natively implemented ext-tags. However, this
can be cleaned up at some point by making available a registration
mechanism.
Cite/Ref/References
-------------------
* Reworked the cite handler to split up ref-token processing
and references token processing.
* The handler now processes ref-tokens, parses content all
the way to html output and encapsulates the html in an
attribute of a meta-token that serves as a placeholder for
where the ref-token occured.
* References are handled as a DOM post-pass where these meta
placeholder tokens are collected, content extracted from
the attribute and spit out at the site of a references tag.
The DOM walking is in DOMPostProcessor.js, but the actual
processing is part of the Cite.js to keep all cite extension
handling code in one place.
Parser pipeline
---------------
* Restructured parser pipeline recipes based on changes to Cite,
TemplateHandler, and ExtensionHandler.
* Added a couple functions to the parser pipeline:
1. resetState to reset state before starting a new top-level parse
when pipelines are reused across top-level parses (ex: parser
tests)
2. setSourceOffsets to set start/end offsets of the source being
handled by the pipeline. This is required to correctly set tsr
values when extension content (which is a substring of original
top-level text) is parsed in its own pipeline.
Other fixes
-----------
* Removed env parameter from the Params object since it was not
being used and seemed like unnecessary state propagation.
* Removed a FIXME in DOMUtils.buildTokensFromDOM by reusing code
in the tokenizer that converts "\n" in text to NlTks.
* Cleanup of Util.shiftTokenTSR.
* ext.util.TokenCollection is now no longer used by anything.
Added a FIXME and left around in case we are able to improve
tokenizing and handling of *include* tags that can eliminate the
need for the messy TokenAndAttrCollector.
Test results
------------
* No change in parser tests results.
* Tested with a few different files.
- en:BO page seems to be parsed about 10% faster than before
(needs verification).
- Referencs on the en:BO page seem to be more accurate than
before.
Change-Id: I8a095fa9fa976c7b3a2a4bd968dc9db4270b105f
2013-03-09 00:07:59 +00:00
|
|
|
/**
|
|
|
|
* Reset state before each top-level parse -- this lets us share a pipeline
|
|
|
|
* to parse unrelated pages.
|
|
|
|
*/
|
2013-04-24 19:09:08 +00:00
|
|
|
Ref.prototype.reset = function() { };
|
2012-11-16 18:03:01 +00:00
|
|
|
|
2011-12-13 18:45:09 +00:00
|
|
|
/**
|
Extension handling rewrite + cite extension refactoring.
Tokenization
------------
* Fixed tokenizer to correctly parse extension tags in different
contexts: with start and end tags, in self-closing tag mode,
and to correctly handle scenarios when the exension end-tag is
followed by a '#' (the special char used to skip over extension
content).
* Removed the distinction in the tokenizer between installed
extensions and natively supported extension tags (<ref> and
<references> for ex.). They all tokenize and get processed
identically and get handled by different paths in the extension
handler.
* Template and TemplateArg tokens now carry tpl. transclusion
source alongwith them since tsr information will not be
accurate when they show up in extension contexts that in turn
showed up in template context that were expanded by the php
preprocessor.
Ex: {{echo|<ref>{{echo|foo}}</ref>}}
The tsr for the ref-tag will correspond to the
template-source of the echo-template, NOT the original top-level
page. So, env.page.src.substring(..) will return incorrect
source for the innermost {{echo|foo}}. This fix of carrying
along tpl transclusion source in the token itself eliminates
this problem.
Knowledge of native extensions
------------------------------
* Natively implemented extension tags (<ref> and <references>)
are hardcoded in env.conf.parsoid. At some point, it would
be good to have a registration mechanism for parsoid-native
extensions.
Extension handling
------------------
* Extracted extension handling out of the template handler into
its own handler class. Right now, this class inherits from the
template handler in order to be able to reuse a lot of the
expansion and encapsulation functionality currently in the
Template Handler.
* This handler now handles extensions that are:
(a) natively implemented and registered with Parsoid.
(b) implemented as a PHP extension and expanded by relying on
the PHP preprocessor.
For (a), it uses information from env.conf.parsoid to find
ext-handlers for natively implemented ext-tags. However, this
can be cleaned up at some point by making available a registration
mechanism.
Cite/Ref/References
-------------------
* Reworked the cite handler to split up ref-token processing
and references token processing.
* The handler now processes ref-tokens, parses content all
the way to html output and encapsulates the html in an
attribute of a meta-token that serves as a placeholder for
where the ref-token occured.
* References are handled as a DOM post-pass where these meta
placeholder tokens are collected, content extracted from
the attribute and spit out at the site of a references tag.
The DOM walking is in DOMPostProcessor.js, but the actual
processing is part of the Cite.js to keep all cite extension
handling code in one place.
Parser pipeline
---------------
* Restructured parser pipeline recipes based on changes to Cite,
TemplateHandler, and ExtensionHandler.
* Added a couple functions to the parser pipeline:
1. resetState to reset state before starting a new top-level parse
when pipelines are reused across top-level parses (ex: parser
tests)
2. setSourceOffsets to set start/end offsets of the source being
handled by the pipeline. This is required to correctly set tsr
values when extension content (which is a substring of original
top-level text) is parsed in its own pipeline.
Other fixes
-----------
* Removed env parameter from the Params object since it was not
being used and seemed like unnecessary state propagation.
* Removed a FIXME in DOMUtils.buildTokensFromDOM by reusing code
in the tokenizer that converts "\n" in text to NlTks.
* Cleanup of Util.shiftTokenTSR.
* ext.util.TokenCollection is now no longer used by anything.
Added a FIXME and left around in case we are able to improve
tokenizing and handling of *include* tags that can eliminate the
need for the messy TokenAndAttrCollector.
Test results
------------
* No change in parser tests results.
* Tested with a few different files.
- en:BO page seems to be parsed about 10% faster than before
(needs verification).
- Referencs on the en:BO page seem to be more accurate than
before.
Change-Id: I8a095fa9fa976c7b3a2a4bd968dc9db4270b105f
2013-03-09 00:07:59 +00:00
|
|
|
* Handle ref tokens
|
2011-12-13 18:45:09 +00:00
|
|
|
*/
|
2013-03-26 00:40:20 +00:00
|
|
|
Ref.prototype.handleRef = function ( manager, pipelineOpts, refTok, cb ) {
|
|
|
|
|
2013-04-24 19:09:08 +00:00
|
|
|
var inReferencesExt = pipelineOpts.extTag === "references",
|
2013-03-26 00:40:20 +00:00
|
|
|
refOpts = $.extend({ name: null, group: null }, Util.KVtoHash(refTok.getAttribute("options"))),
|
2013-04-24 19:09:08 +00:00
|
|
|
about = inReferencesExt ? '' : "#" + manager.env.newObjectId(),
|
|
|
|
finalCB = function(toks, content) {
|
|
|
|
// Marker meta with ref content
|
|
|
|
var da = Util.clone(refTok.dataAttribs);
|
|
|
|
// Clear stx='html' so that sanitizer doesn't barf
|
|
|
|
da.stx = undefined;
|
2012-09-17 19:46:44 +00:00
|
|
|
|
2013-03-26 00:40:20 +00:00
|
|
|
toks.push(new SelfclosingTagTk( 'meta', [
|
2013-04-24 19:09:08 +00:00
|
|
|
new KV('typeof', 'mw:Ext/Ref/Marker'),
|
2013-03-26 00:40:20 +00:00
|
|
|
new KV('about', about),
|
|
|
|
new KV('group', refOpts.group || ''),
|
|
|
|
new KV('name', refOpts.name || ''),
|
|
|
|
new KV('content', content || ''),
|
2013-04-24 19:09:08 +00:00
|
|
|
new KV('skiplinkback', inReferencesExt ? 1 : 0)
|
|
|
|
], da));
|
2012-11-16 23:36:07 +00:00
|
|
|
|
2013-03-26 00:40:20 +00:00
|
|
|
// All done!
|
|
|
|
cb({tokens: toks, async: false});
|
|
|
|
};
|
2012-11-16 23:36:07 +00:00
|
|
|
|
2013-03-26 00:40:20 +00:00
|
|
|
processExtSource(manager, refTok, {
|
Extension handling rewrite + cite extension refactoring.
Tokenization
------------
* Fixed tokenizer to correctly parse extension tags in different
contexts: with start and end tags, in self-closing tag mode,
and to correctly handle scenarios when the exension end-tag is
followed by a '#' (the special char used to skip over extension
content).
* Removed the distinction in the tokenizer between installed
extensions and natively supported extension tags (<ref> and
<references> for ex.). They all tokenize and get processed
identically and get handled by different paths in the extension
handler.
* Template and TemplateArg tokens now carry tpl. transclusion
source alongwith them since tsr information will not be
accurate when they show up in extension contexts that in turn
showed up in template context that were expanded by the php
preprocessor.
Ex: {{echo|<ref>{{echo|foo}}</ref>}}
The tsr for the ref-tag will correspond to the
template-source of the echo-template, NOT the original top-level
page. So, env.page.src.substring(..) will return incorrect
source for the innermost {{echo|foo}}. This fix of carrying
along tpl transclusion source in the token itself eliminates
this problem.
Knowledge of native extensions
------------------------------
* Natively implemented extension tags (<ref> and <references>)
are hardcoded in env.conf.parsoid. At some point, it would
be good to have a registration mechanism for parsoid-native
extensions.
Extension handling
------------------
* Extracted extension handling out of the template handler into
its own handler class. Right now, this class inherits from the
template handler in order to be able to reuse a lot of the
expansion and encapsulation functionality currently in the
Template Handler.
* This handler now handles extensions that are:
(a) natively implemented and registered with Parsoid.
(b) implemented as a PHP extension and expanded by relying on
the PHP preprocessor.
For (a), it uses information from env.conf.parsoid to find
ext-handlers for natively implemented ext-tags. However, this
can be cleaned up at some point by making available a registration
mechanism.
Cite/Ref/References
-------------------
* Reworked the cite handler to split up ref-token processing
and references token processing.
* The handler now processes ref-tokens, parses content all
the way to html output and encapsulates the html in an
attribute of a meta-token that serves as a placeholder for
where the ref-token occured.
* References are handled as a DOM post-pass where these meta
placeholder tokens are collected, content extracted from
the attribute and spit out at the site of a references tag.
The DOM walking is in DOMPostProcessor.js, but the actual
processing is part of the Cite.js to keep all cite extension
handling code in one place.
Parser pipeline
---------------
* Restructured parser pipeline recipes based on changes to Cite,
TemplateHandler, and ExtensionHandler.
* Added a couple functions to the parser pipeline:
1. resetState to reset state before starting a new top-level parse
when pipelines are reused across top-level parses (ex: parser
tests)
2. setSourceOffsets to set start/end offsets of the source being
handled by the pipeline. This is required to correctly set tsr
values when extension content (which is a substring of original
top-level text) is parsed in its own pipeline.
Other fixes
-----------
* Removed env parameter from the Params object since it was not
being used and seemed like unnecessary state propagation.
* Removed a FIXME in DOMUtils.buildTokensFromDOM by reusing code
in the tokenizer that converts "\n" in text to NlTks.
* Cleanup of Util.shiftTokenTSR.
* ext.util.TokenCollection is now no longer used by anything.
Added a FIXME and left around in case we are able to improve
tokenizing and handling of *include* tags that can eliminate the
need for the messy TokenAndAttrCollector.
Test results
------------
* No change in parser tests results.
* Tested with a few different files.
- en:BO page seems to be parsed about 10% faster than before
(needs verification).
- Referencs on the en:BO page seem to be more accurate than
before.
Change-Id: I8a095fa9fa976c7b3a2a4bd968dc9db4270b105f
2013-03-09 00:07:59 +00:00
|
|
|
// Full pipeline for processing ref-content
|
2013-03-26 00:40:20 +00:00
|
|
|
pipelineType: 'text/x-mediawiki/full',
|
|
|
|
pipelineOpts: {
|
2013-05-02 16:17:08 +00:00
|
|
|
extTag: "ref"
|
2013-03-26 00:40:20 +00:00
|
|
|
},
|
2013-04-24 19:09:08 +00:00
|
|
|
res: [],
|
2013-03-26 00:40:20 +00:00
|
|
|
parentCB: cb,
|
|
|
|
emptyContentCB: finalCB,
|
|
|
|
documentCB: function(refContentDoc) {
|
|
|
|
finalCB([], refContentDoc.body.innerHTML);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
};
|
2012-11-29 20:09:06 +00:00
|
|
|
|
2013-04-24 19:09:08 +00:00
|
|
|
/**
|
|
|
|
* Helper class used by <references> implementation
|
|
|
|
*/
|
|
|
|
function RefGroup(group) {
|
|
|
|
this.name = group || '';
|
|
|
|
this.refs = [];
|
|
|
|
this.indexByName = {};
|
|
|
|
}
|
|
|
|
|
2013-05-02 16:17:08 +00:00
|
|
|
RefGroup.prototype.add = function(refName, about, skipLinkback) {
|
2013-04-24 19:09:08 +00:00
|
|
|
var ref;
|
|
|
|
if (refName && this.indexByName[refName]) {
|
|
|
|
ref = this.indexByName[refName];
|
|
|
|
} else {
|
|
|
|
var n = this.refs.length,
|
|
|
|
refKey = (1+n) + '';
|
|
|
|
|
|
|
|
if (refName) {
|
|
|
|
refKey = refName + '-' + refKey;
|
|
|
|
}
|
|
|
|
|
|
|
|
ref = {
|
2013-05-02 16:17:08 +00:00
|
|
|
about: about,
|
2013-04-24 19:09:08 +00:00
|
|
|
content: null,
|
|
|
|
group: this.name,
|
2013-05-02 16:17:08 +00:00
|
|
|
groupIndex: (1+n), // FIXME -- this seems to be wiki-specific
|
|
|
|
index: n,
|
2013-04-24 19:09:08 +00:00
|
|
|
key: refKey,
|
2013-05-02 16:17:08 +00:00
|
|
|
linkbacks: [],
|
|
|
|
name: refName,
|
|
|
|
target: 'cite_note-' + refKey
|
2013-04-24 19:09:08 +00:00
|
|
|
};
|
|
|
|
this.refs[n] = ref;
|
|
|
|
if (refName) {
|
|
|
|
this.indexByName[refName] = ref;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!skipLinkback) {
|
|
|
|
ref.linkbacks.push('cite_ref-' + ref.key + '-' + ref.linkbacks.length);
|
|
|
|
}
|
|
|
|
|
|
|
|
return ref;
|
|
|
|
};
|
|
|
|
|
|
|
|
RefGroup.prototype.renderLine = function(refsList, ref) {
|
|
|
|
var ownerDoc = refsList.ownerDocument,
|
|
|
|
arrow = ownerDoc.createTextNode('↑'),
|
|
|
|
li, a;
|
|
|
|
|
2013-05-02 16:17:08 +00:00
|
|
|
// Generate the li and set ref content first, so the HTML gets parsed.
|
2013-04-24 19:09:08 +00:00
|
|
|
// We then append the rest of the ref nodes before the first node
|
2013-05-02 16:17:08 +00:00
|
|
|
li = ownerDoc.createElement('li');
|
|
|
|
DU.addAttributes(li, {
|
|
|
|
'about': "#" + ref.target,
|
|
|
|
'id': ref.target
|
|
|
|
});
|
2013-04-24 19:09:08 +00:00
|
|
|
li.innerHTML = ref.content;
|
2013-05-02 16:17:08 +00:00
|
|
|
|
|
|
|
// If ref-content has block nodes, wrap it in a div, else in a span
|
|
|
|
var contentNode = ownerDoc.createElement(DU.hasBlockContent(li) ? 'div' : 'span');
|
|
|
|
|
|
|
|
// Move all children from li to contentNode
|
|
|
|
DU.migrateChildren(li, contentNode);
|
|
|
|
li.appendChild(contentNode);
|
|
|
|
|
|
|
|
// 'mw:referencedBy' span wrapper
|
|
|
|
var span = ownerDoc.createElement('span');
|
|
|
|
span.setAttribute('rel', 'mw:referencedBy');
|
|
|
|
li.insertBefore(span, contentNode);
|
2013-04-24 19:09:08 +00:00
|
|
|
|
|
|
|
// Generate leading linkbacks
|
|
|
|
if (ref.linkbacks.length === 1) {
|
|
|
|
a = ownerDoc.createElement('a');
|
2013-05-02 16:17:08 +00:00
|
|
|
DU.addAttributes(a, {
|
|
|
|
'href': '#' + ref.linkbacks[0]
|
|
|
|
});
|
2013-04-24 19:09:08 +00:00
|
|
|
a.appendChild(arrow);
|
2013-05-02 16:17:08 +00:00
|
|
|
span.appendChild(a);
|
|
|
|
|
|
|
|
// Space between span-wrapper and content node
|
2013-04-24 19:09:08 +00:00
|
|
|
li.insertBefore(ownerDoc.createTextNode(' '), contentNode);
|
|
|
|
} else {
|
2013-05-02 16:17:08 +00:00
|
|
|
span.appendChild(arrow);
|
2013-04-24 19:09:08 +00:00
|
|
|
$.each(ref.linkbacks, function(i, linkback) {
|
|
|
|
a = ownerDoc.createElement('a');
|
2013-05-02 16:17:08 +00:00
|
|
|
DU.addAttributes(a, {
|
|
|
|
'href': '#' + ref.linkbacks[i]
|
|
|
|
});
|
2013-04-24 19:09:08 +00:00
|
|
|
a.appendChild(ownerDoc.createTextNode(ref.groupIndex + '.' + i));
|
|
|
|
// Separate linkbacks with a space
|
2013-05-02 16:17:08 +00:00
|
|
|
span.appendChild(ownerDoc.createTextNode(' '));
|
|
|
|
span.appendChild(a);
|
2013-04-24 19:09:08 +00:00
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
// Add it to the ref list
|
|
|
|
refsList.appendChild(li);
|
|
|
|
};
|
|
|
|
|
2013-03-26 00:40:20 +00:00
|
|
|
function References(cite) {
|
|
|
|
this.cite = cite;
|
|
|
|
this.reset();
|
|
|
|
}
|
|
|
|
|
2013-04-24 19:09:08 +00:00
|
|
|
References.prototype.reset = function(group) {
|
|
|
|
if (group) {
|
|
|
|
this.refGroups[group] = undefined;
|
|
|
|
} else {
|
|
|
|
this.refGroups = {};
|
|
|
|
}
|
Extension handling rewrite + cite extension refactoring.
Tokenization
------------
* Fixed tokenizer to correctly parse extension tags in different
contexts: with start and end tags, in self-closing tag mode,
and to correctly handle scenarios when the exension end-tag is
followed by a '#' (the special char used to skip over extension
content).
* Removed the distinction in the tokenizer between installed
extensions and natively supported extension tags (<ref> and
<references> for ex.). They all tokenize and get processed
identically and get handled by different paths in the extension
handler.
* Template and TemplateArg tokens now carry tpl. transclusion
source alongwith them since tsr information will not be
accurate when they show up in extension contexts that in turn
showed up in template context that were expanded by the php
preprocessor.
Ex: {{echo|<ref>{{echo|foo}}</ref>}}
The tsr for the ref-tag will correspond to the
template-source of the echo-template, NOT the original top-level
page. So, env.page.src.substring(..) will return incorrect
source for the innermost {{echo|foo}}. This fix of carrying
along tpl transclusion source in the token itself eliminates
this problem.
Knowledge of native extensions
------------------------------
* Natively implemented extension tags (<ref> and <references>)
are hardcoded in env.conf.parsoid. At some point, it would
be good to have a registration mechanism for parsoid-native
extensions.
Extension handling
------------------
* Extracted extension handling out of the template handler into
its own handler class. Right now, this class inherits from the
template handler in order to be able to reuse a lot of the
expansion and encapsulation functionality currently in the
Template Handler.
* This handler now handles extensions that are:
(a) natively implemented and registered with Parsoid.
(b) implemented as a PHP extension and expanded by relying on
the PHP preprocessor.
For (a), it uses information from env.conf.parsoid to find
ext-handlers for natively implemented ext-tags. However, this
can be cleaned up at some point by making available a registration
mechanism.
Cite/Ref/References
-------------------
* Reworked the cite handler to split up ref-token processing
and references token processing.
* The handler now processes ref-tokens, parses content all
the way to html output and encapsulates the html in an
attribute of a meta-token that serves as a placeholder for
where the ref-token occured.
* References are handled as a DOM post-pass where these meta
placeholder tokens are collected, content extracted from
the attribute and spit out at the site of a references tag.
The DOM walking is in DOMPostProcessor.js, but the actual
processing is part of the Cite.js to keep all cite extension
handling code in one place.
Parser pipeline
---------------
* Restructured parser pipeline recipes based on changes to Cite,
TemplateHandler, and ExtensionHandler.
* Added a couple functions to the parser pipeline:
1. resetState to reset state before starting a new top-level parse
when pipelines are reused across top-level parses (ex: parser
tests)
2. setSourceOffsets to set start/end offsets of the source being
handled by the pipeline. This is required to correctly set tsr
values when extension content (which is a substring of original
top-level text) is parsed in its own pipeline.
Other fixes
-----------
* Removed env parameter from the Params object since it was not
being used and seemed like unnecessary state propagation.
* Removed a FIXME in DOMUtils.buildTokensFromDOM by reusing code
in the tokenizer that converts "\n" in text to NlTks.
* Cleanup of Util.shiftTokenTSR.
* ext.util.TokenCollection is now no longer used by anything.
Added a FIXME and left around in case we are able to improve
tokenizing and handling of *include* tags that can eliminate the
need for the messy TokenAndAttrCollector.
Test results
------------
* No change in parser tests results.
* Tested with a few different files.
- en:BO page seems to be parsed about 10% faster than before
(needs verification).
- Referencs on the en:BO page seem to be more accurate than
before.
Change-Id: I8a095fa9fa976c7b3a2a4bd968dc9db4270b105f
2013-03-09 00:07:59 +00:00
|
|
|
};
|
2012-09-17 19:46:44 +00:00
|
|
|
|
Extension handling rewrite + cite extension refactoring.
Tokenization
------------
* Fixed tokenizer to correctly parse extension tags in different
contexts: with start and end tags, in self-closing tag mode,
and to correctly handle scenarios when the exension end-tag is
followed by a '#' (the special char used to skip over extension
content).
* Removed the distinction in the tokenizer between installed
extensions and natively supported extension tags (<ref> and
<references> for ex.). They all tokenize and get processed
identically and get handled by different paths in the extension
handler.
* Template and TemplateArg tokens now carry tpl. transclusion
source alongwith them since tsr information will not be
accurate when they show up in extension contexts that in turn
showed up in template context that were expanded by the php
preprocessor.
Ex: {{echo|<ref>{{echo|foo}}</ref>}}
The tsr for the ref-tag will correspond to the
template-source of the echo-template, NOT the original top-level
page. So, env.page.src.substring(..) will return incorrect
source for the innermost {{echo|foo}}. This fix of carrying
along tpl transclusion source in the token itself eliminates
this problem.
Knowledge of native extensions
------------------------------
* Natively implemented extension tags (<ref> and <references>)
are hardcoded in env.conf.parsoid. At some point, it would
be good to have a registration mechanism for parsoid-native
extensions.
Extension handling
------------------
* Extracted extension handling out of the template handler into
its own handler class. Right now, this class inherits from the
template handler in order to be able to reuse a lot of the
expansion and encapsulation functionality currently in the
Template Handler.
* This handler now handles extensions that are:
(a) natively implemented and registered with Parsoid.
(b) implemented as a PHP extension and expanded by relying on
the PHP preprocessor.
For (a), it uses information from env.conf.parsoid to find
ext-handlers for natively implemented ext-tags. However, this
can be cleaned up at some point by making available a registration
mechanism.
Cite/Ref/References
-------------------
* Reworked the cite handler to split up ref-token processing
and references token processing.
* The handler now processes ref-tokens, parses content all
the way to html output and encapsulates the html in an
attribute of a meta-token that serves as a placeholder for
where the ref-token occured.
* References are handled as a DOM post-pass where these meta
placeholder tokens are collected, content extracted from
the attribute and spit out at the site of a references tag.
The DOM walking is in DOMPostProcessor.js, but the actual
processing is part of the Cite.js to keep all cite extension
handling code in one place.
Parser pipeline
---------------
* Restructured parser pipeline recipes based on changes to Cite,
TemplateHandler, and ExtensionHandler.
* Added a couple functions to the parser pipeline:
1. resetState to reset state before starting a new top-level parse
when pipelines are reused across top-level parses (ex: parser
tests)
2. setSourceOffsets to set start/end offsets of the source being
handled by the pipeline. This is required to correctly set tsr
values when extension content (which is a substring of original
top-level text) is parsed in its own pipeline.
Other fixes
-----------
* Removed env parameter from the Params object since it was not
being used and seemed like unnecessary state propagation.
* Removed a FIXME in DOMUtils.buildTokensFromDOM by reusing code
in the tokenizer that converts "\n" in text to NlTks.
* Cleanup of Util.shiftTokenTSR.
* ext.util.TokenCollection is now no longer used by anything.
Added a FIXME and left around in case we are able to improve
tokenizing and handling of *include* tags that can eliminate the
need for the messy TokenAndAttrCollector.
Test results
------------
* No change in parser tests results.
* Tested with a few different files.
- en:BO page seems to be parsed about 10% faster than before
(needs verification).
- Referencs on the en:BO page seem to be more accurate than
before.
Change-Id: I8a095fa9fa976c7b3a2a4bd968dc9db4270b105f
2013-03-09 00:07:59 +00:00
|
|
|
/**
|
|
|
|
* Sanitize the references tag and convert it into a meta-token
|
|
|
|
*/
|
2013-03-26 00:40:20 +00:00
|
|
|
References.prototype.handleReferences = function ( manager, pipelineOpts, refsTok, cb ) {
|
Extension handling rewrite + cite extension refactoring.
Tokenization
------------
* Fixed tokenizer to correctly parse extension tags in different
contexts: with start and end tags, in self-closing tag mode,
and to correctly handle scenarios when the exension end-tag is
followed by a '#' (the special char used to skip over extension
content).
* Removed the distinction in the tokenizer between installed
extensions and natively supported extension tags (<ref> and
<references> for ex.). They all tokenize and get processed
identically and get handled by different paths in the extension
handler.
* Template and TemplateArg tokens now carry tpl. transclusion
source alongwith them since tsr information will not be
accurate when they show up in extension contexts that in turn
showed up in template context that were expanded by the php
preprocessor.
Ex: {{echo|<ref>{{echo|foo}}</ref>}}
The tsr for the ref-tag will correspond to the
template-source of the echo-template, NOT the original top-level
page. So, env.page.src.substring(..) will return incorrect
source for the innermost {{echo|foo}}. This fix of carrying
along tpl transclusion source in the token itself eliminates
this problem.
Knowledge of native extensions
------------------------------
* Natively implemented extension tags (<ref> and <references>)
are hardcoded in env.conf.parsoid. At some point, it would
be good to have a registration mechanism for parsoid-native
extensions.
Extension handling
------------------
* Extracted extension handling out of the template handler into
its own handler class. Right now, this class inherits from the
template handler in order to be able to reuse a lot of the
expansion and encapsulation functionality currently in the
Template Handler.
* This handler now handles extensions that are:
(a) natively implemented and registered with Parsoid.
(b) implemented as a PHP extension and expanded by relying on
the PHP preprocessor.
For (a), it uses information from env.conf.parsoid to find
ext-handlers for natively implemented ext-tags. However, this
can be cleaned up at some point by making available a registration
mechanism.
Cite/Ref/References
-------------------
* Reworked the cite handler to split up ref-token processing
and references token processing.
* The handler now processes ref-tokens, parses content all
the way to html output and encapsulates the html in an
attribute of a meta-token that serves as a placeholder for
where the ref-token occured.
* References are handled as a DOM post-pass where these meta
placeholder tokens are collected, content extracted from
the attribute and spit out at the site of a references tag.
The DOM walking is in DOMPostProcessor.js, but the actual
processing is part of the Cite.js to keep all cite extension
handling code in one place.
Parser pipeline
---------------
* Restructured parser pipeline recipes based on changes to Cite,
TemplateHandler, and ExtensionHandler.
* Added a couple functions to the parser pipeline:
1. resetState to reset state before starting a new top-level parse
when pipelines are reused across top-level parses (ex: parser
tests)
2. setSourceOffsets to set start/end offsets of the source being
handled by the pipeline. This is required to correctly set tsr
values when extension content (which is a substring of original
top-level text) is parsed in its own pipeline.
Other fixes
-----------
* Removed env parameter from the Params object since it was not
being used and seemed like unnecessary state propagation.
* Removed a FIXME in DOMUtils.buildTokensFromDOM by reusing code
in the tokenizer that converts "\n" in text to NlTks.
* Cleanup of Util.shiftTokenTSR.
* ext.util.TokenCollection is now no longer used by anything.
Added a FIXME and left around in case we are able to improve
tokenizing and handling of *include* tags that can eliminate the
need for the messy TokenAndAttrCollector.
Test results
------------
* No change in parser tests results.
* Tested with a few different files.
- en:BO page seems to be parsed about 10% faster than before
(needs verification).
- Referencs on the en:BO page seem to be more accurate than
before.
Change-Id: I8a095fa9fa976c7b3a2a4bd968dc9db4270b105f
2013-03-09 00:07:59 +00:00
|
|
|
refsTok = refsTok.clone();
|
2013-02-20 23:50:52 +00:00
|
|
|
|
Extension handling rewrite + cite extension refactoring.
Tokenization
------------
* Fixed tokenizer to correctly parse extension tags in different
contexts: with start and end tags, in self-closing tag mode,
and to correctly handle scenarios when the exension end-tag is
followed by a '#' (the special char used to skip over extension
content).
* Removed the distinction in the tokenizer between installed
extensions and natively supported extension tags (<ref> and
<references> for ex.). They all tokenize and get processed
identically and get handled by different paths in the extension
handler.
* Template and TemplateArg tokens now carry tpl. transclusion
source alongwith them since tsr information will not be
accurate when they show up in extension contexts that in turn
showed up in template context that were expanded by the php
preprocessor.
Ex: {{echo|<ref>{{echo|foo}}</ref>}}
The tsr for the ref-tag will correspond to the
template-source of the echo-template, NOT the original top-level
page. So, env.page.src.substring(..) will return incorrect
source for the innermost {{echo|foo}}. This fix of carrying
along tpl transclusion source in the token itself eliminates
this problem.
Knowledge of native extensions
------------------------------
* Natively implemented extension tags (<ref> and <references>)
are hardcoded in env.conf.parsoid. At some point, it would
be good to have a registration mechanism for parsoid-native
extensions.
Extension handling
------------------
* Extracted extension handling out of the template handler into
its own handler class. Right now, this class inherits from the
template handler in order to be able to reuse a lot of the
expansion and encapsulation functionality currently in the
Template Handler.
* This handler now handles extensions that are:
(a) natively implemented and registered with Parsoid.
(b) implemented as a PHP extension and expanded by relying on
the PHP preprocessor.
For (a), it uses information from env.conf.parsoid to find
ext-handlers for natively implemented ext-tags. However, this
can be cleaned up at some point by making available a registration
mechanism.
Cite/Ref/References
-------------------
* Reworked the cite handler to split up ref-token processing
and references token processing.
* The handler now processes ref-tokens, parses content all
the way to html output and encapsulates the html in an
attribute of a meta-token that serves as a placeholder for
where the ref-token occured.
* References are handled as a DOM post-pass where these meta
placeholder tokens are collected, content extracted from
the attribute and spit out at the site of a references tag.
The DOM walking is in DOMPostProcessor.js, but the actual
processing is part of the Cite.js to keep all cite extension
handling code in one place.
Parser pipeline
---------------
* Restructured parser pipeline recipes based on changes to Cite,
TemplateHandler, and ExtensionHandler.
* Added a couple functions to the parser pipeline:
1. resetState to reset state before starting a new top-level parse
when pipelines are reused across top-level parses (ex: parser
tests)
2. setSourceOffsets to set start/end offsets of the source being
handled by the pipeline. This is required to correctly set tsr
values when extension content (which is a substring of original
top-level text) is parsed in its own pipeline.
Other fixes
-----------
* Removed env parameter from the Params object since it was not
being used and seemed like unnecessary state propagation.
* Removed a FIXME in DOMUtils.buildTokensFromDOM by reusing code
in the tokenizer that converts "\n" in text to NlTks.
* Cleanup of Util.shiftTokenTSR.
* ext.util.TokenCollection is now no longer used by anything.
Added a FIXME and left around in case we are able to improve
tokenizing and handling of *include* tags that can eliminate the
need for the messy TokenAndAttrCollector.
Test results
------------
* No change in parser tests results.
* Tested with a few different files.
- en:BO page seems to be parsed about 10% faster than before
(needs verification).
- Referencs on the en:BO page seem to be more accurate than
before.
Change-Id: I8a095fa9fa976c7b3a2a4bd968dc9db4270b105f
2013-03-09 00:07:59 +00:00
|
|
|
// group is the only recognized option?
|
2013-03-26 00:40:20 +00:00
|
|
|
var refsOpts = Util.KVtoHash(refsTok.getAttribute("options")),
|
|
|
|
group = refsOpts.group;
|
2012-11-27 23:13:32 +00:00
|
|
|
|
|
|
|
if ( group && group.constructor === Array ) {
|
|
|
|
// Array of tokens, convert to string.
|
|
|
|
group = Util.tokensToString(group);
|
|
|
|
}
|
|
|
|
|
|
|
|
// Point invalid / empty groups to null
|
2012-11-29 16:15:51 +00:00
|
|
|
if ( ! group ) {
|
2012-11-27 23:13:32 +00:00
|
|
|
group = null;
|
|
|
|
}
|
|
|
|
|
2013-04-25 10:40:33 +00:00
|
|
|
// Emit a placeholder meta for the references token
|
|
|
|
// so that the dom post processor can generate and
|
|
|
|
// emit references at this point in the DOM.
|
2013-05-02 16:17:08 +00:00
|
|
|
var emitMarkerMeta = function() {
|
|
|
|
var marker = new SelfclosingTagTk('meta', refsTok.attribs, refsTok.dataAttribs);
|
|
|
|
|
|
|
|
marker.dataAttribs.stx = undefined;
|
|
|
|
DU.addAttributes(marker, {
|
|
|
|
'about': '#' + manager.env.newObjectId(),
|
|
|
|
'group': group,
|
|
|
|
'typeof': 'mw:Ext/References/Marker'
|
|
|
|
});
|
|
|
|
cb({ tokens: [marker], async: false });
|
2013-03-26 00:40:20 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
processExtSource(manager, refsTok, {
|
|
|
|
// Partial pipeline for processing ref-content
|
|
|
|
// Expand till stage 2 so that all embedded
|
|
|
|
// ref tags get processed
|
|
|
|
pipelineType: 'text/x-mediawiki',
|
|
|
|
pipelineOpts: {
|
|
|
|
extTag: "references",
|
|
|
|
wrapTemplates: pipelineOpts.wrapTemplates
|
|
|
|
},
|
|
|
|
res: [],
|
|
|
|
parentCB: cb,
|
2013-05-02 16:17:08 +00:00
|
|
|
emptyContentCB: emitMarkerMeta,
|
2013-03-26 00:40:20 +00:00
|
|
|
chunkCB: function(chunk) {
|
|
|
|
// Extract ref-content tokens and discard the rest
|
|
|
|
var res = [];
|
|
|
|
for (var i = 0, n = chunk.length; i < n; i++) {
|
|
|
|
var t = chunk[i];
|
|
|
|
if (t.constructor === SelfclosingTagTk &&
|
|
|
|
t.name === 'meta' &&
|
2013-04-24 19:09:08 +00:00
|
|
|
/^mw:Ext\/Ref\/Marker$/.test(t.getAttribute('typeof')))
|
2013-03-26 00:40:20 +00:00
|
|
|
{
|
|
|
|
res.push(t);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Pass along the ref toks
|
|
|
|
cb({ tokens: res, async: true });
|
|
|
|
},
|
2013-05-02 16:17:08 +00:00
|
|
|
endCB: emitMarkerMeta
|
2013-03-26 00:40:20 +00:00
|
|
|
});
|
Extension handling rewrite + cite extension refactoring.
Tokenization
------------
* Fixed tokenizer to correctly parse extension tags in different
contexts: with start and end tags, in self-closing tag mode,
and to correctly handle scenarios when the exension end-tag is
followed by a '#' (the special char used to skip over extension
content).
* Removed the distinction in the tokenizer between installed
extensions and natively supported extension tags (<ref> and
<references> for ex.). They all tokenize and get processed
identically and get handled by different paths in the extension
handler.
* Template and TemplateArg tokens now carry tpl. transclusion
source alongwith them since tsr information will not be
accurate when they show up in extension contexts that in turn
showed up in template context that were expanded by the php
preprocessor.
Ex: {{echo|<ref>{{echo|foo}}</ref>}}
The tsr for the ref-tag will correspond to the
template-source of the echo-template, NOT the original top-level
page. So, env.page.src.substring(..) will return incorrect
source for the innermost {{echo|foo}}. This fix of carrying
along tpl transclusion source in the token itself eliminates
this problem.
Knowledge of native extensions
------------------------------
* Natively implemented extension tags (<ref> and <references>)
are hardcoded in env.conf.parsoid. At some point, it would
be good to have a registration mechanism for parsoid-native
extensions.
Extension handling
------------------
* Extracted extension handling out of the template handler into
its own handler class. Right now, this class inherits from the
template handler in order to be able to reuse a lot of the
expansion and encapsulation functionality currently in the
Template Handler.
* This handler now handles extensions that are:
(a) natively implemented and registered with Parsoid.
(b) implemented as a PHP extension and expanded by relying on
the PHP preprocessor.
For (a), it uses information from env.conf.parsoid to find
ext-handlers for natively implemented ext-tags. However, this
can be cleaned up at some point by making available a registration
mechanism.
Cite/Ref/References
-------------------
* Reworked the cite handler to split up ref-token processing
and references token processing.
* The handler now processes ref-tokens, parses content all
the way to html output and encapsulates the html in an
attribute of a meta-token that serves as a placeholder for
where the ref-token occured.
* References are handled as a DOM post-pass where these meta
placeholder tokens are collected, content extracted from
the attribute and spit out at the site of a references tag.
The DOM walking is in DOMPostProcessor.js, but the actual
processing is part of the Cite.js to keep all cite extension
handling code in one place.
Parser pipeline
---------------
* Restructured parser pipeline recipes based on changes to Cite,
TemplateHandler, and ExtensionHandler.
* Added a couple functions to the parser pipeline:
1. resetState to reset state before starting a new top-level parse
when pipelines are reused across top-level parses (ex: parser
tests)
2. setSourceOffsets to set start/end offsets of the source being
handled by the pipeline. This is required to correctly set tsr
values when extension content (which is a substring of original
top-level text) is parsed in its own pipeline.
Other fixes
-----------
* Removed env parameter from the Params object since it was not
being used and seemed like unnecessary state propagation.
* Removed a FIXME in DOMUtils.buildTokensFromDOM by reusing code
in the tokenizer that converts "\n" in text to NlTks.
* Cleanup of Util.shiftTokenTSR.
* ext.util.TokenCollection is now no longer used by anything.
Added a FIXME and left around in case we are able to improve
tokenizing and handling of *include* tags that can eliminate the
need for the messy TokenAndAttrCollector.
Test results
------------
* No change in parser tests results.
* Tested with a few different files.
- en:BO page seems to be parsed about 10% faster than before
(needs verification).
- Referencs on the en:BO page seem to be more accurate than
before.
Change-Id: I8a095fa9fa976c7b3a2a4bd968dc9db4270b105f
2013-03-09 00:07:59 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
References.prototype.extractRefFromNode = function(node) {
|
2013-04-24 19:09:08 +00:00
|
|
|
function newRefGroup(refGroups, group) {
|
|
|
|
group = group || '';
|
|
|
|
if (!refGroups[group]) {
|
|
|
|
refGroups[group] = new RefGroup(group);
|
|
|
|
}
|
|
|
|
return refGroups[group];
|
|
|
|
}
|
|
|
|
|
Extension handling rewrite + cite extension refactoring.
Tokenization
------------
* Fixed tokenizer to correctly parse extension tags in different
contexts: with start and end tags, in self-closing tag mode,
and to correctly handle scenarios when the exension end-tag is
followed by a '#' (the special char used to skip over extension
content).
* Removed the distinction in the tokenizer between installed
extensions and natively supported extension tags (<ref> and
<references> for ex.). They all tokenize and get processed
identically and get handled by different paths in the extension
handler.
* Template and TemplateArg tokens now carry tpl. transclusion
source alongwith them since tsr information will not be
accurate when they show up in extension contexts that in turn
showed up in template context that were expanded by the php
preprocessor.
Ex: {{echo|<ref>{{echo|foo}}</ref>}}
The tsr for the ref-tag will correspond to the
template-source of the echo-template, NOT the original top-level
page. So, env.page.src.substring(..) will return incorrect
source for the innermost {{echo|foo}}. This fix of carrying
along tpl transclusion source in the token itself eliminates
this problem.
Knowledge of native extensions
------------------------------
* Natively implemented extension tags (<ref> and <references>)
are hardcoded in env.conf.parsoid. At some point, it would
be good to have a registration mechanism for parsoid-native
extensions.
Extension handling
------------------
* Extracted extension handling out of the template handler into
its own handler class. Right now, this class inherits from the
template handler in order to be able to reuse a lot of the
expansion and encapsulation functionality currently in the
Template Handler.
* This handler now handles extensions that are:
(a) natively implemented and registered with Parsoid.
(b) implemented as a PHP extension and expanded by relying on
the PHP preprocessor.
For (a), it uses information from env.conf.parsoid to find
ext-handlers for natively implemented ext-tags. However, this
can be cleaned up at some point by making available a registration
mechanism.
Cite/Ref/References
-------------------
* Reworked the cite handler to split up ref-token processing
and references token processing.
* The handler now processes ref-tokens, parses content all
the way to html output and encapsulates the html in an
attribute of a meta-token that serves as a placeholder for
where the ref-token occured.
* References are handled as a DOM post-pass where these meta
placeholder tokens are collected, content extracted from
the attribute and spit out at the site of a references tag.
The DOM walking is in DOMPostProcessor.js, but the actual
processing is part of the Cite.js to keep all cite extension
handling code in one place.
Parser pipeline
---------------
* Restructured parser pipeline recipes based on changes to Cite,
TemplateHandler, and ExtensionHandler.
* Added a couple functions to the parser pipeline:
1. resetState to reset state before starting a new top-level parse
when pipelines are reused across top-level parses (ex: parser
tests)
2. setSourceOffsets to set start/end offsets of the source being
handled by the pipeline. This is required to correctly set tsr
values when extension content (which is a substring of original
top-level text) is parsed in its own pipeline.
Other fixes
-----------
* Removed env parameter from the Params object since it was not
being used and seemed like unnecessary state propagation.
* Removed a FIXME in DOMUtils.buildTokensFromDOM by reusing code
in the tokenizer that converts "\n" in text to NlTks.
* Cleanup of Util.shiftTokenTSR.
* ext.util.TokenCollection is now no longer used by anything.
Added a FIXME and left around in case we are able to improve
tokenizing and handling of *include* tags that can eliminate the
need for the messy TokenAndAttrCollector.
Test results
------------
* No change in parser tests results.
* Tested with a few different files.
- en:BO page seems to be parsed about 10% faster than before
(needs verification).
- Referencs on the en:BO page seem to be more accurate than
before.
Change-Id: I8a095fa9fa976c7b3a2a4bd968dc9db4270b105f
2013-03-09 00:07:59 +00:00
|
|
|
var group = node.getAttribute("group"),
|
|
|
|
refName = node.getAttribute("name"),
|
2013-04-24 19:09:08 +00:00
|
|
|
about = node.getAttribute("about"),
|
|
|
|
skipLinkback = node.getAttribute("skiplinkback") === "1",
|
Extension handling rewrite + cite extension refactoring.
Tokenization
------------
* Fixed tokenizer to correctly parse extension tags in different
contexts: with start and end tags, in self-closing tag mode,
and to correctly handle scenarios when the exension end-tag is
followed by a '#' (the special char used to skip over extension
content).
* Removed the distinction in the tokenizer between installed
extensions and natively supported extension tags (<ref> and
<references> for ex.). They all tokenize and get processed
identically and get handled by different paths in the extension
handler.
* Template and TemplateArg tokens now carry tpl. transclusion
source alongwith them since tsr information will not be
accurate when they show up in extension contexts that in turn
showed up in template context that were expanded by the php
preprocessor.
Ex: {{echo|<ref>{{echo|foo}}</ref>}}
The tsr for the ref-tag will correspond to the
template-source of the echo-template, NOT the original top-level
page. So, env.page.src.substring(..) will return incorrect
source for the innermost {{echo|foo}}. This fix of carrying
along tpl transclusion source in the token itself eliminates
this problem.
Knowledge of native extensions
------------------------------
* Natively implemented extension tags (<ref> and <references>)
are hardcoded in env.conf.parsoid. At some point, it would
be good to have a registration mechanism for parsoid-native
extensions.
Extension handling
------------------
* Extracted extension handling out of the template handler into
its own handler class. Right now, this class inherits from the
template handler in order to be able to reuse a lot of the
expansion and encapsulation functionality currently in the
Template Handler.
* This handler now handles extensions that are:
(a) natively implemented and registered with Parsoid.
(b) implemented as a PHP extension and expanded by relying on
the PHP preprocessor.
For (a), it uses information from env.conf.parsoid to find
ext-handlers for natively implemented ext-tags. However, this
can be cleaned up at some point by making available a registration
mechanism.
Cite/Ref/References
-------------------
* Reworked the cite handler to split up ref-token processing
and references token processing.
* The handler now processes ref-tokens, parses content all
the way to html output and encapsulates the html in an
attribute of a meta-token that serves as a placeholder for
where the ref-token occured.
* References are handled as a DOM post-pass where these meta
placeholder tokens are collected, content extracted from
the attribute and spit out at the site of a references tag.
The DOM walking is in DOMPostProcessor.js, but the actual
processing is part of the Cite.js to keep all cite extension
handling code in one place.
Parser pipeline
---------------
* Restructured parser pipeline recipes based on changes to Cite,
TemplateHandler, and ExtensionHandler.
* Added a couple functions to the parser pipeline:
1. resetState to reset state before starting a new top-level parse
when pipelines are reused across top-level parses (ex: parser
tests)
2. setSourceOffsets to set start/end offsets of the source being
handled by the pipeline. This is required to correctly set tsr
values when extension content (which is a substring of original
top-level text) is parsed in its own pipeline.
Other fixes
-----------
* Removed env parameter from the Params object since it was not
being used and seemed like unnecessary state propagation.
* Removed a FIXME in DOMUtils.buildTokensFromDOM by reusing code
in the tokenizer that converts "\n" in text to NlTks.
* Cleanup of Util.shiftTokenTSR.
* ext.util.TokenCollection is now no longer used by anything.
Added a FIXME and left around in case we are able to improve
tokenizing and handling of *include* tags that can eliminate the
need for the messy TokenAndAttrCollector.
Test results
------------
* No change in parser tests results.
* Tested with a few different files.
- en:BO page seems to be parsed about 10% faster than before
(needs verification).
- Referencs on the en:BO page seem to be more accurate than
before.
Change-Id: I8a095fa9fa976c7b3a2a4bd968dc9db4270b105f
2013-03-09 00:07:59 +00:00
|
|
|
refGroup = this.refGroups[group] || newRefGroup(this.refGroups, group),
|
2013-05-02 16:17:08 +00:00
|
|
|
ref = refGroup.add(refName, about, skipLinkback);
|
2013-04-24 19:09:08 +00:00
|
|
|
|
|
|
|
// Add ref-index linkback
|
|
|
|
if (!skipLinkback) {
|
|
|
|
var doc = node.ownerDocument,
|
|
|
|
span = doc.createElement('span'),
|
|
|
|
endMeta = doc.createElement('meta');
|
|
|
|
|
2013-05-02 16:17:08 +00:00
|
|
|
DU.addAttributes(span, {
|
|
|
|
'about': about,
|
|
|
|
'class': 'reference',
|
|
|
|
'data-mw': JSON.stringify({
|
|
|
|
'name': 'ref',
|
2013-05-25 14:38:13 +00:00
|
|
|
'body': { 'html': node.getAttribute("content") },
|
|
|
|
'attrs': {
|
|
|
|
// Dont emit empty keys
|
|
|
|
'group': group || undefined,
|
|
|
|
'name': refName || undefined
|
|
|
|
}
|
2013-05-02 16:17:08 +00:00
|
|
|
}),
|
|
|
|
'id': ref.linkbacks[ref.linkbacks.length - 1],
|
|
|
|
'rel': 'dc:references',
|
|
|
|
'typeof': 'mw:Object/Ext/Ref'
|
|
|
|
});
|
2013-04-24 19:09:08 +00:00
|
|
|
span.data = { parsoid: { src: node.data.parsoid.src } };
|
|
|
|
|
|
|
|
var tsr = node.data.parsoid.tsr;
|
|
|
|
if (tsr) {
|
|
|
|
span.data.parsoid.tsr = tsr;
|
|
|
|
endMeta.data = { parsoid: { tsr: [null, tsr[1]] } };
|
|
|
|
}
|
|
|
|
|
|
|
|
// refIndex-span
|
|
|
|
node.parentNode.insertBefore(span, node);
|
|
|
|
|
|
|
|
// refIndex-a
|
|
|
|
var refIndex = doc.createElement('a');
|
|
|
|
refIndex.setAttribute('href', '#' + ref.target);
|
|
|
|
refIndex.appendChild(doc.createTextNode(
|
|
|
|
'[' + ((group === '') ? '' : group + ' ') + ref.groupIndex + ']'
|
|
|
|
));
|
|
|
|
span.appendChild(refIndex);
|
|
|
|
|
|
|
|
// endMeta
|
2013-05-02 16:17:08 +00:00
|
|
|
DU.addAttributes(endMeta, {
|
|
|
|
'about': about,
|
|
|
|
'typeof': 'mw:Object/Ext/Ref/End'
|
|
|
|
});
|
2013-04-24 19:09:08 +00:00
|
|
|
node.parentNode.insertBefore(endMeta, node);
|
|
|
|
}
|
Extension handling rewrite + cite extension refactoring.
Tokenization
------------
* Fixed tokenizer to correctly parse extension tags in different
contexts: with start and end tags, in self-closing tag mode,
and to correctly handle scenarios when the exension end-tag is
followed by a '#' (the special char used to skip over extension
content).
* Removed the distinction in the tokenizer between installed
extensions and natively supported extension tags (<ref> and
<references> for ex.). They all tokenize and get processed
identically and get handled by different paths in the extension
handler.
* Template and TemplateArg tokens now carry tpl. transclusion
source alongwith them since tsr information will not be
accurate when they show up in extension contexts that in turn
showed up in template context that were expanded by the php
preprocessor.
Ex: {{echo|<ref>{{echo|foo}}</ref>}}
The tsr for the ref-tag will correspond to the
template-source of the echo-template, NOT the original top-level
page. So, env.page.src.substring(..) will return incorrect
source for the innermost {{echo|foo}}. This fix of carrying
along tpl transclusion source in the token itself eliminates
this problem.
Knowledge of native extensions
------------------------------
* Natively implemented extension tags (<ref> and <references>)
are hardcoded in env.conf.parsoid. At some point, it would
be good to have a registration mechanism for parsoid-native
extensions.
Extension handling
------------------
* Extracted extension handling out of the template handler into
its own handler class. Right now, this class inherits from the
template handler in order to be able to reuse a lot of the
expansion and encapsulation functionality currently in the
Template Handler.
* This handler now handles extensions that are:
(a) natively implemented and registered with Parsoid.
(b) implemented as a PHP extension and expanded by relying on
the PHP preprocessor.
For (a), it uses information from env.conf.parsoid to find
ext-handlers for natively implemented ext-tags. However, this
can be cleaned up at some point by making available a registration
mechanism.
Cite/Ref/References
-------------------
* Reworked the cite handler to split up ref-token processing
and references token processing.
* The handler now processes ref-tokens, parses content all
the way to html output and encapsulates the html in an
attribute of a meta-token that serves as a placeholder for
where the ref-token occured.
* References are handled as a DOM post-pass where these meta
placeholder tokens are collected, content extracted from
the attribute and spit out at the site of a references tag.
The DOM walking is in DOMPostProcessor.js, but the actual
processing is part of the Cite.js to keep all cite extension
handling code in one place.
Parser pipeline
---------------
* Restructured parser pipeline recipes based on changes to Cite,
TemplateHandler, and ExtensionHandler.
* Added a couple functions to the parser pipeline:
1. resetState to reset state before starting a new top-level parse
when pipelines are reused across top-level parses (ex: parser
tests)
2. setSourceOffsets to set start/end offsets of the source being
handled by the pipeline. This is required to correctly set tsr
values when extension content (which is a substring of original
top-level text) is parsed in its own pipeline.
Other fixes
-----------
* Removed env parameter from the Params object since it was not
being used and seemed like unnecessary state propagation.
* Removed a FIXME in DOMUtils.buildTokensFromDOM by reusing code
in the tokenizer that converts "\n" in text to NlTks.
* Cleanup of Util.shiftTokenTSR.
* ext.util.TokenCollection is now no longer used by anything.
Added a FIXME and left around in case we are able to improve
tokenizing and handling of *include* tags that can eliminate the
need for the messy TokenAndAttrCollector.
Test results
------------
* No change in parser tests results.
* Tested with a few different files.
- en:BO page seems to be parsed about 10% faster than before
(needs verification).
- Referencs on the en:BO page seem to be more accurate than
before.
Change-Id: I8a095fa9fa976c7b3a2a4bd968dc9db4270b105f
2013-03-09 00:07:59 +00:00
|
|
|
|
|
|
|
// This effectively ignores content from later references with the same name.
|
|
|
|
// The implicit assumption is that that all those identically named refs. are
|
|
|
|
// of the form <ref name='foo' />
|
|
|
|
if (!ref.content) {
|
|
|
|
ref.content = node.getAttribute("content");
|
2012-05-03 11:05:28 +00:00
|
|
|
}
|
Extension handling rewrite + cite extension refactoring.
Tokenization
------------
* Fixed tokenizer to correctly parse extension tags in different
contexts: with start and end tags, in self-closing tag mode,
and to correctly handle scenarios when the exension end-tag is
followed by a '#' (the special char used to skip over extension
content).
* Removed the distinction in the tokenizer between installed
extensions and natively supported extension tags (<ref> and
<references> for ex.). They all tokenize and get processed
identically and get handled by different paths in the extension
handler.
* Template and TemplateArg tokens now carry tpl. transclusion
source alongwith them since tsr information will not be
accurate when they show up in extension contexts that in turn
showed up in template context that were expanded by the php
preprocessor.
Ex: {{echo|<ref>{{echo|foo}}</ref>}}
The tsr for the ref-tag will correspond to the
template-source of the echo-template, NOT the original top-level
page. So, env.page.src.substring(..) will return incorrect
source for the innermost {{echo|foo}}. This fix of carrying
along tpl transclusion source in the token itself eliminates
this problem.
Knowledge of native extensions
------------------------------
* Natively implemented extension tags (<ref> and <references>)
are hardcoded in env.conf.parsoid. At some point, it would
be good to have a registration mechanism for parsoid-native
extensions.
Extension handling
------------------
* Extracted extension handling out of the template handler into
its own handler class. Right now, this class inherits from the
template handler in order to be able to reuse a lot of the
expansion and encapsulation functionality currently in the
Template Handler.
* This handler now handles extensions that are:
(a) natively implemented and registered with Parsoid.
(b) implemented as a PHP extension and expanded by relying on
the PHP preprocessor.
For (a), it uses information from env.conf.parsoid to find
ext-handlers for natively implemented ext-tags. However, this
can be cleaned up at some point by making available a registration
mechanism.
Cite/Ref/References
-------------------
* Reworked the cite handler to split up ref-token processing
and references token processing.
* The handler now processes ref-tokens, parses content all
the way to html output and encapsulates the html in an
attribute of a meta-token that serves as a placeholder for
where the ref-token occured.
* References are handled as a DOM post-pass where these meta
placeholder tokens are collected, content extracted from
the attribute and spit out at the site of a references tag.
The DOM walking is in DOMPostProcessor.js, but the actual
processing is part of the Cite.js to keep all cite extension
handling code in one place.
Parser pipeline
---------------
* Restructured parser pipeline recipes based on changes to Cite,
TemplateHandler, and ExtensionHandler.
* Added a couple functions to the parser pipeline:
1. resetState to reset state before starting a new top-level parse
when pipelines are reused across top-level parses (ex: parser
tests)
2. setSourceOffsets to set start/end offsets of the source being
handled by the pipeline. This is required to correctly set tsr
values when extension content (which is a substring of original
top-level text) is parsed in its own pipeline.
Other fixes
-----------
* Removed env parameter from the Params object since it was not
being used and seemed like unnecessary state propagation.
* Removed a FIXME in DOMUtils.buildTokensFromDOM by reusing code
in the tokenizer that converts "\n" in text to NlTks.
* Cleanup of Util.shiftTokenTSR.
* ext.util.TokenCollection is now no longer used by anything.
Added a FIXME and left around in case we are able to improve
tokenizing and handling of *include* tags that can eliminate the
need for the messy TokenAndAttrCollector.
Test results
------------
* No change in parser tests results.
* Tested with a few different files.
- en:BO page seems to be parsed about 10% faster than before
(needs verification).
- Referencs on the en:BO page seem to be more accurate than
before.
Change-Id: I8a095fa9fa976c7b3a2a4bd968dc9db4270b105f
2013-03-09 00:07:59 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
References.prototype.insertReferencesIntoDOM = function(refsNode) {
|
|
|
|
var group = refsNode.getAttribute("group") || '',
|
|
|
|
refGroup = this.refGroups[group];
|
|
|
|
|
|
|
|
if (refGroup && refGroup.refs.length > 0) {
|
2013-04-24 19:09:08 +00:00
|
|
|
var ol = refsNode.ownerDocument.createElement('ol'),
|
|
|
|
endMeta = refsNode.ownerDocument.createElement('meta'),
|
|
|
|
about = refsNode.getAttribute('about');
|
|
|
|
|
2013-05-02 16:17:08 +00:00
|
|
|
DU.addAttributes(ol, {
|
|
|
|
'about': about,
|
|
|
|
'class': 'references',
|
2013-05-25 14:38:13 +00:00
|
|
|
// SSS FIXME: data-mw for references is missing.
|
|
|
|
// We'll have to output data-mw.body.extsrc in
|
|
|
|
// scenarios where original wikitext was of the form:
|
|
|
|
// "<references> lot of refs here </references>"
|
|
|
|
// Ex: See [[en:Barack Obama]]
|
2013-05-02 16:17:08 +00:00
|
|
|
'typeof': 'mw:Object/Ext/References'
|
|
|
|
});
|
2013-04-24 19:09:08 +00:00
|
|
|
ol.data = refsNode.data;
|
Extension handling rewrite + cite extension refactoring.
Tokenization
------------
* Fixed tokenizer to correctly parse extension tags in different
contexts: with start and end tags, in self-closing tag mode,
and to correctly handle scenarios when the exension end-tag is
followed by a '#' (the special char used to skip over extension
content).
* Removed the distinction in the tokenizer between installed
extensions and natively supported extension tags (<ref> and
<references> for ex.). They all tokenize and get processed
identically and get handled by different paths in the extension
handler.
* Template and TemplateArg tokens now carry tpl. transclusion
source alongwith them since tsr information will not be
accurate when they show up in extension contexts that in turn
showed up in template context that were expanded by the php
preprocessor.
Ex: {{echo|<ref>{{echo|foo}}</ref>}}
The tsr for the ref-tag will correspond to the
template-source of the echo-template, NOT the original top-level
page. So, env.page.src.substring(..) will return incorrect
source for the innermost {{echo|foo}}. This fix of carrying
along tpl transclusion source in the token itself eliminates
this problem.
Knowledge of native extensions
------------------------------
* Natively implemented extension tags (<ref> and <references>)
are hardcoded in env.conf.parsoid. At some point, it would
be good to have a registration mechanism for parsoid-native
extensions.
Extension handling
------------------
* Extracted extension handling out of the template handler into
its own handler class. Right now, this class inherits from the
template handler in order to be able to reuse a lot of the
expansion and encapsulation functionality currently in the
Template Handler.
* This handler now handles extensions that are:
(a) natively implemented and registered with Parsoid.
(b) implemented as a PHP extension and expanded by relying on
the PHP preprocessor.
For (a), it uses information from env.conf.parsoid to find
ext-handlers for natively implemented ext-tags. However, this
can be cleaned up at some point by making available a registration
mechanism.
Cite/Ref/References
-------------------
* Reworked the cite handler to split up ref-token processing
and references token processing.
* The handler now processes ref-tokens, parses content all
the way to html output and encapsulates the html in an
attribute of a meta-token that serves as a placeholder for
where the ref-token occured.
* References are handled as a DOM post-pass where these meta
placeholder tokens are collected, content extracted from
the attribute and spit out at the site of a references tag.
The DOM walking is in DOMPostProcessor.js, but the actual
processing is part of the Cite.js to keep all cite extension
handling code in one place.
Parser pipeline
---------------
* Restructured parser pipeline recipes based on changes to Cite,
TemplateHandler, and ExtensionHandler.
* Added a couple functions to the parser pipeline:
1. resetState to reset state before starting a new top-level parse
when pipelines are reused across top-level parses (ex: parser
tests)
2. setSourceOffsets to set start/end offsets of the source being
handled by the pipeline. This is required to correctly set tsr
values when extension content (which is a substring of original
top-level text) is parsed in its own pipeline.
Other fixes
-----------
* Removed env parameter from the Params object since it was not
being used and seemed like unnecessary state propagation.
* Removed a FIXME in DOMUtils.buildTokensFromDOM by reusing code
in the tokenizer that converts "\n" in text to NlTks.
* Cleanup of Util.shiftTokenTSR.
* ext.util.TokenCollection is now no longer used by anything.
Added a FIXME and left around in case we are able to improve
tokenizing and handling of *include* tags that can eliminate the
need for the messy TokenAndAttrCollector.
Test results
------------
* No change in parser tests results.
* Tested with a few different files.
- en:BO page seems to be parsed about 10% faster than before
(needs verification).
- Referencs on the en:BO page seem to be more accurate than
before.
Change-Id: I8a095fa9fa976c7b3a2a4bd968dc9db4270b105f
2013-03-09 00:07:59 +00:00
|
|
|
refGroup.refs.map(refGroup.renderLine.bind(refGroup, ol));
|
|
|
|
refsNode.parentNode.replaceChild(ol, refsNode);
|
2013-04-24 19:09:08 +00:00
|
|
|
|
|
|
|
// Since this has a 'mw:Object/*' typeof, this code will be run
|
|
|
|
// through template encapsulation code. Add an end-meta after
|
2013-05-02 16:17:08 +00:00
|
|
|
// the list so that that code knows where the references HTML ends.
|
|
|
|
DU.addAttributes(endMeta, {
|
|
|
|
'about': about,
|
|
|
|
'typeof': 'mw:Object/Ext/References/End'
|
|
|
|
});
|
2013-04-25 17:12:46 +00:00
|
|
|
// Set end-tsr on the endMeta so that DSR computation can establish
|
|
|
|
// a valid DSR range on the references section.
|
|
|
|
var tsr = refsNode.data.parsoid.tsr;
|
|
|
|
if (tsr) {
|
|
|
|
endMeta.data = { parsoid: { tsr: [null, tsr[1]] } };
|
|
|
|
}
|
2013-04-24 19:09:08 +00:00
|
|
|
ol.parentNode.insertBefore(endMeta, ol.nextSibling);
|
Extension handling rewrite + cite extension refactoring.
Tokenization
------------
* Fixed tokenizer to correctly parse extension tags in different
contexts: with start and end tags, in self-closing tag mode,
and to correctly handle scenarios when the exension end-tag is
followed by a '#' (the special char used to skip over extension
content).
* Removed the distinction in the tokenizer between installed
extensions and natively supported extension tags (<ref> and
<references> for ex.). They all tokenize and get processed
identically and get handled by different paths in the extension
handler.
* Template and TemplateArg tokens now carry tpl. transclusion
source alongwith them since tsr information will not be
accurate when they show up in extension contexts that in turn
showed up in template context that were expanded by the php
preprocessor.
Ex: {{echo|<ref>{{echo|foo}}</ref>}}
The tsr for the ref-tag will correspond to the
template-source of the echo-template, NOT the original top-level
page. So, env.page.src.substring(..) will return incorrect
source for the innermost {{echo|foo}}. This fix of carrying
along tpl transclusion source in the token itself eliminates
this problem.
Knowledge of native extensions
------------------------------
* Natively implemented extension tags (<ref> and <references>)
are hardcoded in env.conf.parsoid. At some point, it would
be good to have a registration mechanism for parsoid-native
extensions.
Extension handling
------------------
* Extracted extension handling out of the template handler into
its own handler class. Right now, this class inherits from the
template handler in order to be able to reuse a lot of the
expansion and encapsulation functionality currently in the
Template Handler.
* This handler now handles extensions that are:
(a) natively implemented and registered with Parsoid.
(b) implemented as a PHP extension and expanded by relying on
the PHP preprocessor.
For (a), it uses information from env.conf.parsoid to find
ext-handlers for natively implemented ext-tags. However, this
can be cleaned up at some point by making available a registration
mechanism.
Cite/Ref/References
-------------------
* Reworked the cite handler to split up ref-token processing
and references token processing.
* The handler now processes ref-tokens, parses content all
the way to html output and encapsulates the html in an
attribute of a meta-token that serves as a placeholder for
where the ref-token occured.
* References are handled as a DOM post-pass where these meta
placeholder tokens are collected, content extracted from
the attribute and spit out at the site of a references tag.
The DOM walking is in DOMPostProcessor.js, but the actual
processing is part of the Cite.js to keep all cite extension
handling code in one place.
Parser pipeline
---------------
* Restructured parser pipeline recipes based on changes to Cite,
TemplateHandler, and ExtensionHandler.
* Added a couple functions to the parser pipeline:
1. resetState to reset state before starting a new top-level parse
when pipelines are reused across top-level parses (ex: parser
tests)
2. setSourceOffsets to set start/end offsets of the source being
handled by the pipeline. This is required to correctly set tsr
values when extension content (which is a substring of original
top-level text) is parsed in its own pipeline.
Other fixes
-----------
* Removed env parameter from the Params object since it was not
being used and seemed like unnecessary state propagation.
* Removed a FIXME in DOMUtils.buildTokensFromDOM by reusing code
in the tokenizer that converts "\n" in text to NlTks.
* Cleanup of Util.shiftTokenTSR.
* ext.util.TokenCollection is now no longer used by anything.
Added a FIXME and left around in case we are able to improve
tokenizing and handling of *include* tags that can eliminate the
need for the messy TokenAndAttrCollector.
Test results
------------
* No change in parser tests results.
* Tested with a few different files.
- en:BO page seems to be parsed about 10% faster than before
(needs verification).
- Referencs on the en:BO page seem to be more accurate than
before.
Change-Id: I8a095fa9fa976c7b3a2a4bd968dc9db4270b105f
2013-03-09 00:07:59 +00:00
|
|
|
} else {
|
|
|
|
// Not a valid references tag -- convert it to a placeholder tag that will rt as is.
|
|
|
|
refsNode.setAttribute('typeof', 'mw:Placeholder');
|
|
|
|
}
|
|
|
|
|
2013-04-24 19:09:08 +00:00
|
|
|
// reset
|
|
|
|
this.reset(group);
|
2011-12-14 23:38:46 +00:00
|
|
|
};
|
2011-12-13 14:48:47 +00:00
|
|
|
|
2013-04-22 19:51:09 +00:00
|
|
|
/**
|
|
|
|
* Native Parsoid implementation of the Cite extension
|
|
|
|
* that ties together <ref> and <references>
|
|
|
|
*/
|
2013-04-24 19:09:08 +00:00
|
|
|
|
2013-04-22 19:51:09 +00:00
|
|
|
var Cite = function() {
|
|
|
|
this.ref = new Ref(this);
|
|
|
|
this.references = new References(this);
|
|
|
|
};
|
|
|
|
|
2013-04-24 19:09:08 +00:00
|
|
|
Cite.prototype.resetState = function(group) {
|
2013-04-22 19:51:09 +00:00
|
|
|
this.ref.reset();
|
2013-04-24 19:09:08 +00:00
|
|
|
this.references.reset(group);
|
2013-04-22 19:51:09 +00:00
|
|
|
};
|
|
|
|
|
2012-09-17 19:46:44 +00:00
|
|
|
if (typeof module === "object") {
|
2011-12-13 14:48:47 +00:00
|
|
|
module.exports.Cite = Cite;
|
|
|
|
}
|