+ * @param {boolean} trimTrailing
+ * @returns {string}
+ */
+ function parseConsecutiveLists(list, listType, trimTrailing) {
+ // check if we caught 2 or more consecutive lists by mistake
+ // we use the counterRgx, meaning if listType is UL we look for UL and vice versa
+ let counterRxg = (listType === 'ul') ? /^ {0,2}\d+\.[ \t]/gm : /^ {0,2}[*+-][ \t]/gm;
+ const subLists = [];
+ let result = '';
+
+ if (list.search(counterRxg) !== -1) {
+ (function parseCL(txt) {
+ const pos = txt.search(counterRxg);
+ if (pos !== -1) {
+ // slice
+ result += `\n\n<${listType}>${processListItems(txt.slice(0, pos), !!trimTrailing)}</${listType}>\n\n`;
+
+ // invert counterType and listType
+ listType = (listType === 'ul') ? 'ol' : 'ul';
+ counterRxg = (listType === 'ul') ? /^ {0,2}\d+\.[ \t]/gm : /^ {0,2}[*+-][ \t]/gm;
+
+ // recurse
+ parseCL(txt.slice(pos));
+ } else {
+ result += `\n\n<${listType}>${processListItems(txt, !!trimTrailing)}</${listType}>\n\n`;
+ }
+ }(list));
+ for (let i = 0; i < subLists.length; ++i) {
+
+ }
+ } else {
+ result = `\n\n<${listType}>${processListItems(list, !!trimTrailing)}</${listType}>\n\n`;
+ }
+
+ return result;
+ }
+
+ // attacklab: add sentinel to hack around khtml/safari bug:
+ // http://bugs.webkit.org/show_bug.cgi?id=11231
+ text += '~0';
+
+ // Re-usable pattern to match any entire ul or ol list:
+ let wholeList = /^(([ ]{0,3}([*+-]|\d+[.])[ \t]+)[^\r]+?(~0|\n{2,}(?=\S)(?![ \t]*(?:[*+-]|\d+[.])[ \t]+)))/gm;
+
+ if (globals.gListLevel) {
+ text = text.replace(wholeList, (wholeMatch, list, m2) => {
+ const listType = (m2.search(/[*+-]/g) > -1) ? 'ul' : 'ol';
+ return parseConsecutiveLists(list, listType, true);
+ });
+ } else {
+ wholeList = /(\n\n|^\n?)(([ ]{0,3}([*+-]|\d+[.])[ \t]+)[^\r]+?(~0|\n{2,}(?=\S)(?![ \t]*(?:[*+-]|\d+[.])[ \t]+)))/gm;
+ // wholeList = /(\n\n|^\n?)( {0,3}([*+-]|\d+\.)[ \t]+[\s\S]+?)(?=(~0)|(\n\n(?!\t| {2,}| {0,3}([*+-]|\d+\.)[ \t])))/g;
+ text = text.replace(wholeList, (wholeMatch, m1, list, m3) => {
+ const listType = (m3.search(/[*+-]/g) > -1) ? 'ul' : 'ol';
+ return parseConsecutiveLists(list, listType);
+ });
+ }
+
+ // attacklab: strip sentinel
+ text = text.replace(/~0/, '');
+
+ text = globals.converter._dispatch('lists.after', text, options, globals);
+ return text;
+});
+
+/**
+ * Remove one level of line-leading tabs or spaces
+ */
+showdown.subParser('outdent', (text) => {
+ // attacklab: hack around Konqueror 3.5.4 bug:
+ // "----------bug".replace(/^-/g,"") == "bug"
+ text = text.replace(/^(\t|[ ]{1,4})/gm, '~0'); // attacklab: g_tab_width
+
+ // attacklab: clean up hack
+ text = text.replace(/~0/g, '');
+
+ return text;
+});
+
+/**
+ *
+ */
+showdown.subParser('paragraphs', (text, options, globals) => {
+ text = globals.converter._dispatch('paragraphs.before', text, options, globals);
+ // Strip leading and trailing lines:
+ text = text.replace(/^\n+/g, '');
+ text = text.replace(/\n+$/g, '');
+
+ const grafs = text.split(/\n{2,}/g);
+ const grafsOut = [];
+ let end = grafs.length; // Wrap <p> tags
+
+ for (var i = 0; i < end; i++) {
+ let str = grafs[i];
+ // if this is an HTML marker, copy it
+ if (str.search(/~(K|G)(\d+)\1/g) >= 0) {
+ grafsOut.push(str);
+ } else {
+ str = showdown.subParser('spanGamut')(str, options, globals);
+ str = str.replace(/^([ \t]*)/g, '<p>');
+ str += '</p>';
+ grafsOut.push(str);
+ }
+ }
+
+ /** Unhashify HTML blocks */
+ end = grafsOut.length;
+ for (i = 0; i < end; i++) {
+ let blockText = '';
+ let grafsOutIt = grafsOut[i];
+ let codeFlag = false;
+ // if this is a marker for an html block...
+ while (grafsOutIt.search(/~(K|G)(\d+)\1/) >= 0) {
+ const delim = RegExp.$1;
+ const num = RegExp.$2;
+
+ if (delim === 'K') {
+ blockText = globals.gHtmlBlocks[num];
+ } else {
+ // we need to check if ghBlock is a false positive
+ if (codeFlag) {
+ // use encoded version of all text
+ blockText = showdown.subParser('encodeCode')(globals.ghCodeBlocks[num].text);
+ } else {
+ blockText = globals.ghCodeBlocks[num].codeblock;
+ }
+ }
+ blockText = blockText.replace(/\$/g, '$$$$'); // Escape any dollar signs
+
+ grafsOutIt = grafsOutIt.replace(/(\n\n)?~(K|G)\d+\2(\n\n)?/, blockText);
+ // Check if grafsOutIt is a pre->code
+ if (/^<pre\b[^>]*>\s*<code\b[^>]*>/.test(grafsOutIt)) {
+ codeFlag = true;
+ }
+ }
+ grafsOut[i] = grafsOutIt;
+ }
+ text = grafsOut.join('\n\n');
+ // Strip leading and trailing lines:
+ text = text.replace(/^\n+/g, '');
+ text = text.replace(/\n+$/g, '');
+ return globals.converter._dispatch('paragraphs.after', text, options, globals);
+});
+
+/**
+ * Run extension
+ */
+showdown.subParser('runExtension', (ext, text, options, globals) => {
+ if (ext.filter) {
+ text = ext.filter(text, globals.converter, options);
+ } else if (ext.regex) {
+ // TODO remove this when old extension loading mechanism is deprecated
+ let re = ext.regex;
+ if (!re instanceof RegExp) {
+ re = new RegExp(re, 'g');
+ }
+ text = text.replace(re, ext.replace);
+ }
+
+ return text;
+});
+
+/**
+ * These are all the transformations that occur *within* block-level
+ * tags like paragraphs, headers, and list items.
+ */
+showdown.subParser('spanGamut', (text, options, globals) => {
+ text = globals.converter._dispatch('spanGamut.before', text, options, globals);
+ text = showdown.subParser('codeSpans')(text, options, globals);
+ text = showdown.subParser('escapeSpecialCharsWithinTagAttributes')(text, options, globals);
+ text = showdown.subParser('encodeBackslashEscapes')(text, options, globals);
+
+ // Process anchor and image tags. Images must come first,
+ // because ![foo][f] looks like an anchor.
+ text = showdown.subParser('images')(text, options, globals);
+ text = showdown.subParser('anchors')(text, options, globals);
+
+ // Make links out of things like `<http://example.com/>`
+ // Must come after _DoAnchors(), because you can use < and >
+ // delimiters in inline links like [this](<url>).
+ text = showdown.subParser('autoLinks')(text, options, globals);
+ text = showdown.subParser('encodeAmpsAndAngles')(text, options, globals);
+ text = showdown.subParser('italicsAndBold')(text, options, globals);
+ text = showdown.subParser('strikethrough')(text, options, globals);
+
+ // Do hard breaks:
+ text = text.replace(/ +\n/g, ' <br />\n');
+
+ text = globals.converter._dispatch('spanGamut.after', text, options, globals);
+ return text;
+});
+
+showdown.subParser('strikethrough', (text, options, globals) => {
+ if (options.strikethrough) {
+ text = globals.converter._dispatch('strikethrough.before', text, options, globals);
+ text = text.replace(/(?:~T){2}([\s\S]+?)(?:~T){2}/g, '<del>$1</del>');
+ text = globals.converter._dispatch('strikethrough.after', text, options, globals);
+ }
+
+ return text;
+});
+
+/**
+ * Strip any lines consisting only of spaces and tabs.
+ * This makes subsequent regexs easier to write, because we can
+ * match consecutive blank lines with /\n+/ instead of something
+ * contorted like /[ \t]*\n+/
+ */
+showdown.subParser('stripBlankLines', (text) => text.replace(/^[ \t]+$/mg, ''));
+
+/**
+ * Strips link definitions from text, stores the URLs and titles in
+ * hash references.
+ * Link defs are in the form: ^[id]: url "optional title"
+ *
+ * ^[ ]{0,3}\[(.+)\]: // id = $1 attacklab: g_tab_width - 1
+ * [ \t]*
+ * \n? // maybe *one* newline
+ * [ \t]*
+ * <?(\S+?)>? // url = $2
+ * [ \t]*
+ * \n? // maybe one newline
+ * [ \t]*
+ * (?:
+ * (\n*) // any lines skipped = $3 attacklab: lookbehind removed
+ * ["(]
+ * (.+?) // title = $4
+ * [")]
+ * [ \t]*
+ * )? // title is optional
+ * (?:\n+|$)
+ * /gm,
+ * function(){...});
+ *
+ */
+showdown.subParser('stripLinkDefinitions', (text, options, globals) => {
+ const regex = /^ {0,3}\[(.+)]:[ \t]*\n?[ \t]*<?(\S+?)>?(?: =([*\d]+[A-Za-z%]{0,4})x([*\d]+[A-Za-z%]{0,4}))?[ \t]*\n?[ \t]*(?:(\n*)["|'(](.+?)["|')][ \t]*)?(?:\n+|(?=~0))/gm;
+
+ // attacklab: sentinel workarounds for lack of \A and \Z, safari\khtml bug
+ text += '~0';
+
+ text = text.replace(regex, (wholeMatch, linkId, url, width, height, blankLines, title) => {
+ linkId = linkId.toLowerCase();
+ globals.gUrls[linkId] = showdown.subParser('encodeAmpsAndAngles')(url); // Link IDs are case-insensitive
+
+ if (blankLines) {
+ // Oops, found blank lines, so it's not a title.
+ // Put back the parenthetical statement we stole.
+ return blankLines + title;
+ }
+ if (title) {
+ globals.gTitles[linkId] = title.replace(/"|'/g, '"');
+ }
+ if (options.parseImgDimensions && width && height) {
+ globals.gDimensions[linkId] = {
+ width,
+ height,
+ };
+ }
+
+ // Completely remove the definition from the text
+ return '';
+ });
+
+ // attacklab: strip sentinel
+ text = text.replace(/~0/, '');
+
+ return text;
+});
+
+showdown.subParser('tables', (text, options, globals) => {
+ if (!options.tables) {
+ return text;
+ }
+
+ const tableRgx = /^[ \t]{0,3}\|?.+\|.+\n[ \t]{0,3}\|?[ \t]*:?[ \t]*(?:-|=){2,}[ \t]*:?[ \t]*\|[ \t]*:?[ \t]*(?:-|=){2,}[\s\S]+?(?:\n\n|~0)/gm;
+
+ function parseStyles(sLine) {
+ if (/^:[ \t]*--*$/.test(sLine)) {
+ return ' style="text-align:left;"';
+ } if (/^--*[ \t]*:[ \t]*$/.test(sLine)) {
+ return ' style="text-align:right;"';
+ } if (/^:[ \t]*--*[ \t]*:$/.test(sLine)) {
+ return ' style="text-align:center;"';
+ }
+ return '';
+ }
+
+ function parseHeaders(header, style) {
+ let id = '';
+ header = header.trim();
+ if (options.tableHeaderId) {
+ id = ` id="${header.replace(/ /g, '_').toLowerCase()}"`;
+ }
+ header = showdown.subParser('spanGamut')(header, options, globals);
+
+ return `<th${id}${style}>${header}</th>\n`;
+ }
+
+ function parseCells(cell, style) {
+ const subText = showdown.subParser('spanGamut')(cell, options, globals);
+ return `<td${style}>${subText}</td>\n`;
+ }
+
+ function buildTable(headers, cells) {
+ let tb = '<table>\n<thead>\n<tr>\n';
+ const tblLgn = headers.length;
+
+ for (var i = 0; i < tblLgn; ++i) {
+ tb += headers[i];
+ }
+ tb += '</tr>\n</thead>\n<tbody>\n';
+
+ for (i = 0; i < cells.length; ++i) {
+ tb += '<tr>\n';
+ for (let ii = 0; ii < tblLgn; ++ii) {
+ tb += cells[i][ii];
+ }
+ tb += '</tr>\n';
+ }
+ tb += '</tbody>\n</table>\n';
+ return tb;
+ }
+
+ text = globals.converter._dispatch('tables.before', text, options, globals);
+
+ text = text.replace(tableRgx, (rawTable) => {
+ let i; const
+ tableLines = rawTable.split('\n');
+
+ // strip wrong first and last column if wrapped tables are used
+ for (i = 0; i < tableLines.length; ++i) {
+ if (/^[ \t]{0,3}\|/.test(tableLines[i])) {
+ tableLines[i] = tableLines[i].replace(/^[ \t]{0,3}\|/, '');
+ }
+ if (/\|[ \t]*$/.test(tableLines[i])) {
+ tableLines[i] = tableLines[i].replace(/\|[ \t]*$/, '');
+ }
+ }
+
+ const rawHeaders = tableLines[0].split('|').map((s) => s.trim());
+ const rawStyles = tableLines[1].split('|').map((s) => s.trim());
+ const rawCells = [];
+ const headers = [];
+ const styles = [];
+ const cells = [];
+
+ tableLines.shift();
+ tableLines.shift();
+
+ for (i = 0; i < tableLines.length; ++i) {
+ if (tableLines[i].trim() === '') {
+ continue;
+ }
+ rawCells.push(
+ tableLines[i]
+ .split('|')
+ .map((s) => s.trim()),
+ );
+ }
+
+ if (rawHeaders.length < rawStyles.length) {
+ return rawTable;
+ }
+
+ for (i = 0; i < rawStyles.length; ++i) {
+ styles.push(parseStyles(rawStyles[i]));
+ }
+
+ for (i = 0; i < rawHeaders.length; ++i) {
+ if (showdown.helper.isUndefined(styles[i])) {
+ styles[i] = '';
+ }
+ headers.push(parseHeaders(rawHeaders[i], styles[i]));
+ }
+
+ for (i = 0; i < rawCells.length; ++i) {
+ const row = [];
+ for (let ii = 0; ii < headers.length; ++ii) {
+ if (showdown.helper.isUndefined(rawCells[i][ii])) {
+
+ }
+ row.push(parseCells(rawCells[i][ii], styles[ii]));
+ }
+ cells.push(row);
+ }
+
+ return buildTable(headers, cells);
+ });
+
+ text = globals.converter._dispatch('tables.after', text, options, globals);
+
+ return text;
+});
+
+/**
+ * Swap back in all the special characters we've hidden.
+ */
+showdown.subParser('unescapeSpecialChars', (text) => {
+ text = text.replace(/~E(\d+)E/g, (wholeMatch, m1) => {
+ const charCodeToReplace = parseInt(m1);
+ return String.fromCharCode(charCodeToReplace);
+ });
+ return text;
+});
+module.exports = showdown;
@@ -0,0 +1,206 @@ |
||
| 1 |
+// HTML 支持的数学符号 |
|
| 2 |
+function strNumDiscode(str) {
|
|
| 3 |
+ str = str.replace(/∀/g, '∀'); |
|
| 4 |
+ str = str.replace(/∂/g, '∂'); |
|
| 5 |
+ str = str.replace(/&exists;/g, '∃'); |
|
| 6 |
+ str = str.replace(/∅/g, '∅'); |
|
| 7 |
+ str = str.replace(/∇/g, '∇'); |
|
| 8 |
+ str = str.replace(/∈/g, '∈'); |
|
| 9 |
+ str = str.replace(/∉/g, '∉'); |
|
| 10 |
+ str = str.replace(/∋/g, '∋'); |
|
| 11 |
+ str = str.replace(/∏/g, '∏'); |
|
| 12 |
+ str = str.replace(/∑/g, '∑'); |
|
| 13 |
+ str = str.replace(/−/g, '−'); |
|
| 14 |
+ str = str.replace(/∗/g, '∗'); |
|
| 15 |
+ str = str.replace(/√/g, '√'); |
|
| 16 |
+ str = str.replace(/∝/g, '∝'); |
|
| 17 |
+ str = str.replace(/∞/g, '∞'); |
|
| 18 |
+ str = str.replace(/∠/g, '∠'); |
|
| 19 |
+ str = str.replace(/∧/g, '∧'); |
|
| 20 |
+ str = str.replace(/∨/g, '∨'); |
|
| 21 |
+ str = str.replace(/∩/g, '∩'); |
|
| 22 |
+ str = str.replace(/∩/g, '∪'); |
|
| 23 |
+ str = str.replace(/∫/g, '∫'); |
|
| 24 |
+ str = str.replace(/∴/g, '∴'); |
|
| 25 |
+ str = str.replace(/∼/g, '∼'); |
|
| 26 |
+ str = str.replace(/≅/g, '≅'); |
|
| 27 |
+ str = str.replace(/≈/g, '≈'); |
|
| 28 |
+ str = str.replace(/≠/g, '≠'); |
|
| 29 |
+ str = str.replace(/≤/g, '≤'); |
|
| 30 |
+ str = str.replace(/≥/g, '≥'); |
|
| 31 |
+ str = str.replace(/⊂/g, '⊂'); |
|
| 32 |
+ str = str.replace(/⊃/g, '⊃'); |
|
| 33 |
+ str = str.replace(/⊄/g, '⊄'); |
|
| 34 |
+ str = str.replace(/⊆/g, '⊆'); |
|
| 35 |
+ str = str.replace(/⊇/g, '⊇'); |
|
| 36 |
+ str = str.replace(/⊕/g, '⊕'); |
|
| 37 |
+ str = str.replace(/⊗/g, '⊗'); |
|
| 38 |
+ str = str.replace(/⊥/g, '⊥'); |
|
| 39 |
+ str = str.replace(/⋅/g, '⋅'); |
|
| 40 |
+ return str; |
|
| 41 |
+} |
|
| 42 |
+ |
|
| 43 |
+// HTML 支持的希腊字母 |
|
| 44 |
+function strGreeceDiscode(str) {
|
|
| 45 |
+ str = str.replace(/Α/g, 'Α'); |
|
| 46 |
+ str = str.replace(/Β/g, 'Β'); |
|
| 47 |
+ str = str.replace(/Γ/g, 'Γ'); |
|
| 48 |
+ str = str.replace(/Δ/g, 'Δ'); |
|
| 49 |
+ str = str.replace(/Ε/g, 'Ε'); |
|
| 50 |
+ str = str.replace(/Ζ/g, 'Ζ'); |
|
| 51 |
+ str = str.replace(/Η/g, 'Η'); |
|
| 52 |
+ str = str.replace(/Θ/g, 'Θ'); |
|
| 53 |
+ str = str.replace(/Ι/g, 'Ι'); |
|
| 54 |
+ str = str.replace(/Κ/g, 'Κ'); |
|
| 55 |
+ str = str.replace(/Λ/g, 'Λ'); |
|
| 56 |
+ str = str.replace(/Μ/g, 'Μ'); |
|
| 57 |
+ str = str.replace(/Ν/g, 'Ν'); |
|
| 58 |
+ str = str.replace(/Ξ/g, 'Ν'); |
|
| 59 |
+ str = str.replace(/Ο/g, 'Ο'); |
|
| 60 |
+ str = str.replace(/Π/g, 'Π'); |
|
| 61 |
+ str = str.replace(/Ρ/g, 'Ρ'); |
|
| 62 |
+ str = str.replace(/Σ/g, 'Σ'); |
|
| 63 |
+ str = str.replace(/Τ/g, 'Τ'); |
|
| 64 |
+ str = str.replace(/Υ/g, 'Υ'); |
|
| 65 |
+ str = str.replace(/Φ/g, 'Φ'); |
|
| 66 |
+ str = str.replace(/Χ/g, 'Χ'); |
|
| 67 |
+ str = str.replace(/Ψ/g, 'Ψ'); |
|
| 68 |
+ str = str.replace(/Ω/g, 'Ω'); |
|
| 69 |
+ |
|
| 70 |
+ str = str.replace(/α/g, 'α'); |
|
| 71 |
+ str = str.replace(/β/g, 'β'); |
|
| 72 |
+ str = str.replace(/γ/g, 'γ'); |
|
| 73 |
+ str = str.replace(/δ/g, 'δ'); |
|
| 74 |
+ str = str.replace(/ε/g, 'ε'); |
|
| 75 |
+ str = str.replace(/ζ/g, 'ζ'); |
|
| 76 |
+ str = str.replace(/η/g, 'η'); |
|
| 77 |
+ str = str.replace(/θ/g, 'θ'); |
|
| 78 |
+ str = str.replace(/ι/g, 'ι'); |
|
| 79 |
+ str = str.replace(/κ/g, 'κ'); |
|
| 80 |
+ str = str.replace(/λ/g, 'λ'); |
|
| 81 |
+ str = str.replace(/μ/g, 'μ'); |
|
| 82 |
+ str = str.replace(/ν/g, 'ν'); |
|
| 83 |
+ str = str.replace(/ξ/g, 'ξ'); |
|
| 84 |
+ str = str.replace(/ο/g, 'ο'); |
|
| 85 |
+ str = str.replace(/π/g, 'π'); |
|
| 86 |
+ str = str.replace(/ρ/g, 'ρ'); |
|
| 87 |
+ str = str.replace(/ς/g, 'ς'); |
|
| 88 |
+ str = str.replace(/σ/g, 'σ'); |
|
| 89 |
+ str = str.replace(/τ/g, 'τ'); |
|
| 90 |
+ str = str.replace(/υ/g, 'υ'); |
|
| 91 |
+ str = str.replace(/φ/g, 'φ'); |
|
| 92 |
+ str = str.replace(/χ/g, 'χ'); |
|
| 93 |
+ str = str.replace(/ψ/g, 'ψ'); |
|
| 94 |
+ str = str.replace(/ω/g, 'ω'); |
|
| 95 |
+ str = str.replace(/ϑ/g, 'ϑ'); |
|
| 96 |
+ str = str.replace(/ϒ/g, 'ϒ'); |
|
| 97 |
+ str = str.replace(/ϖ/g, 'ϖ'); |
|
| 98 |
+ str = str.replace(/·/g, '·'); |
|
| 99 |
+ return str; |
|
| 100 |
+} |
|
| 101 |
+ |
|
| 102 |
+// |
|
| 103 |
+ |
|
| 104 |
+function strcharacterDiscode(str) {
|
|
| 105 |
+ // 加入常用解析 |
|
| 106 |
+ str = str.replace(/ /g, ' '); |
|
| 107 |
+ str = str.replace(/"/g, "'"); |
|
| 108 |
+ str = str.replace(/&/g, '&'); |
|
| 109 |
+ // str = str.replace(/</g, '‹'); |
|
| 110 |
+ // str = str.replace(/>/g, '›'); |
|
| 111 |
+ |
|
| 112 |
+ str = str.replace(/</g, '<'); |
|
| 113 |
+ str = str.replace(/>/g, '>'); |
|
| 114 |
+ str = str.replace(/•/g, '•'); |
|
| 115 |
+ |
|
| 116 |
+ return str; |
|
| 117 |
+} |
|
| 118 |
+ |
|
| 119 |
+// HTML 支持的其他实体 |
|
| 120 |
+function strOtherDiscode(str) {
|
|
| 121 |
+ str = str.replace(/Œ/g, 'Œ'); |
|
| 122 |
+ str = str.replace(/œ/g, 'œ'); |
|
| 123 |
+ str = str.replace(/Š/g, 'Š'); |
|
| 124 |
+ str = str.replace(/š/g, 'š'); |
|
| 125 |
+ str = str.replace(/Ÿ/g, 'Ÿ'); |
|
| 126 |
+ str = str.replace(/ƒ/g, 'ƒ'); |
|
| 127 |
+ str = str.replace(/ˆ/g, 'ˆ'); |
|
| 128 |
+ str = str.replace(/˜/g, '˜'); |
|
| 129 |
+ str = str.replace(/ /g, ''); |
|
| 130 |
+ str = str.replace(/ /g, ''); |
|
| 131 |
+ str = str.replace(/ /g, ''); |
|
| 132 |
+ str = str.replace(/‌/g, ''); |
|
| 133 |
+ str = str.replace(/‍/g, ''); |
|
| 134 |
+ str = str.replace(/‎/g, ''); |
|
| 135 |
+ str = str.replace(/‏/g, ''); |
|
| 136 |
+ str = str.replace(/–/g, '–'); |
|
| 137 |
+ str = str.replace(/—/g, '—'); |
|
| 138 |
+ str = str.replace(/‘/g, '‘'); |
|
| 139 |
+ str = str.replace(/’/g, '’'); |
|
| 140 |
+ str = str.replace(/‚/g, '‚'); |
|
| 141 |
+ str = str.replace(/“/g, '“'); |
|
| 142 |
+ str = str.replace(/”/g, '”'); |
|
| 143 |
+ str = str.replace(/„/g, '„'); |
|
| 144 |
+ str = str.replace(/†/g, '†'); |
|
| 145 |
+ str = str.replace(/‡/g, '‡'); |
|
| 146 |
+ str = str.replace(/•/g, '•'); |
|
| 147 |
+ str = str.replace(/…/g, '…'); |
|
| 148 |
+ str = str.replace(/‰/g, '‰'); |
|
| 149 |
+ str = str.replace(/′/g, '′'); |
|
| 150 |
+ str = str.replace(/″/g, '″'); |
|
| 151 |
+ str = str.replace(/‹/g, '‹'); |
|
| 152 |
+ str = str.replace(/›/g, '›'); |
|
| 153 |
+ str = str.replace(/‾/g, '‾'); |
|
| 154 |
+ str = str.replace(/€/g, '€'); |
|
| 155 |
+ str = str.replace(/™/g, '™'); |
|
| 156 |
+ |
|
| 157 |
+ str = str.replace(/←/g, '←'); |
|
| 158 |
+ str = str.replace(/↑/g, '↑'); |
|
| 159 |
+ str = str.replace(/→/g, '→'); |
|
| 160 |
+ str = str.replace(/↓/g, '↓'); |
|
| 161 |
+ str = str.replace(/↔/g, '↔'); |
|
| 162 |
+ str = str.replace(/↵/g, '↵'); |
|
| 163 |
+ str = str.replace(/⌈/g, '⌈'); |
|
| 164 |
+ str = str.replace(/⌉/g, '⌉'); |
|
| 165 |
+ |
|
| 166 |
+ str = str.replace(/⌊/g, '⌊'); |
|
| 167 |
+ str = str.replace(/⌋/g, '⌋'); |
|
| 168 |
+ str = str.replace(/◊/g, '◊'); |
|
| 169 |
+ str = str.replace(/♠/g, '♠'); |
|
| 170 |
+ str = str.replace(/♣/g, '♣'); |
|
| 171 |
+ str = str.replace(/♥/g, '♥'); |
|
| 172 |
+ |
|
| 173 |
+ str = str.replace(/♦/g, '♦'); |
|
| 174 |
+ str = str.replace(/'/g, '\''); |
|
| 175 |
+ return str; |
|
| 176 |
+} |
|
| 177 |
+ |
|
| 178 |
+function strMoreDiscode(str) {
|
|
| 179 |
+ str = str.replace(/\r\n/g, ''); |
|
| 180 |
+ str = str.replace(/\n/g, ''); |
|
| 181 |
+ |
|
| 182 |
+ str = str.replace(/code/g, 'wxxxcode-style'); |
|
| 183 |
+ return str; |
|
| 184 |
+} |
|
| 185 |
+ |
|
| 186 |
+function strDiscode(str) {
|
|
| 187 |
+ str = strNumDiscode(str); |
|
| 188 |
+ str = strGreeceDiscode(str); |
|
| 189 |
+ str = strcharacterDiscode(str); |
|
| 190 |
+ str = strOtherDiscode(str); |
|
| 191 |
+ str = strMoreDiscode(str); |
|
| 192 |
+ return str; |
|
| 193 |
+} |
|
| 194 |
+function urlToHttpUrl(url, rep) {
|
|
| 195 |
+ const patt1 = new RegExp('^//');
|
|
| 196 |
+ const result = patt1.test(url); |
|
| 197 |
+ if (result) {
|
|
| 198 |
+ url = `${rep}:${url}`;
|
|
| 199 |
+ } |
|
| 200 |
+ return url; |
|
| 201 |
+} |
|
| 202 |
+ |
|
| 203 |
+module.exports = {
|
|
| 204 |
+ strDiscode, |
|
| 205 |
+ urlToHttpUrl, |
|
| 206 |
+}; |
@@ -0,0 +1,159 @@ |
||
| 1 |
+/** |
|
| 2 |
+ * author: Di (微信小程序开发工程师) |
|
| 3 |
+ * organization: WeAppDev(微信小程序开发论坛)(http://weappdev.com) |
|
| 4 |
+ * 垂直微信小程序开发交流社区 |
|
| 5 |
+ * |
|
| 6 |
+ * github地址: https://github.com/icindy/wxParse |
|
| 7 |
+ * |
|
| 8 |
+ * for: 微信小程序富文本解析 |
|
| 9 |
+ * detail : http://weappdev.com/t/wxparse-alpha0-1-html-markdown/184 |
|
| 10 |
+ */ |
|
| 11 |
+ |
|
| 12 |
+/** |
|
| 13 |
+ * utils函数引入 |
|
| 14 |
+ * */ |
|
| 15 |
+import showdown from './showdown.js'; |
|
| 16 |
+import HtmlToJson from './html2json.js'; |
|
| 17 |
+/** |
|
| 18 |
+ * 配置及公有属性 |
|
| 19 |
+ * */ |
|
| 20 |
+let realWindowWidth = 0; |
|
| 21 |
+let realWindowHeight = 0; |
|
| 22 |
+wx.getSystemInfo({
|
|
| 23 |
+ success(res) {
|
|
| 24 |
+ realWindowWidth = res.windowWidth; |
|
| 25 |
+ realWindowHeight = res.windowHeight; |
|
| 26 |
+ }, |
|
| 27 |
+}); |
|
| 28 |
+/** |
|
| 29 |
+ * 主函数入口区 |
|
| 30 |
+ * */ |
|
| 31 |
+function wxParse(bindName = 'wxParseData', type = 'html', data = '<div class="color:red;">数据不能为空</div>', target, imagePadding) {
|
|
| 32 |
+ const that = target; |
|
| 33 |
+ let transData = {};// 存放转化后的数据
|
|
| 34 |
+ if (type == 'html') {
|
|
| 35 |
+ transData = HtmlToJson.html2json(data, bindName); |
|
| 36 |
+ console.log(JSON.stringify(transData, ' ', ' ')); |
|
| 37 |
+ } else if (type == 'md' || type == 'markdown') {
|
|
| 38 |
+ const converter = new showdown.Converter(); |
|
| 39 |
+ const html = converter.makeHtml(data); |
|
| 40 |
+ transData = HtmlToJson.html2json(html, bindName); |
|
| 41 |
+ console.log(JSON.stringify(transData, ' ', ' ')); |
|
| 42 |
+ } |
|
| 43 |
+ transData.view = {};
|
|
| 44 |
+ transData.view.imagePadding = 0; |
|
| 45 |
+ if (typeof (imagePadding) !== 'undefined') {
|
|
| 46 |
+ transData.view.imagePadding = imagePadding; |
|
| 47 |
+ } |
|
| 48 |
+ const bindData = {};
|
|
| 49 |
+ bindData[bindName] = transData; |
|
| 50 |
+ that.setData(bindData); |
|
| 51 |
+ that.wxParseImgLoad = wxParseImgLoad; |
|
| 52 |
+ that.wxParseImgTap = wxParseImgTap; |
|
| 53 |
+} |
|
| 54 |
+// 图片点击事件 |
|
| 55 |
+function wxParseImgTap(e) {
|
|
| 56 |
+ const that = this; |
|
| 57 |
+ const nowImgUrl = e.target.dataset.src; |
|
| 58 |
+ const tagFrom = e.target.dataset.from; |
|
| 59 |
+ if (typeof (tagFrom) !== 'undefined' && tagFrom.length > 0) {
|
|
| 60 |
+ wx.previewImage({
|
|
| 61 |
+ current: nowImgUrl, // 当前显示图片的http链接 |
|
| 62 |
+ urls: that.data[tagFrom].imageUrls, // 需要预览的图片http链接列表 |
|
| 63 |
+ }); |
|
| 64 |
+ } |
|
| 65 |
+} |
|
| 66 |
+ |
|
| 67 |
+/** |
|
| 68 |
+ * 图片视觉宽高计算函数区 |
|
| 69 |
+ * */ |
|
| 70 |
+function wxParseImgLoad(e) {
|
|
| 71 |
+ const that = this; |
|
| 72 |
+ const tagFrom = e.target.dataset.from; |
|
| 73 |
+ const { idx } = e.target.dataset;
|
|
| 74 |
+ if (typeof (tagFrom) !== 'undefined' && tagFrom.length > 0) {
|
|
| 75 |
+ calMoreImageInfo(e, idx, that, tagFrom); |
|
| 76 |
+ } |
|
| 77 |
+} |
|
| 78 |
+// 假循环获取计算图片视觉最佳宽高 |
|
| 79 |
+function calMoreImageInfo(e, idx, that, bindName) {
|
|
| 80 |
+ const temData = that.data[bindName]; |
|
| 81 |
+ if (!temData || temData.images.length == 0) {
|
|
| 82 |
+ return; |
|
| 83 |
+ } |
|
| 84 |
+ const temImages = temData.images; |
|
| 85 |
+ // 因为无法获取view宽度 需要自定义padding进行计算,稍后处理 |
|
| 86 |
+ const recal = wxAutoImageCal(e.detail.width, e.detail.height, that, bindName); |
|
| 87 |
+ // temImages[idx].width = recal.imageWidth; |
|
| 88 |
+ // temImages[idx].height = recal.imageheight; |
|
| 89 |
+ // temData.images = temImages; |
|
| 90 |
+ // var bindData = {};
|
|
| 91 |
+ // bindData[bindName] = temData; |
|
| 92 |
+ // that.setData(bindData); |
|
| 93 |
+ const { index } = temImages[idx];
|
|
| 94 |
+ let key = `${bindName}`;
|
|
| 95 |
+ for (const i of index.split('.')) key += `.nodes[${i}]`;
|
|
| 96 |
+ const keyW = `${key}.width`;
|
|
| 97 |
+ const keyH = `${key}.height`;
|
|
| 98 |
+ that.setData({
|
|
| 99 |
+ [keyW]: recal.imageWidth, |
|
| 100 |
+ [keyH]: recal.imageheight, |
|
| 101 |
+ }); |
|
| 102 |
+} |
|
| 103 |
+ |
|
| 104 |
+// 计算视觉优先的图片宽高 |
|
| 105 |
+function wxAutoImageCal(originalWidth, originalHeight, that, bindName) {
|
|
| 106 |
+ // 获取图片的原始长宽 |
|
| 107 |
+ let windowWidth = 0; let |
|
| 108 |
+ windowHeight = 0; |
|
| 109 |
+ let autoWidth = 0; let |
|
| 110 |
+ autoHeight = 0; |
|
| 111 |
+ const results = {};
|
|
| 112 |
+ const padding = that.data[bindName].view.imagePadding; |
|
| 113 |
+ windowWidth = realWindowWidth - 2 * padding; |
|
| 114 |
+ windowHeight = realWindowHeight; |
|
| 115 |
+ // 判断按照那种方式进行缩放 |
|
| 116 |
+ // console.log("windowWidth" + windowWidth);
|
|
| 117 |
+ if (originalWidth > windowWidth) { // 在图片width大于手机屏幕width时候
|
|
| 118 |
+ autoWidth = windowWidth; |
|
| 119 |
+ // console.log("autoWidth" + autoWidth);
|
|
| 120 |
+ autoHeight = (autoWidth * originalHeight) / originalWidth; |
|
| 121 |
+ // console.log("autoHeight" + autoHeight);
|
|
| 122 |
+ results.imageWidth = autoWidth; |
|
| 123 |
+ results.imageheight = autoHeight; |
|
| 124 |
+ } else { // 否则展示原来的数据
|
|
| 125 |
+ results.imageWidth = originalWidth; |
|
| 126 |
+ results.imageheight = originalHeight; |
|
| 127 |
+ } |
|
| 128 |
+ return results; |
|
| 129 |
+} |
|
| 130 |
+ |
|
| 131 |
+function wxParseTemArray(temArrayName, bindNameReg, total, that) {
|
|
| 132 |
+ const array = []; |
|
| 133 |
+ const temData = that.data; |
|
| 134 |
+ let obj = null; |
|
| 135 |
+ for (let i = 0; i < total; i++) {
|
|
| 136 |
+ const simArr = temData[bindNameReg + i].nodes; |
|
| 137 |
+ array.push(simArr); |
|
| 138 |
+ } |
|
| 139 |
+ |
|
| 140 |
+ temArrayName = temArrayName || 'wxParseTemArray'; |
|
| 141 |
+ obj = JSON.parse(`{"${temArrayName}":""}`);
|
|
| 142 |
+ obj[temArrayName] = array; |
|
| 143 |
+ that.setData(obj); |
|
| 144 |
+} |
|
| 145 |
+ |
|
| 146 |
+/** |
|
| 147 |
+ * 配置emojis |
|
| 148 |
+ * |
|
| 149 |
+ */ |
|
| 150 |
+ |
|
| 151 |
+function emojisInit(reg = '', baseSrc = '/wxParse/emojis/', emojis) {
|
|
| 152 |
+ HtmlToJson.emojisInit(reg, baseSrc, emojis); |
|
| 153 |
+} |
|
| 154 |
+ |
|
| 155 |
+module.exports = {
|
|
| 156 |
+ wxParse, |
|
| 157 |
+ wxParseTemArray, |
|
| 158 |
+ emojisInit, |
|
| 159 |
+}; |
@@ -0,0 +1,967 @@ |
||
| 1 |
+<!--** |
|
| 2 |
+ * author: Di (微信小程序开发工程师) |
|
| 3 |
+ * organization: WeAppDev(微信小程序开发论坛)(http://weappdev.com) |
|
| 4 |
+ * 垂直微信小程序开发交流社区 |
|
| 5 |
+ * |
|
| 6 |
+ * github地址: https://github.com/icindy/wxParse |
|
| 7 |
+ * |
|
| 8 |
+ * for: 微信小程序富文本解析 |
|
| 9 |
+ * detail : http://weappdev.com/t/wxparse-alpha0-1-html-markdown/184 |
|
| 10 |
+ */--> |
|
| 11 |
+ |
|
| 12 |
+<!--基础元素--> |
|
| 13 |
+<template name="wxParseVideo"> |
|
| 14 |
+ <!--增加video标签支持,并循环添加--> |
|
| 15 |
+ <view class="{{item.classStr}} wxParse-{{item.tag}}" style="{{item.styleStr}}">
|
|
| 16 |
+ <video class="{{item.classStr}} wxParse-{{item.tag}}-video" src="{{item.attr.src}}"></video>
|
|
| 17 |
+ </view> |
|
| 18 |
+</template> |
|
| 19 |
+ |
|
| 20 |
+<template name="wxParseImg"> |
|
| 21 |
+ <image class="{{item.classStr}} wxParse-{{item.tag}}" data-from="{{item.from}}" data-src="{{item.attr.src}}" data-idx="{{item.imgIndex}}" src="{{item.attr.src}}" bindload="wxParseImgLoad" bindtap="wxParseImgTap" mode="widthFix" style="width:100%;"
|
|
| 22 |
+ /> |
|
| 23 |
+</template> |
|
| 24 |
+ |
|
| 25 |
+<template name="WxEmojiView"> |
|
| 26 |
+ <view class="WxEmojiView wxParse-inline" style="{{item.styleStr}}">
|
|
| 27 |
+ <block wx:for="{{item.textArray}}" wx:key="">
|
|
| 28 |
+ <block class="{{item.text == '\\n' ? 'wxParse-hide':''}}" wx:if="{{item.node == 'text'}}">{{item.text}}</block>
|
|
| 29 |
+ <block wx:elif="{{item.node == 'element'}}">
|
|
| 30 |
+ <image class="wxEmoji" src="{{item.baseSrc}}{{item.text}}" />
|
|
| 31 |
+ </block> |
|
| 32 |
+ </block> |
|
| 33 |
+ </view> |
|
| 34 |
+</template> |
|
| 35 |
+ |
|
| 36 |
+<template name="WxParseBr"> |
|
| 37 |
+ <text>\n</text> |
|
| 38 |
+</template> |
|
| 39 |
+<!--入口模版--> |
|
| 40 |
+ |
|
| 41 |
+<template name="wxParse"> |
|
| 42 |
+ <block wx:for="{{wxParseData}}" wx:key="">
|
|
| 43 |
+ <template is="wxParse0" data="{{item}}" />
|
|
| 44 |
+ </block> |
|
| 45 |
+</template> |
|
| 46 |
+ |
|
| 47 |
+ |
|
| 48 |
+<!--循环模版--> |
|
| 49 |
+<template name="wxParse0"> |
|
| 50 |
+ <!--<template is="wxParse1" data="{{item}}" />-->
|
|
| 51 |
+ <!--判断是否是标签节点--> |
|
| 52 |
+ <block wx:if="{{item.node == 'element'}}">
|
|
| 53 |
+ <block wx:if="{{item.tag == 'button'}}">
|
|
| 54 |
+ <button type="default" size="mini"> |
|
| 55 |
+ <block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
|
|
| 56 |
+ <template is="wxParse1" data="{{item}}" />
|
|
| 57 |
+ </block> |
|
| 58 |
+ </button> |
|
| 59 |
+ </block> |
|
| 60 |
+ <!--li类型--> |
|
| 61 |
+ <block wx:elif="{{item.tag == 'li'}}">
|
|
| 62 |
+ <view class="{{item.classStr}} wxParse-li" style="{{item.styleStr}}">
|
|
| 63 |
+ <view class="{{item.classStr}} wxParse-li-inner">
|
|
| 64 |
+ <view class="{{item.classStr}} wxParse-li-text">
|
|
| 65 |
+ <view class="{{item.classStr}} wxParse-li-circle"></view>
|
|
| 66 |
+ </view> |
|
| 67 |
+ <view class="{{item.classStr}} wxParse-li-text">
|
|
| 68 |
+ <block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
|
|
| 69 |
+ <template is="wxParse1" data="{{item}}" />
|
|
| 70 |
+ </block> |
|
| 71 |
+ </view> |
|
| 72 |
+ </view> |
|
| 73 |
+ </view> |
|
| 74 |
+ </block> |
|
| 75 |
+ |
|
| 76 |
+ <!--video类型--> |
|
| 77 |
+ <block wx:elif="{{item.tag == 'video'}}">
|
|
| 78 |
+ <template is="wxParseVideo" data="{{item}}" />
|
|
| 79 |
+ </block> |
|
| 80 |
+ |
|
| 81 |
+ <!--img类型--> |
|
| 82 |
+ <block wx:elif="{{item.tag == 'img'}}">
|
|
| 83 |
+ <template is="wxParseImg" data="{{item}}" />
|
|
| 84 |
+ </block> |
|
| 85 |
+ |
|
| 86 |
+ <!--a类型--> |
|
| 87 |
+ <block wx:elif="{{item.tag == 'a'}}">
|
|
| 88 |
+ <view bindtap="wxParseTagATap" class="wxParse-inline {{item.classStr}} wxParse-{{item.tag}}" data-src="{{item.attr.href}}" style="{{item.styleStr}}" hover-class="wxParse-a-hover">
|
|
| 89 |
+ <block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
|
|
| 90 |
+ <template is="wxParse1" data="{{item}}" />
|
|
| 91 |
+ </block> |
|
| 92 |
+ </view> |
|
| 93 |
+ </block> |
|
| 94 |
+ <block wx:elif="{{item.tag == 'table'}}">
|
|
| 95 |
+ <view class="{{item.classStr}} wxParse-{{item.tag}}" style="{{item.styleStr}}">
|
|
| 96 |
+ <block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
|
|
| 97 |
+ <template is="wxParse1" data="{{item}}" />
|
|
| 98 |
+ </block> |
|
| 99 |
+ </view> |
|
| 100 |
+ </block> |
|
| 101 |
+ |
|
| 102 |
+ <block wx:elif="{{item.tag == 'br'}}">
|
|
| 103 |
+ <template is="WxParseBr"></template> |
|
| 104 |
+ </block> |
|
| 105 |
+ <!--其他块级标签--> |
|
| 106 |
+ <block wx:elif="{{item.tagType == 'block'}}">
|
|
| 107 |
+ <view class="{{item.classStr}} wxParse-{{item.tag}}" style="{{item.styleStr}}">
|
|
| 108 |
+ <block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
|
|
| 109 |
+ <template is="wxParse1" data="{{item}}" />
|
|
| 110 |
+ </block> |
|
| 111 |
+ </view> |
|
| 112 |
+ </block> |
|
| 113 |
+ |
|
| 114 |
+ <!--内联标签--> |
|
| 115 |
+ <view wx:else class="{{item.classStr}} wxParse-{{item.tag}} wxParse-{{item.tagType}}" style="{{item.styleStr}}">
|
|
| 116 |
+ <block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
|
|
| 117 |
+ <template is="wxParse1" data="{{item}}" />
|
|
| 118 |
+ </block> |
|
| 119 |
+ </view> |
|
| 120 |
+ |
|
| 121 |
+ </block> |
|
| 122 |
+ |
|
| 123 |
+ <!--判断是否是文本节点--> |
|
| 124 |
+ <block wx:elif="{{item.node == 'text'}}">
|
|
| 125 |
+ <!--如果是,直接进行--> |
|
| 126 |
+ <template is="WxEmojiView" data="{{item}}" />
|
|
| 127 |
+ </block> |
|
| 128 |
+ |
|
| 129 |
+</template> |
|
| 130 |
+ |
|
| 131 |
+ |
|
| 132 |
+ |
|
| 133 |
+<!--循环模版--> |
|
| 134 |
+<template name="wxParse1"> |
|
| 135 |
+ <!--<template is="wxParse2" data="{{item}}" />-->
|
|
| 136 |
+ <!--判断是否是标签节点--> |
|
| 137 |
+ <block wx:if="{{item.node == 'element'}}">
|
|
| 138 |
+ <block wx:if="{{item.tag == 'button'}}">
|
|
| 139 |
+ <button type="default" size="mini"> |
|
| 140 |
+ <block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
|
|
| 141 |
+ <template is="wxParse2" data="{{item}}" />
|
|
| 142 |
+ </block> |
|
| 143 |
+ </button> |
|
| 144 |
+ </block> |
|
| 145 |
+ <!--li类型--> |
|
| 146 |
+ <block wx:elif="{{item.tag == 'li'}}">
|
|
| 147 |
+ <view class="{{item.classStr}} wxParse-li" style="{{item.styleStr}}">
|
|
| 148 |
+ <view class="{{item.classStr}} wxParse-li-inner">
|
|
| 149 |
+ <view class="{{item.classStr}} wxParse-li-text">
|
|
| 150 |
+ <view class="{{item.classStr}} wxParse-li-circle"></view>
|
|
| 151 |
+ </view> |
|
| 152 |
+ <view class="{{item.classStr}} wxParse-li-text">
|
|
| 153 |
+ <block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
|
|
| 154 |
+ <template is="wxParse2" data="{{item}}" />
|
|
| 155 |
+ </block> |
|
| 156 |
+ </view> |
|
| 157 |
+ </view> |
|
| 158 |
+ </view> |
|
| 159 |
+ </block> |
|
| 160 |
+ |
|
| 161 |
+ <!--video类型--> |
|
| 162 |
+ <block wx:elif="{{item.tag == 'video'}}">
|
|
| 163 |
+ <template is="wxParseVideo" data="{{item}}" />
|
|
| 164 |
+ </block> |
|
| 165 |
+ |
|
| 166 |
+ <!--img类型--> |
|
| 167 |
+ <block wx:elif="{{item.tag == 'img'}}">
|
|
| 168 |
+ <template is="wxParseImg" data="{{item}}" />
|
|
| 169 |
+ </block> |
|
| 170 |
+ |
|
| 171 |
+ <!--a类型--> |
|
| 172 |
+ <block wx:elif="{{item.tag == 'a'}}">
|
|
| 173 |
+ <view bindtap="wxParseTagATap" class="wxParse-inline {{item.classStr}} wxParse-{{item.tag}}" data-src="{{item.attr.href}}" style="{{item.styleStr}}" hover-class="wxParse-a-hover">
|
|
| 174 |
+ <block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
|
|
| 175 |
+ <template is="wxParse2" data="{{item}}" />
|
|
| 176 |
+ </block> |
|
| 177 |
+ </view> |
|
| 178 |
+ </block> |
|
| 179 |
+ |
|
| 180 |
+ <block wx:elif="{{item.tag == 'br'}}">
|
|
| 181 |
+ <template is="WxParseBr"></template> |
|
| 182 |
+ </block> |
|
| 183 |
+ <!--其他块级标签--> |
|
| 184 |
+ <block wx:elif="{{item.tagType == 'block'}}">
|
|
| 185 |
+ <view class="{{item.classStr}} wxParse-{{item.tag}}" style="{{item.styleStr}}">
|
|
| 186 |
+ <block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
|
|
| 187 |
+ <template is="wxParse2" data="{{item}}" />
|
|
| 188 |
+ </block> |
|
| 189 |
+ </view> |
|
| 190 |
+ </block> |
|
| 191 |
+ |
|
| 192 |
+ <!--内联标签--> |
|
| 193 |
+ <view wx:else class="{{item.classStr}} wxParse-{{item.tag}} wxParse-{{item.tagType}}" style="{{item.styleStr}}">
|
|
| 194 |
+ <block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
|
|
| 195 |
+ <template is="wxParse2" data="{{item}}" />
|
|
| 196 |
+ </block> |
|
| 197 |
+ </view> |
|
| 198 |
+ |
|
| 199 |
+ </block> |
|
| 200 |
+ |
|
| 201 |
+ <!--判断是否是文本节点--> |
|
| 202 |
+ <block wx:elif="{{item.node == 'text'}}">
|
|
| 203 |
+ <!--如果是,直接进行--> |
|
| 204 |
+ <template is="WxEmojiView" data="{{item}}" />
|
|
| 205 |
+ </block> |
|
| 206 |
+ |
|
| 207 |
+</template> |
|
| 208 |
+ |
|
| 209 |
+ |
|
| 210 |
+<!--循环模版--> |
|
| 211 |
+<template name="wxParse2"> |
|
| 212 |
+ <!--<template is="wxParse3" data="{{item}}" />-->
|
|
| 213 |
+ <!--判断是否是标签节点--> |
|
| 214 |
+ <block wx:if="{{item.node == 'element'}}">
|
|
| 215 |
+ <block wx:if="{{item.tag == 'button'}}">
|
|
| 216 |
+ <button type="default" size="mini"> |
|
| 217 |
+ <block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
|
|
| 218 |
+ <template is="wxParse3" data="{{item}}" />
|
|
| 219 |
+ </block> |
|
| 220 |
+ </button> |
|
| 221 |
+ </block> |
|
| 222 |
+ <!--li类型--> |
|
| 223 |
+ <block wx:elif="{{item.tag == 'li'}}">
|
|
| 224 |
+ <view class="{{item.classStr}} wxParse-li" style="{{item.styleStr}}">
|
|
| 225 |
+ <view class="{{item.classStr}} wxParse-li-inner">
|
|
| 226 |
+ <view class="{{item.classStr}} wxParse-li-text">
|
|
| 227 |
+ <view class="{{item.classStr}} wxParse-li-circle"></view>
|
|
| 228 |
+ </view> |
|
| 229 |
+ <view class="{{item.classStr}} wxParse-li-text">
|
|
| 230 |
+ <block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
|
|
| 231 |
+ <template is="wxParse3" data="{{item}}" />
|
|
| 232 |
+ </block> |
|
| 233 |
+ </view> |
|
| 234 |
+ </view> |
|
| 235 |
+ </view> |
|
| 236 |
+ </block> |
|
| 237 |
+ |
|
| 238 |
+ <!--video类型--> |
|
| 239 |
+ <block wx:elif="{{item.tag == 'video'}}">
|
|
| 240 |
+ <template is="wxParseVideo" data="{{item}}" />
|
|
| 241 |
+ </block> |
|
| 242 |
+ |
|
| 243 |
+ <!--img类型--> |
|
| 244 |
+ <block wx:elif="{{item.tag == 'img'}}">
|
|
| 245 |
+ <template is="wxParseImg" data="{{item}}" />
|
|
| 246 |
+ </block> |
|
| 247 |
+ |
|
| 248 |
+ <!--a类型--> |
|
| 249 |
+ <block wx:elif="{{item.tag == 'a'}}">
|
|
| 250 |
+ <view bindtap="wxParseTagATap" class="wxParse-inline {{item.classStr}} wxParse-{{item.tag}}" data-src="{{item.attr.href}}" style="{{item.styleStr}}" hover-class="wxParse-a-hover">
|
|
| 251 |
+ <block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
|
|
| 252 |
+ <template is="wxParse3" data="{{item}}" />
|
|
| 253 |
+ </block> |
|
| 254 |
+ </view> |
|
| 255 |
+ </block> |
|
| 256 |
+ |
|
| 257 |
+ <block wx:elif="{{item.tag == 'br'}}">
|
|
| 258 |
+ <template is="WxParseBr"></template> |
|
| 259 |
+ </block> |
|
| 260 |
+ <!--其他块级标签--> |
|
| 261 |
+ <block wx:elif="{{item.tagType == 'block'}}">
|
|
| 262 |
+ <view class="{{item.classStr}} wxParse-{{item.tag}}" style="{{item.styleStr}}">
|
|
| 263 |
+ <block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
|
|
| 264 |
+ <template is="wxParse3" data="{{item}}" />
|
|
| 265 |
+ </block> |
|
| 266 |
+ </view> |
|
| 267 |
+ </block> |
|
| 268 |
+ |
|
| 269 |
+ <!--内联标签--> |
|
| 270 |
+ <view wx:else class="{{item.classStr}} wxParse-{{item.tag}} wxParse-{{item.tagType}}" style="{{item.styleStr}}">
|
|
| 271 |
+ <block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
|
|
| 272 |
+ <template is="wxParse3" data="{{item}}" />
|
|
| 273 |
+ </block> |
|
| 274 |
+ </view> |
|
| 275 |
+ |
|
| 276 |
+ </block> |
|
| 277 |
+ |
|
| 278 |
+ <!--判断是否是文本节点--> |
|
| 279 |
+ <block wx:elif="{{item.node == 'text'}}">
|
|
| 280 |
+ <!--如果是,直接进行--> |
|
| 281 |
+ <template is="WxEmojiView" data="{{item}}" />
|
|
| 282 |
+ </block> |
|
| 283 |
+ |
|
| 284 |
+</template> |
|
| 285 |
+ |
|
| 286 |
+<!--循环模版--> |
|
| 287 |
+<template name="wxParse3"> |
|
| 288 |
+ <!--<template is="wxParse4" data="{{item}}" />-->
|
|
| 289 |
+ <!--判断是否是标签节点--> |
|
| 290 |
+ <block wx:if="{{item.node == 'element'}}">
|
|
| 291 |
+ <block wx:if="{{item.tag == 'button'}}">
|
|
| 292 |
+ <button type="default" size="mini"> |
|
| 293 |
+ <block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
|
|
| 294 |
+ <template is="wxParse4" data="{{item}}" />
|
|
| 295 |
+ </block> |
|
| 296 |
+ </button> |
|
| 297 |
+ </block> |
|
| 298 |
+ <!--li类型--> |
|
| 299 |
+ <block wx:elif="{{item.tag == 'li'}}">
|
|
| 300 |
+ <view class="{{item.classStr}} wxParse-li" style="{{item.styleStr}}">
|
|
| 301 |
+ <view class="{{item.classStr}} wxParse-li-inner">
|
|
| 302 |
+ <view class="{{item.classStr}} wxParse-li-text">
|
|
| 303 |
+ <view class="{{item.classStr}} wxParse-li-circle"></view>
|
|
| 304 |
+ </view> |
|
| 305 |
+ <view class="{{item.classStr}} wxParse-li-text">
|
|
| 306 |
+ <block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
|
|
| 307 |
+ <template is="wxParse4" data="{{item}}" />
|
|
| 308 |
+ </block> |
|
| 309 |
+ </view> |
|
| 310 |
+ </view> |
|
| 311 |
+ </view> |
|
| 312 |
+ </block> |
|
| 313 |
+ |
|
| 314 |
+ <!--video类型--> |
|
| 315 |
+ <block wx:elif="{{item.tag == 'video'}}">
|
|
| 316 |
+ <template is="wxParseVideo" data="{{item}}" />
|
|
| 317 |
+ </block> |
|
| 318 |
+ |
|
| 319 |
+ <!--img类型--> |
|
| 320 |
+ <block wx:elif="{{item.tag == 'img'}}">
|
|
| 321 |
+ <template is="wxParseImg" data="{{item}}" />
|
|
| 322 |
+ </block> |
|
| 323 |
+ |
|
| 324 |
+ <!--a类型--> |
|
| 325 |
+ <block wx:elif="{{item.tag == 'a'}}">
|
|
| 326 |
+ <view bindtap="wxParseTagATap" class="wxParse-inline {{item.classStr}} wxParse-{{item.tag}}" data-src="{{item.attr.href}}" style="{{item.styleStr}}" hover-class="wxParse-a-hover">
|
|
| 327 |
+ <block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
|
|
| 328 |
+ <template is="wxParse4" data="{{item}}" />
|
|
| 329 |
+ </block> |
|
| 330 |
+ </view> |
|
| 331 |
+ </block> |
|
| 332 |
+ |
|
| 333 |
+ <block wx:elif="{{item.tag == 'br'}}">
|
|
| 334 |
+ <template is="WxParseBr"></template> |
|
| 335 |
+ </block> |
|
| 336 |
+ <!--其他块级标签--> |
|
| 337 |
+ <block wx:elif="{{item.tagType == 'block'}}">
|
|
| 338 |
+ <view class="{{item.classStr}} wxParse-{{item.tag}}" style="{{item.styleStr}}">
|
|
| 339 |
+ <block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
|
|
| 340 |
+ <template is="wxParse4" data="{{item}}" />
|
|
| 341 |
+ </block> |
|
| 342 |
+ </view> |
|
| 343 |
+ </block> |
|
| 344 |
+ |
|
| 345 |
+ <!--内联标签--> |
|
| 346 |
+ <view wx:else class="{{item.classStr}} wxParse-{{item.tag}} wxParse-{{item.tagType}}" style="{{item.styleStr}}">
|
|
| 347 |
+ <block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
|
|
| 348 |
+ <template is="wxParse4" data="{{item}}" />
|
|
| 349 |
+ </block> |
|
| 350 |
+ </view> |
|
| 351 |
+ |
|
| 352 |
+ </block> |
|
| 353 |
+ |
|
| 354 |
+ <!--判断是否是文本节点--> |
|
| 355 |
+ <block wx:elif="{{item.node == 'text'}}">
|
|
| 356 |
+ <!--如果是,直接进行--> |
|
| 357 |
+ <template is="WxEmojiView" data="{{item}}" />
|
|
| 358 |
+ </block> |
|
| 359 |
+ |
|
| 360 |
+</template> |
|
| 361 |
+ |
|
| 362 |
+<!--循环模版--> |
|
| 363 |
+<template name="wxParse4"> |
|
| 364 |
+ <!--<template is="wxParse5" data="{{item}}" />-->
|
|
| 365 |
+ <!--判断是否是标签节点--> |
|
| 366 |
+ <block wx:if="{{item.node == 'element'}}">
|
|
| 367 |
+ <block wx:if="{{item.tag == 'button'}}">
|
|
| 368 |
+ <button type="default" size="mini"> |
|
| 369 |
+ <block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
|
|
| 370 |
+ <template is="wxParse5" data="{{item}}" />
|
|
| 371 |
+ </block> |
|
| 372 |
+ </button> |
|
| 373 |
+ </block> |
|
| 374 |
+ <!--li类型--> |
|
| 375 |
+ <block wx:elif="{{item.tag == 'li'}}">
|
|
| 376 |
+ <view class="{{item.classStr}} wxParse-li" style="{{item.styleStr}}">
|
|
| 377 |
+ <view class="{{item.classStr}} wxParse-li-inner">
|
|
| 378 |
+ <view class="{{item.classStr}} wxParse-li-text">
|
|
| 379 |
+ <view class="{{item.classStr}} wxParse-li-circle"></view>
|
|
| 380 |
+ </view> |
|
| 381 |
+ <view class="{{item.classStr}} wxParse-li-text">
|
|
| 382 |
+ <block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
|
|
| 383 |
+ <template is="wxParse5" data="{{item}}" />
|
|
| 384 |
+ </block> |
|
| 385 |
+ </view> |
|
| 386 |
+ </view> |
|
| 387 |
+ </view> |
|
| 388 |
+ </block> |
|
| 389 |
+ |
|
| 390 |
+ <!--video类型--> |
|
| 391 |
+ <block wx:elif="{{item.tag == 'video'}}">
|
|
| 392 |
+ <template is="wxParseVideo" data="{{item}}" />
|
|
| 393 |
+ </block> |
|
| 394 |
+ |
|
| 395 |
+ <!--img类型--> |
|
| 396 |
+ <block wx:elif="{{item.tag == 'img'}}">
|
|
| 397 |
+ <template is="wxParseImg" data="{{item}}" />
|
|
| 398 |
+ </block> |
|
| 399 |
+ |
|
| 400 |
+ <!--a类型--> |
|
| 401 |
+ <block wx:elif="{{item.tag == 'a'}}">
|
|
| 402 |
+ <view bindtap="wxParseTagATap" class="wxParse-inline {{item.classStr}} wxParse-{{item.tag}}" data-src="{{item.attr.href}}" style="{{item.styleStr}}" hover-class="wxParse-a-hover">
|
|
| 403 |
+ <block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
|
|
| 404 |
+ <template is="wxParse5" data="{{item}}" />
|
|
| 405 |
+ </block> |
|
| 406 |
+ </view> |
|
| 407 |
+ </block> |
|
| 408 |
+ |
|
| 409 |
+ <block wx:elif="{{item.tag == 'br'}}">
|
|
| 410 |
+ <template is="WxParseBr"></template> |
|
| 411 |
+ </block> |
|
| 412 |
+ <!--其他块级标签--> |
|
| 413 |
+ <block wx:elif="{{item.tagType == 'block'}}">
|
|
| 414 |
+ <view class="{{item.classStr}} wxParse-{{item.tag}}" style="{{item.styleStr}}">
|
|
| 415 |
+ <block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
|
|
| 416 |
+ <template is="wxParse5" data="{{item}}" />
|
|
| 417 |
+ </block> |
|
| 418 |
+ </view> |
|
| 419 |
+ </block> |
|
| 420 |
+ |
|
| 421 |
+ <!--内联标签--> |
|
| 422 |
+ <view wx:else class="{{item.classStr}} wxParse-{{item.tag}} wxParse-{{item.tagType}}" style="{{item.styleStr}}">
|
|
| 423 |
+ <block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
|
|
| 424 |
+ <template is="wxParse5" data="{{item}}" />
|
|
| 425 |
+ </block> |
|
| 426 |
+ </view> |
|
| 427 |
+ |
|
| 428 |
+ </block> |
|
| 429 |
+ |
|
| 430 |
+ <!--判断是否是文本节点--> |
|
| 431 |
+ <block wx:elif="{{item.node == 'text'}}">
|
|
| 432 |
+ <!--如果是,直接进行--> |
|
| 433 |
+ <template is="WxEmojiView" data="{{item}}" />
|
|
| 434 |
+ </block> |
|
| 435 |
+ |
|
| 436 |
+</template> |
|
| 437 |
+ |
|
| 438 |
+<!--循环模版--> |
|
| 439 |
+<template name="wxParse5"> |
|
| 440 |
+ <!--<template is="wxParse6" data="{{item}}" />-->
|
|
| 441 |
+ <!--判断是否是标签节点--> |
|
| 442 |
+ <block wx:if="{{item.node == 'element'}}">
|
|
| 443 |
+ <block wx:if="{{item.tag == 'button'}}">
|
|
| 444 |
+ <button type="default" size="mini"> |
|
| 445 |
+ <block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
|
|
| 446 |
+ <template is="wxParse6" data="{{item}}" />
|
|
| 447 |
+ </block> |
|
| 448 |
+ </button> |
|
| 449 |
+ </block> |
|
| 450 |
+ <!--li类型--> |
|
| 451 |
+ <block wx:elif="{{item.tag == 'li'}}">
|
|
| 452 |
+ <view class="{{item.classStr}} wxParse-li" style="{{item.styleStr}}">
|
|
| 453 |
+ <view class="{{item.classStr}} wxParse-li-inner">
|
|
| 454 |
+ <view class="{{item.classStr}} wxParse-li-text">
|
|
| 455 |
+ <view class="{{item.classStr}} wxParse-li-circle"></view>
|
|
| 456 |
+ </view> |
|
| 457 |
+ <view class="{{item.classStr}} wxParse-li-text">
|
|
| 458 |
+ <block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
|
|
| 459 |
+ <template is="wxParse6" data="{{item}}" />
|
|
| 460 |
+ </block> |
|
| 461 |
+ </view> |
|
| 462 |
+ </view> |
|
| 463 |
+ </view> |
|
| 464 |
+ </block> |
|
| 465 |
+ |
|
| 466 |
+ <!--video类型--> |
|
| 467 |
+ <block wx:elif="{{item.tag == 'video'}}">
|
|
| 468 |
+ <template is="wxParseVideo" data="{{item}}" />
|
|
| 469 |
+ </block> |
|
| 470 |
+ |
|
| 471 |
+ <!--img类型--> |
|
| 472 |
+ <block wx:elif="{{item.tag == 'img'}}">
|
|
| 473 |
+ <template is="wxParseImg" data="{{item}}" />
|
|
| 474 |
+ </block> |
|
| 475 |
+ |
|
| 476 |
+ <!--a类型--> |
|
| 477 |
+ <block wx:elif="{{item.tag == 'a'}}">
|
|
| 478 |
+ <view bindtap="wxParseTagATap" class="wxParse-inline {{item.classStr}} wxParse-{{item.tag}}" data-src="{{item.attr.href}}" style="{{item.styleStr}}" hover-class="wxParse-a-hover">
|
|
| 479 |
+ <block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
|
|
| 480 |
+ <template is="wxParse6" data="{{item}}" />
|
|
| 481 |
+ </block> |
|
| 482 |
+ </view> |
|
| 483 |
+ </block> |
|
| 484 |
+ |
|
| 485 |
+ <block wx:elif="{{item.tag == 'br'}}">
|
|
| 486 |
+ <template is="WxParseBr"></template> |
|
| 487 |
+ </block> |
|
| 488 |
+ <!--其他块级标签--> |
|
| 489 |
+ <block wx:elif="{{item.tagType == 'block'}}">
|
|
| 490 |
+ <view class="{{item.classStr}} wxParse-{{item.tag}}" style="{{item.styleStr}}">
|
|
| 491 |
+ <block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
|
|
| 492 |
+ <template is="wxParse6" data="{{item}}" />
|
|
| 493 |
+ </block> |
|
| 494 |
+ </view> |
|
| 495 |
+ </block> |
|
| 496 |
+ |
|
| 497 |
+ <!--内联标签--> |
|
| 498 |
+ <view wx:else class="{{item.classStr}} wxParse-{{item.tag}} wxParse-{{item.tagType}}" style="{{item.styleStr}}">
|
|
| 499 |
+ <block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
|
|
| 500 |
+ <template is="wxParse6" data="{{item}}" />
|
|
| 501 |
+ </block> |
|
| 502 |
+ </view> |
|
| 503 |
+ |
|
| 504 |
+ </block> |
|
| 505 |
+ |
|
| 506 |
+ <!--判断是否是文本节点--> |
|
| 507 |
+ <block wx:elif="{{item.node == 'text'}}">
|
|
| 508 |
+ <!--如果是,直接进行--> |
|
| 509 |
+ <template is="WxEmojiView" data="{{item}}" />
|
|
| 510 |
+ </block> |
|
| 511 |
+ |
|
| 512 |
+</template> |
|
| 513 |
+ |
|
| 514 |
+<!--循环模版--> |
|
| 515 |
+<template name="wxParse6"> |
|
| 516 |
+ <!--<template is="wxParse7" data="{{item}}" />-->
|
|
| 517 |
+ <!--判断是否是标签节点--> |
|
| 518 |
+ <block wx:if="{{item.node == 'element'}}">
|
|
| 519 |
+ <block wx:if="{{item.tag == 'button'}}">
|
|
| 520 |
+ <button type="default" size="mini"> |
|
| 521 |
+ <block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
|
|
| 522 |
+ <template is="wxParse7" data="{{item}}" />
|
|
| 523 |
+ </block> |
|
| 524 |
+ </button> |
|
| 525 |
+ </block> |
|
| 526 |
+ <!--li类型--> |
|
| 527 |
+ <block wx:elif="{{item.tag == 'li'}}">
|
|
| 528 |
+ <view class="{{item.classStr}} wxParse-li" style="{{item.styleStr}}">
|
|
| 529 |
+ <view class="{{item.classStr}} wxParse-li-inner">
|
|
| 530 |
+ <view class="{{item.classStr}} wxParse-li-text">
|
|
| 531 |
+ <view class="{{item.classStr}} wxParse-li-circle"></view>
|
|
| 532 |
+ </view> |
|
| 533 |
+ <view class="{{item.classStr}} wxParse-li-text">
|
|
| 534 |
+ <block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
|
|
| 535 |
+ <template is="wxParse7" data="{{item}}" />
|
|
| 536 |
+ </block> |
|
| 537 |
+ </view> |
|
| 538 |
+ </view> |
|
| 539 |
+ </view> |
|
| 540 |
+ </block> |
|
| 541 |
+ |
|
| 542 |
+ <!--video类型--> |
|
| 543 |
+ <block wx:elif="{{item.tag == 'video'}}">
|
|
| 544 |
+ <template is="wxParseVideo" data="{{item}}" />
|
|
| 545 |
+ </block> |
|
| 546 |
+ |
|
| 547 |
+ <!--img类型--> |
|
| 548 |
+ <block wx:elif="{{item.tag == 'img'}}">
|
|
| 549 |
+ <template is="wxParseImg" data="{{item}}" />
|
|
| 550 |
+ </block> |
|
| 551 |
+ |
|
| 552 |
+ <!--a类型--> |
|
| 553 |
+ <block wx:elif="{{item.tag == 'a'}}">
|
|
| 554 |
+ <view bindtap="wxParseTagATap" class="wxParse-inline {{item.classStr}} wxParse-{{item.tag}}" data-src="{{item.attr.href}}" style="{{item.styleStr}}" hover-class="wxParse-a-hover">
|
|
| 555 |
+ <block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
|
|
| 556 |
+ <template is="wxParse7" data="{{item}}" />
|
|
| 557 |
+ </block> |
|
| 558 |
+ </view> |
|
| 559 |
+ </block> |
|
| 560 |
+ |
|
| 561 |
+ <block wx:elif="{{item.tag == 'br'}}">
|
|
| 562 |
+ <template is="WxParseBr"></template> |
|
| 563 |
+ </block> |
|
| 564 |
+ <!--其他块级标签--> |
|
| 565 |
+ <block wx:elif="{{item.tagType == 'block'}}">
|
|
| 566 |
+ <view class="{{item.classStr}} wxParse-{{item.tag}}" style="{{item.styleStr}}">
|
|
| 567 |
+ <block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
|
|
| 568 |
+ <template is="wxParse7" data="{{item}}" />
|
|
| 569 |
+ </block> |
|
| 570 |
+ </view> |
|
| 571 |
+ </block> |
|
| 572 |
+ |
|
| 573 |
+ <!--内联标签--> |
|
| 574 |
+ <view wx:else class="{{item.classStr}} wxParse-{{item.tag}} wxParse-{{item.tagType}}" style="{{item.styleStr}}">
|
|
| 575 |
+ <block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
|
|
| 576 |
+ <template is="wxParse7" data="{{item}}" />
|
|
| 577 |
+ </block> |
|
| 578 |
+ </view> |
|
| 579 |
+ |
|
| 580 |
+ </block> |
|
| 581 |
+ |
|
| 582 |
+ <!--判断是否是文本节点--> |
|
| 583 |
+ <block wx:elif="{{item.node == 'text'}}">
|
|
| 584 |
+ <!--如果是,直接进行--> |
|
| 585 |
+ <template is="WxEmojiView" data="{{item}}" />
|
|
| 586 |
+ </block> |
|
| 587 |
+ |
|
| 588 |
+</template> |
|
| 589 |
+<!--循环模版--> |
|
| 590 |
+<template name="wxParse7"> |
|
| 591 |
+ <!--<template is="wxParse8" data="{{item}}" />-->
|
|
| 592 |
+ <!--判断是否是标签节点--> |
|
| 593 |
+ <block wx:if="{{item.node == 'element'}}">
|
|
| 594 |
+ <block wx:if="{{item.tag == 'button'}}">
|
|
| 595 |
+ <button type="default" size="mini"> |
|
| 596 |
+ <block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
|
|
| 597 |
+ <template is="wxParse8" data="{{item}}" />
|
|
| 598 |
+ </block> |
|
| 599 |
+ </button> |
|
| 600 |
+ </block> |
|
| 601 |
+ <!--li类型--> |
|
| 602 |
+ <block wx:elif="{{item.tag == 'li'}}">
|
|
| 603 |
+ <view class="{{item.classStr}} wxParse-li" style="{{item.styleStr}}">
|
|
| 604 |
+ <view class="{{item.classStr}} wxParse-li-inner">
|
|
| 605 |
+ <view class="{{item.classStr}} wxParse-li-text">
|
|
| 606 |
+ <view class="{{item.classStr}} wxParse-li-circle"></view>
|
|
| 607 |
+ </view> |
|
| 608 |
+ <view class="{{item.classStr}} wxParse-li-text">
|
|
| 609 |
+ <block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
|
|
| 610 |
+ <template is="wxParse8" data="{{item}}" />
|
|
| 611 |
+ </block> |
|
| 612 |
+ </view> |
|
| 613 |
+ </view> |
|
| 614 |
+ </view> |
|
| 615 |
+ </block> |
|
| 616 |
+ |
|
| 617 |
+ <!--video类型--> |
|
| 618 |
+ <block wx:elif="{{item.tag == 'video'}}">
|
|
| 619 |
+ <template is="wxParseVideo" data="{{item}}" />
|
|
| 620 |
+ </block> |
|
| 621 |
+ |
|
| 622 |
+ <!--img类型--> |
|
| 623 |
+ <block wx:elif="{{item.tag == 'img'}}">
|
|
| 624 |
+ <template is="wxParseImg" data="{{item}}" />
|
|
| 625 |
+ </block> |
|
| 626 |
+ |
|
| 627 |
+ <!--a类型--> |
|
| 628 |
+ <block wx:elif="{{item.tag == 'a'}}">
|
|
| 629 |
+ <view bindtap="wxParseTagATap" class="wxParse-inline {{item.classStr}} wxParse-{{item.tag}}" data-src="{{item.attr.href}}" style="{{item.styleStr}}" hover-class="wxParse-a-hover">
|
|
| 630 |
+ <block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
|
|
| 631 |
+ <template is="wxParse8" data="{{item}}" />
|
|
| 632 |
+ </block> |
|
| 633 |
+ </view> |
|
| 634 |
+ </block> |
|
| 635 |
+ |
|
| 636 |
+ <block wx:elif="{{item.tag == 'br'}}">
|
|
| 637 |
+ <template is="WxParseBr"></template> |
|
| 638 |
+ </block> |
|
| 639 |
+ <!--其他块级标签--> |
|
| 640 |
+ <block wx:elif="{{item.tagType == 'block'}}">
|
|
| 641 |
+ <view class="{{item.classStr}} wxParse-{{item.tag}}" style="{{item.styleStr}}">
|
|
| 642 |
+ <block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
|
|
| 643 |
+ <template is="wxParse8" data="{{item}}" />
|
|
| 644 |
+ </block> |
|
| 645 |
+ </view> |
|
| 646 |
+ </block> |
|
| 647 |
+ |
|
| 648 |
+ <!--内联标签--> |
|
| 649 |
+ <view wx:else class="{{item.classStr}} wxParse-{{item.tag}} wxParse-{{item.tagType}}" style="{{item.styleStr}}">
|
|
| 650 |
+ <block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
|
|
| 651 |
+ <template is="wxParse8" data="{{item}}" />
|
|
| 652 |
+ </block> |
|
| 653 |
+ </view> |
|
| 654 |
+ |
|
| 655 |
+ </block> |
|
| 656 |
+ |
|
| 657 |
+ <!--判断是否是文本节点--> |
|
| 658 |
+ <block wx:elif="{{item.node == 'text'}}">
|
|
| 659 |
+ <!--如果是,直接进行--> |
|
| 660 |
+ <template is="WxEmojiView" data="{{item}}" />
|
|
| 661 |
+ </block> |
|
| 662 |
+ |
|
| 663 |
+</template> |
|
| 664 |
+ |
|
| 665 |
+<!--循环模版--> |
|
| 666 |
+<template name="wxParse8"> |
|
| 667 |
+ <!--<template is="wxParse9" data="{{item}}" />-->
|
|
| 668 |
+ <!--判断是否是标签节点--> |
|
| 669 |
+ <block wx:if="{{item.node == 'element'}}">
|
|
| 670 |
+ <block wx:if="{{item.tag == 'button'}}">
|
|
| 671 |
+ <button type="default" size="mini"> |
|
| 672 |
+ <block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
|
|
| 673 |
+ <template is="wxParse9" data="{{item}}" />
|
|
| 674 |
+ </block> |
|
| 675 |
+ </button> |
|
| 676 |
+ </block> |
|
| 677 |
+ <!--li类型--> |
|
| 678 |
+ <block wx:elif="{{item.tag == 'li'}}">
|
|
| 679 |
+ <view class="{{item.classStr}} wxParse-li" style="{{item.styleStr}}">
|
|
| 680 |
+ <view class="{{item.classStr}} wxParse-li-inner">
|
|
| 681 |
+ <view class="{{item.classStr}} wxParse-li-text">
|
|
| 682 |
+ <view class="{{item.classStr}} wxParse-li-circle"></view>
|
|
| 683 |
+ </view> |
|
| 684 |
+ <view class="{{item.classStr}} wxParse-li-text">
|
|
| 685 |
+ <block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
|
|
| 686 |
+ <template is="wxParse9" data="{{item}}" />
|
|
| 687 |
+ </block> |
|
| 688 |
+ </view> |
|
| 689 |
+ </view> |
|
| 690 |
+ </view> |
|
| 691 |
+ </block> |
|
| 692 |
+ |
|
| 693 |
+ <!--video类型--> |
|
| 694 |
+ <block wx:elif="{{item.tag == 'video'}}">
|
|
| 695 |
+ <template is="wxParseVideo" data="{{item}}" />
|
|
| 696 |
+ </block> |
|
| 697 |
+ |
|
| 698 |
+ <!--img类型--> |
|
| 699 |
+ <block wx:elif="{{item.tag == 'img'}}">
|
|
| 700 |
+ <template is="wxParseImg" data="{{item}}" />
|
|
| 701 |
+ </block> |
|
| 702 |
+ |
|
| 703 |
+ <!--a类型--> |
|
| 704 |
+ <block wx:elif="{{item.tag == 'a'}}">
|
|
| 705 |
+ <view bindtap="wxParseTagATap" class="wxParse-inline {{item.classStr}} wxParse-{{item.tag}}" data-src="{{item.attr.href}}" style="{{item.styleStr}}" hover-class="wxParse-a-hover">
|
|
| 706 |
+ <block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
|
|
| 707 |
+ <template is="wxParse9" data="{{item}}" />
|
|
| 708 |
+ </block> |
|
| 709 |
+ </view> |
|
| 710 |
+ </block> |
|
| 711 |
+ |
|
| 712 |
+ <block wx:elif="{{item.tag == 'br'}}">
|
|
| 713 |
+ <template is="WxParseBr"></template> |
|
| 714 |
+ </block> |
|
| 715 |
+ <!--其他块级标签--> |
|
| 716 |
+ <block wx:elif="{{item.tagType == 'block'}}">
|
|
| 717 |
+ <view class="{{item.classStr}} wxParse-{{item.tag}}" style="{{item.styleStr}}">
|
|
| 718 |
+ <block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
|
|
| 719 |
+ <template is="wxParse9" data="{{item}}" />
|
|
| 720 |
+ </block> |
|
| 721 |
+ </view> |
|
| 722 |
+ </block> |
|
| 723 |
+ |
|
| 724 |
+ <!--内联标签--> |
|
| 725 |
+ <view wx:else class="{{item.classStr}} wxParse-{{item.tag}} wxParse-{{item.tagType}}" style="{{item.styleStr}}">
|
|
| 726 |
+ <block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
|
|
| 727 |
+ <template is="wxParse9" data="{{item}}" />
|
|
| 728 |
+ </block> |
|
| 729 |
+ </view> |
|
| 730 |
+ |
|
| 731 |
+ </block> |
|
| 732 |
+ |
|
| 733 |
+ <!--判断是否是文本节点--> |
|
| 734 |
+ <block wx:elif="{{item.node == 'text'}}">
|
|
| 735 |
+ <!--如果是,直接进行--> |
|
| 736 |
+ <template is="WxEmojiView" data="{{item}}" />
|
|
| 737 |
+ </block> |
|
| 738 |
+ |
|
| 739 |
+</template> |
|
| 740 |
+ |
|
| 741 |
+<!--循环模版--> |
|
| 742 |
+<template name="wxParse9"> |
|
| 743 |
+ <!--<template is="wxParse10" data="{{item}}" />-->
|
|
| 744 |
+ <!--判断是否是标签节点--> |
|
| 745 |
+ <block wx:if="{{item.node == 'element'}}">
|
|
| 746 |
+ <block wx:if="{{item.tag == 'button'}}">
|
|
| 747 |
+ <button type="default" size="mini"> |
|
| 748 |
+ <block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
|
|
| 749 |
+ <template is="wxParse10" data="{{item}}" />
|
|
| 750 |
+ </block> |
|
| 751 |
+ </button> |
|
| 752 |
+ </block> |
|
| 753 |
+ <!--li类型--> |
|
| 754 |
+ <block wx:elif="{{item.tag == 'li'}}">
|
|
| 755 |
+ <view class="{{item.classStr}} wxParse-li" style="{{item.styleStr}}">
|
|
| 756 |
+ <view class="{{item.classStr}} wxParse-li-inner">
|
|
| 757 |
+ <view class="{{item.classStr}} wxParse-li-text">
|
|
| 758 |
+ <view class="{{item.classStr}} wxParse-li-circle"></view>
|
|
| 759 |
+ </view> |
|
| 760 |
+ <view class="{{item.classStr}} wxParse-li-text">
|
|
| 761 |
+ <block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
|
|
| 762 |
+ <template is="wxParse10" data="{{item}}" />
|
|
| 763 |
+ </block> |
|
| 764 |
+ </view> |
|
| 765 |
+ </view> |
|
| 766 |
+ </view> |
|
| 767 |
+ </block> |
|
| 768 |
+ |
|
| 769 |
+ <!--video类型--> |
|
| 770 |
+ <block wx:elif="{{item.tag == 'video'}}">
|
|
| 771 |
+ <template is="wxParseVideo" data="{{item}}" />
|
|
| 772 |
+ </block> |
|
| 773 |
+ |
|
| 774 |
+ <!--img类型--> |
|
| 775 |
+ <block wx:elif="{{item.tag == 'img'}}">
|
|
| 776 |
+ <template is="wxParseImg" data="{{item}}" />
|
|
| 777 |
+ </block> |
|
| 778 |
+ |
|
| 779 |
+ <!--a类型--> |
|
| 780 |
+ <block wx:elif="{{item.tag == 'a'}}">
|
|
| 781 |
+ <view bindtap="wxParseTagATap" class="wxParse-inline {{item.classStr}} wxParse-{{item.tag}}" data-src="{{item.attr.href}}" style="{{item.styleStr}}" hover-class="wxParse-a-hover">
|
|
| 782 |
+ <block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
|
|
| 783 |
+ <template is="wxParse10" data="{{item}}" />
|
|
| 784 |
+ </block> |
|
| 785 |
+ </view> |
|
| 786 |
+ </block> |
|
| 787 |
+ |
|
| 788 |
+ <block wx:elif="{{item.tag == 'br'}}">
|
|
| 789 |
+ <template is="WxParseBr"></template> |
|
| 790 |
+ </block> |
|
| 791 |
+ <!--其他块级标签--> |
|
| 792 |
+ <block wx:elif="{{item.tagType == 'block'}}">
|
|
| 793 |
+ <view class="{{item.classStr}} wxParse-{{item.tag}}" style="{{item.styleStr}}">
|
|
| 794 |
+ <block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
|
|
| 795 |
+ <template is="wxParse10" data="{{item}}" />
|
|
| 796 |
+ </block> |
|
| 797 |
+ </view> |
|
| 798 |
+ </block> |
|
| 799 |
+ |
|
| 800 |
+ <!--内联标签--> |
|
| 801 |
+ <view wx:else class="{{item.classStr}} wxParse-{{item.tag}} wxParse-{{item.tagType}}" style="{{item.styleStr}}">
|
|
| 802 |
+ <block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
|
|
| 803 |
+ <template is="wxParse10" data="{{item}}" />
|
|
| 804 |
+ </block> |
|
| 805 |
+ </view> |
|
| 806 |
+ |
|
| 807 |
+ </block> |
|
| 808 |
+ |
|
| 809 |
+ <!--判断是否是文本节点--> |
|
| 810 |
+ <block wx:elif="{{item.node == 'text'}}">
|
|
| 811 |
+ <!--如果是,直接进行--> |
|
| 812 |
+ <template is="WxEmojiView" data="{{item}}" />
|
|
| 813 |
+ </block> |
|
| 814 |
+ |
|
| 815 |
+</template> |
|
| 816 |
+ |
|
| 817 |
+<!--循环模版--> |
|
| 818 |
+<template name="wxParse10"> |
|
| 819 |
+ <!--<template is="wxParse11" data="{{item}}" />-->
|
|
| 820 |
+ <!--判断是否是标签节点--> |
|
| 821 |
+ <block wx:if="{{item.node == 'element'}}">
|
|
| 822 |
+ <block wx:if="{{item.tag == 'button'}}">
|
|
| 823 |
+ <button type="default" size="mini"> |
|
| 824 |
+ <block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
|
|
| 825 |
+ <template is="wxParse11" data="{{item}}" />
|
|
| 826 |
+ </block> |
|
| 827 |
+ </button> |
|
| 828 |
+ </block> |
|
| 829 |
+ <!--li类型--> |
|
| 830 |
+ <block wx:elif="{{item.tag == 'li'}}">
|
|
| 831 |
+ <view class="{{item.classStr}} wxParse-li" style="{{item.styleStr}}">
|
|
| 832 |
+ <view class="{{item.classStr}} wxParse-li-inner">
|
|
| 833 |
+ <view class="{{item.classStr}} wxParse-li-text">
|
|
| 834 |
+ <view class="{{item.classStr}} wxParse-li-circle"></view>
|
|
| 835 |
+ </view> |
|
| 836 |
+ <view class="{{item.classStr}} wxParse-li-text">
|
|
| 837 |
+ <block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
|
|
| 838 |
+ <template is="wxParse11" data="{{item}}" />
|
|
| 839 |
+ </block> |
|
| 840 |
+ </view> |
|
| 841 |
+ </view> |
|
| 842 |
+ </view> |
|
| 843 |
+ </block> |
|
| 844 |
+ |
|
| 845 |
+ <!--video类型--> |
|
| 846 |
+ <block wx:elif="{{item.tag == 'video'}}">
|
|
| 847 |
+ <template is="wxParseVideo" data="{{item}}" />
|
|
| 848 |
+ </block> |
|
| 849 |
+ |
|
| 850 |
+ <!--img类型--> |
|
| 851 |
+ <block wx:elif="{{item.tag == 'img'}}">
|
|
| 852 |
+ <template is="wxParseImg" data="{{item}}" />
|
|
| 853 |
+ </block> |
|
| 854 |
+ |
|
| 855 |
+ <!--a类型--> |
|
| 856 |
+ <block wx:elif="{{item.tag == 'a'}}">
|
|
| 857 |
+ <view bindtap="wxParseTagATap" class="wxParse-inline {{item.classStr}} wxParse-{{item.tag}}" data-src="{{item.attr.href}}" style="{{item.styleStr}}" hover-class="wxParse-a-hover">
|
|
| 858 |
+ <block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
|
|
| 859 |
+ <template is="wxParse11" data="{{item}}" />
|
|
| 860 |
+ </block> |
|
| 861 |
+ </view> |
|
| 862 |
+ </block> |
|
| 863 |
+ |
|
| 864 |
+ <block wx:elif="{{item.tag == 'br'}}">
|
|
| 865 |
+ <template is="WxParseBr"></template> |
|
| 866 |
+ </block> |
|
| 867 |
+ <!--其他块级标签--> |
|
| 868 |
+ <block wx:elif="{{item.tagType == 'block'}}">
|
|
| 869 |
+ <view class="{{item.classStr}} wxParse-{{item.tag}}" style="{{item.styleStr}}">
|
|
| 870 |
+ <block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
|
|
| 871 |
+ <template is="wxParse11" data="{{item}}" />
|
|
| 872 |
+ </block> |
|
| 873 |
+ </view> |
|
| 874 |
+ </block> |
|
| 875 |
+ |
|
| 876 |
+ <!--内联标签--> |
|
| 877 |
+ <view wx:else class="{{item.classStr}} wxParse-{{item.tag}} wxParse-{{item.tagType}}" style="{{item.styleStr}}">
|
|
| 878 |
+ <block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
|
|
| 879 |
+ <template is="wxParse11" data="{{item}}" />
|
|
| 880 |
+ </block> |
|
| 881 |
+ </view> |
|
| 882 |
+ |
|
| 883 |
+ </block> |
|
| 884 |
+ |
|
| 885 |
+ <!--判断是否是文本节点--> |
|
| 886 |
+ <block wx:elif="{{item.node == 'text'}}">
|
|
| 887 |
+ <!--如果是,直接进行--> |
|
| 888 |
+ <template is="WxEmojiView" data="{{item}}" />
|
|
| 889 |
+ </block> |
|
| 890 |
+ |
|
| 891 |
+</template> |
|
| 892 |
+ |
|
| 893 |
+<!--循环模版--> |
|
| 894 |
+<template name="wxParse11"> |
|
| 895 |
+ <!--<template is="wxParse12" data="{{item}}" />-->
|
|
| 896 |
+ <!--判断是否是标签节点--> |
|
| 897 |
+ <block wx:if="{{item.node == 'element'}}">
|
|
| 898 |
+ <block wx:if="{{item.tag == 'button'}}">
|
|
| 899 |
+ <button type="default" size="mini"> |
|
| 900 |
+ <block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
|
|
| 901 |
+ <template is="wxParse12" data="{{item}}" />
|
|
| 902 |
+ </block> |
|
| 903 |
+ </button> |
|
| 904 |
+ </block> |
|
| 905 |
+ <!--li类型--> |
|
| 906 |
+ <block wx:elif="{{item.tag == 'li'}}">
|
|
| 907 |
+ <view class="{{item.classStr}} wxParse-li" style="{{item.styleStr}}">
|
|
| 908 |
+ <view class="{{item.classStr}} wxParse-li-inner">
|
|
| 909 |
+ <view class="{{item.classStr}} wxParse-li-text">
|
|
| 910 |
+ <view class="{{item.classStr}} wxParse-li-circle"></view>
|
|
| 911 |
+ </view> |
|
| 912 |
+ <view class="{{item.classStr}} wxParse-li-text">
|
|
| 913 |
+ <block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
|
|
| 914 |
+ <template is="wxParse12" data="{{item}}" />
|
|
| 915 |
+ </block> |
|
| 916 |
+ </view> |
|
| 917 |
+ </view> |
|
| 918 |
+ </view> |
|
| 919 |
+ </block> |
|
| 920 |
+ |
|
| 921 |
+ <!--video类型--> |
|
| 922 |
+ <block wx:elif="{{item.tag == 'video'}}">
|
|
| 923 |
+ <template is="wxParseVideo" data="{{item}}" />
|
|
| 924 |
+ </block> |
|
| 925 |
+ |
|
| 926 |
+ <!--img类型--> |
|
| 927 |
+ <block wx:elif="{{item.tag == 'img'}}">
|
|
| 928 |
+ <template is="wxParseImg" data="{{item}}" />
|
|
| 929 |
+ </block> |
|
| 930 |
+ |
|
| 931 |
+ <!--a类型--> |
|
| 932 |
+ <block wx:elif="{{item.tag == 'a'}}">
|
|
| 933 |
+ <view bindtap="wxParseTagATap" class="wxParse-inline {{item.classStr}} wxParse-{{item.tag}}" data-src="{{item.attr.href}}" style="{{item.styleStr}}" hover-class="wxParse-a-hover">
|
|
| 934 |
+ <block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
|
|
| 935 |
+ <template is="wxParse12" data="{{item}}" />
|
|
| 936 |
+ </block> |
|
| 937 |
+ </view> |
|
| 938 |
+ </block> |
|
| 939 |
+ |
|
| 940 |
+ <block wx:elif="{{item.tag == 'br'}}">
|
|
| 941 |
+ <template is="WxParseBr"></template> |
|
| 942 |
+ </block> |
|
| 943 |
+ <!--其他块级标签--> |
|
| 944 |
+ <block wx:elif="{{item.tagType == 'block'}}">
|
|
| 945 |
+ <view class="{{item.classStr}} wxParse-{{item.tag}}" style="{{item.styleStr}}">
|
|
| 946 |
+ <block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
|
|
| 947 |
+ <template is="wxParse12" data="{{item}}" />
|
|
| 948 |
+ </block> |
|
| 949 |
+ </view> |
|
| 950 |
+ </block> |
|
| 951 |
+ |
|
| 952 |
+ <!--内联标签--> |
|
| 953 |
+ <view wx:else class="{{item.classStr}} wxParse-{{item.tag}} wxParse-{{item.tagType}}" style="{{item.styleStr}}">
|
|
| 954 |
+ <block wx:for="{{item.nodes}}" wx:for-item="item" wx:key="">
|
|
| 955 |
+ <template is="wxParse12" data="{{item}}" />
|
|
| 956 |
+ </block> |
|
| 957 |
+ </view> |
|
| 958 |
+ |
|
| 959 |
+ </block> |
|
| 960 |
+ |
|
| 961 |
+ <!--判断是否是文本节点--> |
|
| 962 |
+ <block wx:elif="{{item.node == 'text'}}">
|
|
| 963 |
+ <!--如果是,直接进行--> |
|
| 964 |
+ <template is="WxEmojiView" data="{{item}}" />
|
|
| 965 |
+ </block> |
|
| 966 |
+ |
|
| 967 |
+</template> |
@@ -0,0 +1,270 @@ |
||
| 1 |
+/** |
|
| 2 |
+ * author: Di (微信小程序开发工程师) |
|
| 3 |
+ * organization: WeAppDev(微信小程序开发论坛)(http://weappdev.com) |
|
| 4 |
+ * 垂直微信小程序开发交流社区 |
|
| 5 |
+ * |
|
| 6 |
+ * github地址: https://github.com/icindy/wxParse |
|
| 7 |
+ * |
|
| 8 |
+ * for: 微信小程序富文本解析 |
|
| 9 |
+ * detail : http://weappdev.com/t/wxparse-alpha0-1-html-markdown/184 |
|
| 10 |
+ */ |
|
| 11 |
+ |
|
| 12 |
+.wxParse {
|
|
| 13 |
+ margin: 0 5px; |
|
| 14 |
+ font-family: Helvetica, sans-serif; |
|
| 15 |
+ font-size: 28rpx; |
|
| 16 |
+ color: #666; |
|
| 17 |
+ line-height: 1.8; |
|
| 18 |
+} |
|
| 19 |
+view {
|
|
| 20 |
+ word-break: break-all; |
|
| 21 |
+} |
|
| 22 |
+.wxParse-inline {
|
|
| 23 |
+ display: inline; |
|
| 24 |
+ margin: 0; |
|
| 25 |
+ padding: 0; |
|
| 26 |
+} |
|
| 27 |
+/*//标题 */ |
|
| 28 |
+.wxParse-div {
|
|
| 29 |
+ margin: 0; |
|
| 30 |
+ padding: 0; |
|
| 31 |
+} |
|
| 32 |
+.wxParse-h1 {
|
|
| 33 |
+ font-size: 2em; |
|
| 34 |
+ margin: 0.67em 0; |
|
| 35 |
+} |
|
| 36 |
+.wxParse-h2 {
|
|
| 37 |
+ font-size: 1.5em; |
|
| 38 |
+ margin: 0.75em 0; |
|
| 39 |
+} |
|
| 40 |
+.wxParse-h3 {
|
|
| 41 |
+ font-size: 1.17em; |
|
| 42 |
+ margin: 0.83em 0; |
|
| 43 |
+} |
|
| 44 |
+.wxParse-h4 {
|
|
| 45 |
+ margin: 1.12em 0; |
|
| 46 |
+} |
|
| 47 |
+.wxParse-h5 {
|
|
| 48 |
+ font-size: 0.83em; |
|
| 49 |
+ margin: 1.5em 0; |
|
| 50 |
+} |
|
| 51 |
+.wxParse-h6 {
|
|
| 52 |
+ font-size: 0.75em; |
|
| 53 |
+ margin: 1.67em 0; |
|
| 54 |
+} |
|
| 55 |
+ |
|
| 56 |
+.wxParse-h1 {
|
|
| 57 |
+ font-size: 18px; |
|
| 58 |
+ font-weight: 400; |
|
| 59 |
+ margin-bottom: 0.9em; |
|
| 60 |
+} |
|
| 61 |
+.wxParse-h2 {
|
|
| 62 |
+ font-size: 16px; |
|
| 63 |
+ font-weight: 400; |
|
| 64 |
+ margin-bottom: 0.34em; |
|
| 65 |
+} |
|
| 66 |
+.wxParse-h3 {
|
|
| 67 |
+ font-weight: 400; |
|
| 68 |
+ font-size: 15px; |
|
| 69 |
+ margin-bottom: 0.34em; |
|
| 70 |
+} |
|
| 71 |
+.wxParse-h4 {
|
|
| 72 |
+ font-weight: 400; |
|
| 73 |
+ font-size: 14px; |
|
| 74 |
+ margin-bottom: 0.24em; |
|
| 75 |
+} |
|
| 76 |
+.wxParse-h5 {
|
|
| 77 |
+ font-weight: 400; |
|
| 78 |
+ font-size: 13px; |
|
| 79 |
+ margin-bottom: 0.14em; |
|
| 80 |
+} |
|
| 81 |
+.wxParse-h6 {
|
|
| 82 |
+ font-weight: 400; |
|
| 83 |
+ font-size: 12px; |
|
| 84 |
+ margin-bottom: 0.04em; |
|
| 85 |
+} |
|
| 86 |
+ |
|
| 87 |
+.wxParse-h1, |
|
| 88 |
+.wxParse-h2, |
|
| 89 |
+.wxParse-h3, |
|
| 90 |
+.wxParse-h4, |
|
| 91 |
+.wxParse-h5, |
|
| 92 |
+.wxParse-h6, |
|
| 93 |
+.wxParse-b, |
|
| 94 |
+.wxParse-strong {
|
|
| 95 |
+ font-weight: bolder; |
|
| 96 |
+} |
|
| 97 |
+ |
|
| 98 |
+.wxParse-i, |
|
| 99 |
+.wxParse-cite, |
|
| 100 |
+.wxParse-em, |
|
| 101 |
+.wxParse-var, |
|
| 102 |
+.wxParse-address {
|
|
| 103 |
+ font-style: italic; |
|
| 104 |
+} |
|
| 105 |
+.wxParse-pre, |
|
| 106 |
+.wxParse-tt, |
|
| 107 |
+.wxParse-code, |
|
| 108 |
+.wxParse-kbd, |
|
| 109 |
+.wxParse-samp {
|
|
| 110 |
+ font-family: monospace; |
|
| 111 |
+} |
|
| 112 |
+.wxParse-pre {
|
|
| 113 |
+ white-space: pre; |
|
| 114 |
+} |
|
| 115 |
+.wxParse-big {
|
|
| 116 |
+ font-size: 1.17em; |
|
| 117 |
+} |
|
| 118 |
+.wxParse-small, |
|
| 119 |
+.wxParse-sub, |
|
| 120 |
+.wxParse-sup {
|
|
| 121 |
+ font-size: 0.83em; |
|
| 122 |
+} |
|
| 123 |
+.wxParse-sub {
|
|
| 124 |
+ vertical-align: sub; |
|
| 125 |
+} |
|
| 126 |
+.wxParse-sup {
|
|
| 127 |
+ vertical-align: super; |
|
| 128 |
+} |
|
| 129 |
+.wxParse-s, |
|
| 130 |
+.wxParse-strike, |
|
| 131 |
+.wxParse-del {
|
|
| 132 |
+ text-decoration: line-through; |
|
| 133 |
+} |
|
| 134 |
+/*wxparse-自定义个性化的css样式*/ |
|
| 135 |
+/*增加video的css样式*/ |
|
| 136 |
+.wxParse-strong, |
|
| 137 |
+.wxParse-s {
|
|
| 138 |
+ display: inline; |
|
| 139 |
+} |
|
| 140 |
+.wxParse-a {
|
|
| 141 |
+ color: #576b95; |
|
| 142 |
+ text-decoration: underline; |
|
| 143 |
+ word-break: break-all; |
|
| 144 |
+ overflow: auto; |
|
| 145 |
+} |
|
| 146 |
+ |
|
| 147 |
+.wxParse-a-hover {
|
|
| 148 |
+ opacity: 0.8; |
|
| 149 |
+} |
|
| 150 |
+ |
|
| 151 |
+.wxParse-video {
|
|
| 152 |
+ text-align: center; |
|
| 153 |
+ margin: 10px 0; |
|
| 154 |
+} |
|
| 155 |
+ |
|
| 156 |
+.wxParse-video-video {
|
|
| 157 |
+ width: 100%; |
|
| 158 |
+} |
|
| 159 |
+ |
|
| 160 |
+.wxParse-img {
|
|
| 161 |
+ /*background-color: #efefef;*/ |
|
| 162 |
+ overflow: hidden; |
|
| 163 |
+} |
|
| 164 |
+ |
|
| 165 |
+.wxParse-blockquote {
|
|
| 166 |
+ margin: 0; |
|
| 167 |
+ padding: 10px 0 10px 5px; |
|
| 168 |
+ font-family: Courier, Calibri, '宋体'; |
|
| 169 |
+ background: #f5f5f5; |
|
| 170 |
+ border-left: 3px solid #dbdbdb; |
|
| 171 |
+} |
|
| 172 |
+ |
|
| 173 |
+.wxParse-code, |
|
| 174 |
+.wxParse-wxxxcode-style {
|
|
| 175 |
+ display: inline; |
|
| 176 |
+ background: #f5f5f5; |
|
| 177 |
+} |
|
| 178 |
+.wxParse-ul {
|
|
| 179 |
+ margin: 20rpx 10rpx; |
|
| 180 |
+} |
|
| 181 |
+ |
|
| 182 |
+.wxParse-li, |
|
| 183 |
+.wxParse-li-inner {
|
|
| 184 |
+ display: flex; |
|
| 185 |
+ align-items: baseline; |
|
| 186 |
+} |
|
| 187 |
+.wxParse-li-text {
|
|
| 188 |
+ align-items: center; |
|
| 189 |
+} |
|
| 190 |
+ |
|
| 191 |
+.wxParse-li-circle {
|
|
| 192 |
+ display: inline-flex; |
|
| 193 |
+ width: 6px; |
|
| 194 |
+ height: 6px; |
|
| 195 |
+ border-radius: 3px; |
|
| 196 |
+ background-color: #333; |
|
| 197 |
+ margin-right: 5px; |
|
| 198 |
+} |
|
| 199 |
+ |
|
| 200 |
+.wxParse-li-square {
|
|
| 201 |
+ display: inline-flex; |
|
| 202 |
+ width: 10rpx; |
|
| 203 |
+ height: 10rpx; |
|
| 204 |
+ background-color: #333; |
|
| 205 |
+ margin-right: 5px; |
|
| 206 |
+} |
|
| 207 |
+.wxParse-li-ring {
|
|
| 208 |
+ display: inline-flex; |
|
| 209 |
+ width: 10rpx; |
|
| 210 |
+ height: 10rpx; |
|
| 211 |
+ border: 2rpx solid #333; |
|
| 212 |
+ border-radius: 50%; |
|
| 213 |
+ background-color: #fff; |
|
| 214 |
+ margin-right: 5px; |
|
| 215 |
+} |
|
| 216 |
+ |
|
| 217 |
+/*.wxParse-table{
|
|
| 218 |
+ width: 100%; |
|
| 219 |
+ height: 400px; |
|
| 220 |
+} |
|
| 221 |
+.wxParse-thead,.wxParse-tfoot,.wxParse-tr{
|
|
| 222 |
+ display: flex; |
|
| 223 |
+ flex-direction: row; |
|
| 224 |
+} |
|
| 225 |
+.wxParse-th,.wxParse-td{
|
|
| 226 |
+ display: flex; |
|
| 227 |
+ width: 580px; |
|
| 228 |
+ overflow: auto; |
|
| 229 |
+}*/ |
|
| 230 |
+ |
|
| 231 |
+.wxParse-u {
|
|
| 232 |
+ text-decoration: underline; |
|
| 233 |
+} |
|
| 234 |
+.wxParse-hide {
|
|
| 235 |
+ display: none; |
|
| 236 |
+} |
|
| 237 |
+.WxEmojiView {
|
|
| 238 |
+ align-items: center; |
|
| 239 |
+} |
|
| 240 |
+.wxEmoji {
|
|
| 241 |
+ width: 16px; |
|
| 242 |
+ height: 16px; |
|
| 243 |
+} |
|
| 244 |
+.wxParse-tr {
|
|
| 245 |
+ display: flex; |
|
| 246 |
+ border-right: 1px solid #e0e0e0; |
|
| 247 |
+ border-bottom: 1px solid #e0e0e0; |
|
| 248 |
+ border-top: 1px solid #e0e0e0; |
|
| 249 |
+} |
|
| 250 |
+.wxParse-th, |
|
| 251 |
+.wxParse-td {
|
|
| 252 |
+ flex: 1; |
|
| 253 |
+ padding: 5px; |
|
| 254 |
+ font-size: 28rpx; |
|
| 255 |
+ border-left: 1px solid #e0e0e0; |
|
| 256 |
+ word-break: break-all; |
|
| 257 |
+} |
|
| 258 |
+.wxParse-td:last {
|
|
| 259 |
+ border-top: 1px solid #e0e0e0; |
|
| 260 |
+} |
|
| 261 |
+.wxParse-th {
|
|
| 262 |
+ background: #f0f0f0; |
|
| 263 |
+ border-top: 1px solid #e0e0e0; |
|
| 264 |
+} |
|
| 265 |
+.wxParse-del {
|
|
| 266 |
+ display: inline; |
|
| 267 |
+} |
|
| 268 |
+.wxParse-figure {
|
|
| 269 |
+ overflow: hidden; |
|
| 270 |
+} |
@@ -0,0 +1,10 @@ |
||
| 1 |
+var filter = function (text) {
|
|
| 2 |
+ if (text) {
|
|
| 3 |
+ var pattern = '\\\\n'; |
|
| 4 |
+ var target = '\n'; |
|
| 5 |
+ var reg = getRegExp(pattern, 'g'); |
|
| 6 |
+ return text.replace(reg, target); |
|
| 7 |
+ } |
|
| 8 |
+}; |
|
| 9 |
+ |
|
| 10 |
+module.exports.filter = filter; |