From c3a2a24b7626de645257a5b661810d738a6ad120 Mon Sep 17 00:00:00 2001 From: Jeremy Ruston Date: Sun, 23 Dec 2012 10:37:18 +0000 Subject: [PATCH] Introduce filtered transclusion syntax --- .../rules/filteredtranscludeblock.js | 65 +++++++++++++++++++ core/templates/NewPageTemplate.tid | 4 +- 2 files changed, 68 insertions(+), 1 deletion(-) create mode 100644 core/modules/parsers/wikiparser/rules/filteredtranscludeblock.js diff --git a/core/modules/parsers/wikiparser/rules/filteredtranscludeblock.js b/core/modules/parsers/wikiparser/rules/filteredtranscludeblock.js new file mode 100644 index 000000000..69e69ce74 --- /dev/null +++ b/core/modules/parsers/wikiparser/rules/filteredtranscludeblock.js @@ -0,0 +1,65 @@ +/*\ +title: $:/core/modules/parsers/wikiparser/rules/filteredtranscludeblock.js +type: application/javascript +module-type: wikirule + +Wiki text rule for block-level filtered transclusion. For example: + +``` +{{{ [tag[docs]] }}} +{{{ [tag[docs]] |tooltip}}} +{{{ [tag[docs]] ||TemplateTitle}}} +{{{ [tag[docs]] |tooltip||TemplateTitle}}} +{{{ [tag[docs]] }}width:40;height:50;}.class.class +``` + +\*/ +(function(){ + +/*jslint node: true, browser: true */ +/*global $tw: false */ +"use strict"; + +exports.name = "filteredtransclude"; +exports.types = {block: true}; + +exports.init = function(parser) { + this.parser = parser; + // Regexp to match + this.matchRegExp = /\{\{\{([^\{\}\|]+)(?:\|([^\|\{\}]+))?(?:\|\|([^\|\{\}]+))?\}\}([^\}]*)\}(?:\.(\S+))?(?:\r?\n|$)/mg; +}; + +exports.parse = function() { + // Move past the match + this.parser.pos = this.matchRegExp.lastIndex; + // Get the match details + var filter = this.match[1], + tooltip = this.match[2], + template = this.match[3], + style = this.match[4], + classes = this.match[5]; + // Return the list widget + var node = { + type: "widget", + tag: "list", + attributes: { + filter: {type: "string", value: filter} + }, + isBlock: true + }; + if(tooltip) { + node.attributes.tooltip = {type: "string", value: tooltip}; + } + if(template) { + node.attributes.template = {type: "string", value: template}; + } + if(style) { + node.attributes.style = {type: "string", value: style}; + } + if(classes) { + node.attributes["itemClass"] = {type: "string", value: classes.split(".").join(" ")}; + } + return [node]; +}; + +})(); diff --git a/core/templates/NewPageTemplate.tid b/core/templates/NewPageTemplate.tid index ea48e4cc6..1d0eb8268 100644 --- a/core/templates/NewPageTemplate.tid +++ b/core/templates/NewPageTemplate.tid @@ -14,6 +14,8 @@ New paragraph *.disabled Is a * List!! +{{{ [tag[docs]tag[introduction]sort[title]] ||$:/templates/NewViewTemplate}}}.anotherClassy + <> Inline macro call: <> @@ -23,7 +25,7 @@ Inline macro call: <> | this | is | a | table | | yes | indeed |>| it is | -{{Acknowledgements|with a tooltip}width:40;height:50;background-color:red;}.one +{{Acknowledgements|with a tooltip||$:/templates/NewViewTemplate}width:40;height:50;background-color:red;}.one And this is an inline transclusion {{Acknowledgements}width:40;height:50;}.one