mirror of
https://github.com/Jermolene/TiddlyWiki5
synced 2024-11-27 03:57:21 +00:00
parent
882e040e62
commit
00927d2e13
68
core/modules/parsers/wikiparser/rules/parsermode.js
Normal file
68
core/modules/parsers/wikiparser/rules/parsermode.js
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
/*\
|
||||||
|
title: $:/core/modules/parsers/wikiparser/rules/parsermode.js
|
||||||
|
type: application/javascript
|
||||||
|
module-type: wikirule
|
||||||
|
|
||||||
|
Wiki pragma rule for parser mode specifications
|
||||||
|
|
||||||
|
```
|
||||||
|
\parsermode block
|
||||||
|
\parsermode inline
|
||||||
|
```
|
||||||
|
|
||||||
|
\*/
|
||||||
|
(function(){
|
||||||
|
|
||||||
|
/*jslint node: true, browser: true */
|
||||||
|
/*global $tw: false */
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
exports.name = "parsermode";
|
||||||
|
exports.types = {pragma: true};
|
||||||
|
|
||||||
|
/*
|
||||||
|
Instantiate parse rule
|
||||||
|
*/
|
||||||
|
exports.init = function(parser) {
|
||||||
|
this.parser = parser;
|
||||||
|
// Regexp to match
|
||||||
|
this.matchRegExp = /^\\parsermode[^\S\n]/mg;
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
Parse the most recent match
|
||||||
|
*/
|
||||||
|
exports.parse = function() {
|
||||||
|
// Move past the pragma invocation
|
||||||
|
this.parser.pos = this.matchRegExp.lastIndex;
|
||||||
|
// Parse whitespace delimited tokens terminated by a line break
|
||||||
|
var reMatch = /[^\S\n]*(\S+)|(\r?\n)/mg,
|
||||||
|
parserMode = undefined;
|
||||||
|
reMatch.lastIndex = this.parser.pos;
|
||||||
|
var match = reMatch.exec(this.parser.source);
|
||||||
|
while(match && match.index === this.parser.pos) {
|
||||||
|
this.parser.pos = reMatch.lastIndex;
|
||||||
|
// Exit if we've got the line break
|
||||||
|
if(match[2]) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
// Process the token
|
||||||
|
if(match[1]) {
|
||||||
|
parserMode = match[1];
|
||||||
|
}
|
||||||
|
// Match the next token
|
||||||
|
match = reMatch.exec(this.parser.source);
|
||||||
|
}
|
||||||
|
// Process the tokens
|
||||||
|
if(parserMode !== undefined) {
|
||||||
|
if(parserMode === "block") {
|
||||||
|
this.parser.parseAsInline = false;
|
||||||
|
} else if(parserMode === "inline") {
|
||||||
|
this.parser.parseAsInline = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// No parse tree nodes to return
|
||||||
|
return [];
|
||||||
|
};
|
||||||
|
|
||||||
|
})();
|
@ -47,6 +47,8 @@ var WikiParser = function(type,text,options) {
|
|||||||
this.sourceLength = this.source.length;
|
this.sourceLength = this.source.length;
|
||||||
// Flag for ignoring whitespace
|
// Flag for ignoring whitespace
|
||||||
this.configTrimWhiteSpace = false;
|
this.configTrimWhiteSpace = false;
|
||||||
|
// Parser mode
|
||||||
|
this.parseAsInline = options.parseAsInline;
|
||||||
// Set current parse position
|
// Set current parse position
|
||||||
this.pos = 0;
|
this.pos = 0;
|
||||||
// Start with empty output
|
// Start with empty output
|
||||||
@ -83,7 +85,7 @@ var WikiParser = function(type,text,options) {
|
|||||||
// Parse any pragmas
|
// Parse any pragmas
|
||||||
var topBranch = this.parsePragmas();
|
var topBranch = this.parsePragmas();
|
||||||
// Parse the text into inline runs or blocks
|
// Parse the text into inline runs or blocks
|
||||||
if(options.parseAsInline) {
|
if(this.parseAsInline) {
|
||||||
topBranch.push.apply(topBranch,this.parseInlineRun());
|
topBranch.push.apply(topBranch,this.parseInlineRun());
|
||||||
} else {
|
} else {
|
||||||
topBranch.push.apply(topBranch,this.parseBlocks());
|
topBranch.push.apply(topBranch,this.parseBlocks());
|
||||||
|
36
editions/test/tiddlers/tests/data/pragmas/Parsermode.tid
Normal file
36
editions/test/tiddlers/tests/data/pragmas/Parsermode.tid
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
title: Pragmas/Parsermode
|
||||||
|
description: parsermode pragma
|
||||||
|
type: text/vnd.tiddlywiki-multiple
|
||||||
|
tags: [[$:/tags/wiki-test-spec]]
|
||||||
|
|
||||||
|
title: Output
|
||||||
|
|
||||||
|
{{AlwaysInline}}
|
||||||
|
|
||||||
|
{{AlwaysBlock}}
|
||||||
|
|
||||||
|
{{AlwaysInline}}{{AlwaysBlock}}
|
||||||
|
|
||||||
|
+
|
||||||
|
title: AlwaysInline
|
||||||
|
|
||||||
|
\parsermode inline
|
||||||
|
! Not Heading
|
||||||
|
|
||||||
|
Text with ''bold''
|
||||||
|
+
|
||||||
|
title: AlwaysBlock
|
||||||
|
|
||||||
|
\parsermode block
|
||||||
|
! Heading
|
||||||
|
|
||||||
|
Text with ''bold''
|
||||||
|
+
|
||||||
|
title: ExpectedResult
|
||||||
|
|
||||||
|
! Not Heading
|
||||||
|
|
||||||
|
Text with <strong>bold</strong><h1 class="">Heading</h1><p>Text with <strong>bold</strong></p><p>! Not Heading
|
||||||
|
|
||||||
|
Text with <strong>bold</strong><h1 class="">Heading</h1><p>Text with <strong>bold</strong></p>
|
||||||
|
</p>
|
17
editions/tw5.com/tiddlers/pragmas/Pragma_ _parsermode.tid
Normal file
17
editions/tw5.com/tiddlers/pragmas/Pragma_ _parsermode.tid
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
created: 20221123223127425
|
||||||
|
modified: 20221123223127425
|
||||||
|
tags: Pragmas
|
||||||
|
title: Pragma: \parsermode
|
||||||
|
type: text/vnd.tiddlywiki
|
||||||
|
|
||||||
|
The ''\parsermode'' [[pragma|Pragmas]] adjusts whether the remaining text is parsed in block mode or inline mode. See [[WikiText Parser Modes]] for details of parser modes.
|
||||||
|
|
||||||
|
```
|
||||||
|
\parsermode block|inline
|
||||||
|
```
|
||||||
|
|
||||||
|
For example:
|
||||||
|
|
||||||
|
```
|
||||||
|
\parsermode inline
|
||||||
|
```
|
@ -10,7 +10,7 @@ In order to display Tiddlers (usually the text field), the WikiText parser reads
|
|||||||
* ''block mode'' - the parser will recognise only [[block mode WikiText|Block Mode WikiText]] punctuation
|
* ''block mode'' - the parser will recognise only [[block mode WikiText|Block Mode WikiText]] punctuation
|
||||||
* ''inline mode'' - the parser will recognise only [[inline mode WikiText|Inline Mode WikiText]]
|
* ''inline mode'' - the parser will recognise only [[inline mode WikiText|Inline Mode WikiText]]
|
||||||
|
|
||||||
The parser [[transitions between these modes|WikiText parser mode transitions]] based on the text it encounters. In addition, there are [[places where the parser ignores WikiText|Places where the parser ignores WikiText]] punctuation.
|
The parser [[transitions between these modes|WikiText parser mode transitions]] based on the text it encounters. In addition, there are [[places where the parser ignores WikiText|Places where the parser ignores WikiText]] punctuation. The parser mode can also be set directly with the [[Pragma: \parsermode]].
|
||||||
|
|
||||||
<<.tip "The concept of inline vs block also exists for standard HTML elements. For HTML, these [[two layout modes|https://www.w3schools.com/html/html_blocks.asp]] determine if the output flows together on the same line or not.
|
<<.tip "The concept of inline vs block also exists for standard HTML elements. For HTML, these [[two layout modes|https://www.w3schools.com/html/html_blocks.asp]] determine if the output flows together on the same line or not.
|
||||||
<p>Most [[block mode WikiText|Block Mode WikiText]] corresponds to [[block level HTML elements|https://developer.mozilla.org/en-US/docs/Web/HTML/Block-level_elements]] and most [[inline mode WikiText|Inline Mode WikiText]] corresponds to [[inline level HTML elements|https://developer.mozilla.org/en-US/docs/Web/HTML/Inline_elements]]. However, for Wikitext the two modes are just as important for determining which syntax will be recognised by the parser as they are for determining how the output will flow.</p>">>
|
<p>Most [[block mode WikiText|Block Mode WikiText]] corresponds to [[block level HTML elements|https://developer.mozilla.org/en-US/docs/Web/HTML/Block-level_elements]] and most [[inline mode WikiText|Inline Mode WikiText]] corresponds to [[inline level HTML elements|https://developer.mozilla.org/en-US/docs/Web/HTML/Inline_elements]]. However, for Wikitext the two modes are just as important for determining which syntax will be recognised by the parser as they are for determining how the output will flow.</p>">>
|
Loading…
Reference in New Issue
Block a user