1
0
mirror of https://github.com/Jermolene/TiddlyWiki5 synced 2026-04-30 10:41:30 +00:00

Allow block mode content within an if/then/else clause

This commit is contained in:
Jeremy Ruston
2023-09-14 10:05:20 +01:00
parent 775860110c
commit 4a2a04f4c7
4 changed files with 54 additions and 13 deletions

View File

@@ -17,7 +17,7 @@ This is a <% if [{something}] %>Elephant<% elseif [{else}] %>Pelican<% else %>Cr
"use strict";
exports.name = "conditional";
exports.types = {inline: true, block: false};
exports.types = {inline: true, block: true};
exports.init = function(parser) {
this.parser = parser;
@@ -53,10 +53,11 @@ exports.parse = function() {
var filterCondition = this.parser.source.substring(this.match.index + this.match[0].length,this.terminateIfMatch.index);
// Advance the parser position to past the %>
this.parser.pos = this.terminateIfMatch.index + this.terminateIfMatch[0].length;
return this.parseIfBlock(filterCondition);
// Parse the if clause
return this.parseIfClause(filterCondition);
};
exports.parseIfBlock = function(filterCondition) {
exports.parseIfClause = function(filterCondition) {
// Create the list widget
var listWidget = {
type: "list",
@@ -76,10 +77,12 @@ exports.parseIfBlock = function(filterCondition) {
$tw.utils.addAttributeToParseTreeNode(listWidget,"filter",filterCondition);
$tw.utils.addAttributeToParseTreeNode(listWidget,"variable","condition");
$tw.utils.addAttributeToParseTreeNode(listWidget,"limit","1");
// Check for an immediately following double linebreak
var hasLineBreak = !!$tw.utils.parseTokenRegExp(this.parser.source,this.parser.pos,/([^\S\n\r]*\r?\n(?:[^\S\n\r]*\r?\n|$))/g);
// Parse the body looking for else or endif
var reEndString = "\\<\\%\\s*(endif)\\s*\\%\\>|\\<\\%\\s*(else)\\s*\\%\\>|\\<\\%\\s*(elseif)\\s+([\\s\\S]+?)\\%\\>",
ex;
if(this.is.block) {
if(hasLineBreak) {
ex = this.parser.parseBlocksTerminatedExtended(reEndString);
} else {
var reEnd = new RegExp(reEndString,"mg");
@@ -92,10 +95,12 @@ exports.parseIfBlock = function(filterCondition) {
if(ex.match[1] === "endif") {
// Nothing to do if we just found an endif
} else if(ex.match[2] === "else") {
// Check for an immediately following double linebreak
hasLineBreak = !!$tw.utils.parseTokenRegExp(this.parser.source,this.parser.pos,/([^\S\n\r]*\r?\n(?:[^\S\n\r]*\r?\n|$))/g);
// If we found an else then we need to parse the body looking for the endif
var reEndString = "\\<\\%\\s*(endif)\\s*\\%\\>",
ex;
if(this.is.block) {
if(hasLineBreak) {
ex = this.parser.parseBlocksTerminatedExtended(reEndString);
} else {
var reEnd = new RegExp(reEndString,"mg");
@@ -104,8 +109,8 @@ exports.parseIfBlock = function(filterCondition) {
// Put the parsed content inside the list empty template
listWidget.children[1].children = ex.tree;
} else if(ex.match[3] === "elseif") {
// Parse the elseif block by reusing this parser, passing the new filter condition
listWidget.children[1].children = this.parseIfBlock(ex.match[4]);
// Parse the elseif clause by reusing this parser, passing the new filter condition
listWidget.children[1].children = this.parseIfClause(ex.match[4]);
}
}
// Return the parse tree node

View File

@@ -223,7 +223,7 @@ Parse a block from the current position
terminatorRegExpString: optional regular expression string that identifies the end of plain paragraphs. Must not include capturing parenthesis
*/
WikiParser.prototype.parseBlock = function(terminatorRegExpString) {
var terminatorRegExp = terminatorRegExpString ? new RegExp("(" + terminatorRegExpString + "|\\r?\\n\\r?\\n)","mg") : /(\r?\n\r?\n)/mg;
var terminatorRegExp = terminatorRegExpString ? new RegExp(terminatorRegExpString + "|\\r?\\n\\r?\\n","mg") : /(\r?\n\r?\n)/mg;
this.skipWhitespace();
if(this.pos >= this.sourceLength) {
return [];
@@ -275,7 +275,7 @@ WikiParser.prototype.parseBlocksTerminated = function(terminatorRegExpString) {
Parse blocks of text until a terminating regexp is encountered
*/
WikiParser.prototype.parseBlocksTerminatedExtended = function(terminatorRegExpString) {
var terminatorRegExp = new RegExp("(" + terminatorRegExpString + ")","mg"),
var terminatorRegExp = new RegExp(terminatorRegExpString,"mg"),
result = {
tree: []
};

View File

@@ -0,0 +1,37 @@
title: Conditionals/BlockMode
description: Basic conditional shortcut syntax in block mode
type: text/vnd.tiddlywiki-multiple
tags: [[$:/tags/wiki-test-spec]]
title: Output
\procedure test(animal)
<% if [<animal>match[Elephant]] %>
! It is an elephant
<% else %>
<% if [<animal>match[Giraffe]] %>
! It is a giraffe
<% else %>
! It is completely unknown
<% endif %>
<% endif %>
\end
<<test "Giraffe">>
<<test "Elephant">>
<<test "Antelope">>
+
title: ExpectedResult
<h1 class="">It is a giraffe</h1><h1 class="">It is an elephant</h1><h1 class="">It is completely unknown</h1>

View File

@@ -26,14 +26,13 @@ It is completely unknown
+
title: ExpectedResult
<p>
It is a giraffe
</p><p>
It is an elephant
</p><p>
It is completely unknown
</p>