UNPKG

html2canvas

Version:
324 lines (273 loc) 10.5 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.parseContent = exports.resolvePseudoContent = exports.popCounters = exports.parseCounterReset = exports.TOKEN_TYPE = exports.PSEUDO_CONTENT_ITEM_TYPE = undefined; var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); var _ListItem = require('./ListItem'); var _listStyle = require('./parsing/listStyle'); var PSEUDO_CONTENT_ITEM_TYPE = exports.PSEUDO_CONTENT_ITEM_TYPE = { TEXT: 0, IMAGE: 1 }; var TOKEN_TYPE = exports.TOKEN_TYPE = { STRING: 0, ATTRIBUTE: 1, URL: 2, COUNTER: 3, COUNTERS: 4, OPENQUOTE: 5, CLOSEQUOTE: 6 }; var parseCounterReset = exports.parseCounterReset = function parseCounterReset(style, data) { if (!style || !style.counterReset || style.counterReset === 'none') { return []; } var counterNames = []; var counterResets = style.counterReset.split(/\s*,\s*/); var lenCounterResets = counterResets.length; for (var i = 0; i < lenCounterResets; i++) { var _counterResets$i$spli = counterResets[i].split(/\s+/), _counterResets$i$spli2 = _slicedToArray(_counterResets$i$spli, 2), counterName = _counterResets$i$spli2[0], initialValue = _counterResets$i$spli2[1]; counterNames.push(counterName); var counter = data.counters[counterName]; if (!counter) { counter = data.counters[counterName] = []; } counter.push(parseInt(initialValue || 0, 10)); } return counterNames; }; var popCounters = exports.popCounters = function popCounters(counterNames, data) { var lenCounters = counterNames.length; for (var i = 0; i < lenCounters; i++) { data.counters[counterNames[i]].pop(); } }; var resolvePseudoContent = exports.resolvePseudoContent = function resolvePseudoContent(node, style, data) { if (!style || !style.content || style.content === 'none' || style.content === '-moz-alt-content' || style.display === 'none') { return null; } var tokens = parseContent(style.content); var len = tokens.length; var contentItems = []; var s = ''; // increment the counter (if there is a "counter-increment" declaration) var counterIncrement = style.counterIncrement; if (counterIncrement && counterIncrement !== 'none') { var _counterIncrement$spl = counterIncrement.split(/\s+/), _counterIncrement$spl2 = _slicedToArray(_counterIncrement$spl, 2), counterName = _counterIncrement$spl2[0], incrementValue = _counterIncrement$spl2[1]; var counter = data.counters[counterName]; if (counter) { counter[counter.length - 1] += incrementValue === undefined ? 1 : parseInt(incrementValue, 10); } } // build the content string for (var i = 0; i < len; i++) { var token = tokens[i]; switch (token.type) { case TOKEN_TYPE.STRING: s += token.value || ''; break; case TOKEN_TYPE.ATTRIBUTE: if (node instanceof HTMLElement && token.value) { s += node.getAttribute(token.value) || ''; } break; case TOKEN_TYPE.COUNTER: var _counter = data.counters[token.name || '']; if (_counter) { s += formatCounterValue([_counter[_counter.length - 1]], '', token.format); } break; case TOKEN_TYPE.COUNTERS: var _counters = data.counters[token.name || '']; if (_counters) { s += formatCounterValue(_counters, token.glue, token.format); } break; case TOKEN_TYPE.OPENQUOTE: s += getQuote(style, true, data.quoteDepth); data.quoteDepth++; break; case TOKEN_TYPE.CLOSEQUOTE: data.quoteDepth--; s += getQuote(style, false, data.quoteDepth); break; case TOKEN_TYPE.URL: if (s) { contentItems.push({ type: PSEUDO_CONTENT_ITEM_TYPE.TEXT, value: s }); s = ''; } contentItems.push({ type: PSEUDO_CONTENT_ITEM_TYPE.IMAGE, value: token.value || '' }); break; } } if (s) { contentItems.push({ type: PSEUDO_CONTENT_ITEM_TYPE.TEXT, value: s }); } return contentItems; }; var parseContent = exports.parseContent = function parseContent(content, cache) { if (cache && cache[content]) { return cache[content]; } var tokens = []; var len = content.length; var isString = false; var isEscaped = false; var isFunction = false; var str = ''; var functionName = ''; var args = []; for (var i = 0; i < len; i++) { var c = content.charAt(i); switch (c) { case "'": case '"': if (isEscaped) { str += c; } else { isString = !isString; if (!isFunction && !isString) { tokens.push({ type: TOKEN_TYPE.STRING, value: str }); str = ''; } } break; case '\\': if (isEscaped) { str += c; isEscaped = false; } else { isEscaped = true; } break; case '(': if (isString) { str += c; } else { isFunction = true; functionName = str; str = ''; args = []; } break; case ')': if (isString) { str += c; } else if (isFunction) { if (str) { args.push(str); } switch (functionName) { case 'attr': if (args.length > 0) { tokens.push({ type: TOKEN_TYPE.ATTRIBUTE, value: args[0] }); } break; case 'counter': if (args.length > 0) { var counter = { type: TOKEN_TYPE.COUNTER, name: args[0] }; if (args.length > 1) { counter.format = args[1]; } tokens.push(counter); } break; case 'counters': if (args.length > 0) { var _counters2 = { type: TOKEN_TYPE.COUNTERS, name: args[0] }; if (args.length > 1) { _counters2.glue = args[1]; } if (args.length > 2) { _counters2.format = args[2]; } tokens.push(_counters2); } break; case 'url': if (args.length > 0) { tokens.push({ type: TOKEN_TYPE.URL, value: args[0] }); } break; } isFunction = false; str = ''; } break; case ',': if (isString) { str += c; } else if (isFunction) { args.push(str); str = ''; } break; case ' ': case '\t': if (isString) { str += c; } else if (str) { addOtherToken(tokens, str); str = ''; } break; default: str += c; } if (c !== '\\') { isEscaped = false; } } if (str) { addOtherToken(tokens, str); } if (cache) { cache[content] = tokens; } return tokens; }; var addOtherToken = function addOtherToken(tokens, identifier) { switch (identifier) { case 'open-quote': tokens.push({ type: TOKEN_TYPE.OPENQUOTE }); break; case 'close-quote': tokens.push({ type: TOKEN_TYPE.CLOSEQUOTE }); break; } }; var getQuote = function getQuote(style, isOpening, quoteDepth) { var quotes = style.quotes ? style.quotes.split(/\s+/) : ["'\"'", "'\"'"]; var idx = quoteDepth * 2; if (idx >= quotes.length) { idx = quotes.length - 2; } if (!isOpening) { ++idx; } return quotes[idx].replace(/^["']|["']$/g, ''); }; var formatCounterValue = function formatCounterValue(counter, glue, format) { var len = counter.length; var result = ''; for (var i = 0; i < len; i++) { if (i > 0) { result += glue || ''; } result += (0, _ListItem.createCounterText)(counter[i], (0, _listStyle.parseListStyleType)(format || 'decimal'), false); } return result; };