Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | 26x 26x 26x 1531x 6x 6x 6x 9x 16x 15x 15x 12x 15x 3x | import {
HtmlCompilerContext,
HtmlCompilerModule
} from '../htmlCompiler';
import {
MWhitespaceNode,
MWhitespaceNodeMode,
Node,
NodeWithChildren,
NodeWithText
} from '../../..';
const NODE_TAG_IS_WHITESPACE_PROCESSED = 'WhitespaceModule.IsWhitespaceProcessed';
/**
* Compiler module that process whitespace-sensitivity.
* This module handles <m-whitespace> by setting isWhitespaceSensitive on all child nodes
*/
export class WhitespaceModule implements HtmlCompilerModule {
exitNode(htmlContext: HtmlCompilerContext): void {
// if this is an m-whitespace node, then compile
if (MWhitespaceNode.isMWhitespaceNode(htmlContext.node)) {
// apply whitespace settings to all children
const isWhitespaceSensitive = (htmlContext.node.mode === MWhitespaceNodeMode.SENSITIVE);
applyWhitespaceSettings(isWhitespaceSensitive, htmlContext.node.childNodes);
// remove node and promote children
htmlContext.node.removeSelf(true);
}
}
}
/**
* Applies whitespace sensitivity settings to one or more nodes.
* This function will also tag each processed node as having been processed for whitespace, and will skip nodes that have already been tagged.
* @param isWhitespaceSensitive If the nodes should be set to
* @param nodes Nodes to processes, can safely be empty.
*/
function applyWhitespaceSettings(isWhitespaceSensitive: boolean, nodes: Node[]): void {
// process all nodes
for (const node of nodes) {
// Skip nodes that have already been processed for whitespace.
// This is necessary to support nesting and overriding of <m-whitespace>.
// Otherwise a parent m-whitespace would overwrite the lower-level settings.
if (!node.nodeTags.has(NODE_TAG_IS_WHITESPACE_PROCESSED)) {
// Mark as processed
node.nodeTags.add(NODE_TAG_IS_WHITESPACE_PROCESSED);
// if node is a text node, then set whitespace sensitivity
if (NodeWithText.isNodeWithText(node)) {
node.isWhitespaceSensitive = isWhitespaceSensitive;
}
// process child nodes, if any
if (NodeWithChildren.isNodeWithChildren(node)) {
applyWhitespaceSettings(isWhitespaceSensitive, node.childNodes);
}
}
}
} |