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 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 | 26x 26x 26x 1576x 1576x 2x 2x 1574x 3x 3x 3x 5x 5x 5x 5x 5x 5x 5x 5x 5x | import {HtmlCompilerContext, HtmlCompilerModule} from '../htmlCompiler';
import {
CompiledStyleNode,
ExternalStyleNode,
InternalStyleNode,
MimeType,
StyleNodeBind,
TagNode,
TextNode,
UncompiledStyleNode
} from '../../..';
import {resolveResPath} from '../../../fs/pathUtils';
export class StyleModule implements HtmlCompilerModule {
async enterNode(htmlContext: HtmlCompilerContext): Promise<void> {
const pipelineContext = htmlContext.pipelineContext;
if (InternalStyleNode.isInternalStyleNode(htmlContext.node)) {
// internal (inline) CSS
const src = pipelineContext.fragment.path;
await compileStyle(htmlContext.node, htmlContext.node.styleContent, src, htmlContext);
} else if (ExternalStyleNode.isExternalStyleNode(htmlContext.node)) {
// external CSS
const resPath = resolveResPath(htmlContext.node.src, pipelineContext.fragment.path);
const styleContent = await pipelineContext.pipeline.getRawText(resPath, MimeType.CSS);
await compileStyle(htmlContext.node, styleContent, htmlContext.node.src, htmlContext);
}
}
}
async function compileStyle(node: CompiledStyleNode, styleContent: string, src: string, htmlContext: HtmlCompilerContext): Promise<void> {
switch (node.bind) {
case StyleNodeBind.HEAD:
compileStyleHead(node, styleContent, htmlContext);
break;
case StyleNodeBind.LINK:
await compileStyleLink(node, src, styleContent, htmlContext);
break;
default:
throw new Error(`Unknown StyleNodeBind value: '${ node.bind }'`);
}
}
function compileStyleHead(currentNode: CompiledStyleNode, styleContent: string, htmlContext: HtmlCompilerContext): void {
// create text to hold CSS
const styleText = new TextNode(styleContent);
// if this formatting should be skipped, then set whitespace sensitivity
styleText.isWhitespaceSensitive = currentNode.skipFormat;
// create style node
const styleNode = new UncompiledStyleNode(currentNode.lang);
styleNode.appendChild(styleText);
// replace compile node
currentNode.replaceSelf([ styleNode ]);
htmlContext.setDeleted();
}
function getMimeTypeForLang(lang: string | undefined): MimeType {
switch (lang) {
case 'sass': return MimeType.SASS;
case 'scss': return MimeType.SCSS;
default: return MimeType.CSS;
}
}
async function compileStyleLink(currentNode: CompiledStyleNode, src: string, styleContent: string, htmlContext: HtmlCompilerContext): Promise<void> {
const rootResPath = htmlContext.pipelineContext.fragmentContext.rootResPath;
// write external CSS
const mimeType = getMimeTypeForLang(currentNode.lang);
const styleResPath = await htmlContext.pipelineContext.pipeline.linkResource(mimeType, styleContent, rootResPath);
// create link
const link = new TagNode('link');
link.setAttribute('rel', 'stylesheet');
link.setAttribute('href', styleResPath);
// replace
currentNode.replaceSelf([ link ]);
htmlContext.setDeleted();
}
|