@@ -1808,25 +1808,36 @@
1808 1808 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
1809 1809 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
1810 1810 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
1811 1811 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** COMMAND: test-markdown-render
1812 1812 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
1813 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Usage: %fossil test-markdown-render FILE
1813 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Usage: %fossil test-markdown-render FILE ...
1814 1814 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
1815 1815 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Render markdown in FILE as HTML on stdout.
1816 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Options:
1817 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
1818 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** --safe Do "safe-html" rendering.
1816 1819 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
1817 1820 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
void test_markdown_render(void){
1818 1821 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Blob in, out;
1822 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int i;
1819 1823 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db_find_and_open_repository(OPEN_OK_NOT_FOUND|OPEN_SUBSTITUTE,0);
1824 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( find_option("safe",0,0)!=0 ){
1825 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ safe_html_enable(1);
1826 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1820 1827 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
verify_all_options();
1821 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( g.argc!=3 ) usage("FILE");
1822 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_zero(&out);
1823 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_read_from_file(&in, g.argv[2], ExtFILE);
1824 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- markdown_to_html(&in, 0, &out);
1825 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_write_to_file(&out, "-");
1826 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_reset(&in);
1827 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- blob_reset(&out);
1828 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i=2; i<g.argc; i++){
1829 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_zero(&out);
1830 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_read_from_file(&in, g.argv[i], ExtFILE);
1831 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( g.argc>3 ){
1832 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fossil_print("<!------ %h ------->\n", g.argv[i]);
1833 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1834 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ markdown_to_html(&in, 0, &out);
1835 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_write_to_file(&out, "-");
1836 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_reset(&in);
1837 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_reset(&out);
1838 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
1828 1839 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
1829 1840 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
1830 1841 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
1831 1842 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Search for a <title>...</title> at the beginning of a wiki page.
1832 1843 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Return true (nonzero) if a title is found. Return zero if there is
@@ -2499,39 +2510,57 @@
2499 2510 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
2500 2511 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}while( e!=eEnd && p->n>0 );
2501 2512 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
2502 2513 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
2503 2514 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
2504 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Append HTML text to a Blob object. The appended text is modified
2515 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Enable or disable the "safe-html" feature. When enabled, the
2516 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** HTML generated by Markdown is adjusted so that it cannot cause
2517 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** problems when embedded in a larger document.
2518 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
2519 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int safeHtml = 0;
2520 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ void safe_html_enable(int v){
2521 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ safeHtml = v;
2522 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
2523 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
2524 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
2525 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Append HTML text to a Blob object.
2526 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
2527 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If safe-html is enabled then the appended text is modified
2505 2528 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** changed in the following ways:
2506 2529 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
2507 2530 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** 1. Omit any elements that are not on the AllowedMarkup list.
2508 2531 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
2509 2532 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** 2. Omit any attributes that are not on the AllowedMarkup list.
2510 2533 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
2511 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** 3. Omit any surplus close-tags. (This prevents a surplus </div>
2512 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** or </body> or similar element from interferring with formatting
2513 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** of the outer context in which the HTML is being inserted.)
2534 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** 3. Omit any surplus close-tags.
2514 2535 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
2515 2536 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** 4. Insert additional close-tags as necessary so that any
2516 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** tag in the input that needs a close-tag has one. (This prevents
2517 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** the inserted HTML from messing up the formatting of subsequent
2518 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** sections of the document into which it is being inserted.)
2537 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** tag in the input that needs a close-tag has one.
2538 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
2539 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** This modifications are intended to make the generated HTML safe
2540 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** to be embedded in a larger HTML document, such that the embedded
2541 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** HTML has no influence on the formatting and operation of the
2542 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** larger document.
2519 2543 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
2520 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** The input must be writable. Temporary changes may be made to the
2521 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** input, but the input is restored to its original state prior to
2522 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** returning. If zHtml[nHtml] is not a zero character, then a zero
2523 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** might be written in that position temporarily, but that slot will
2524 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** also be restored before this routine returns.
2544 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** When safe-html is eanbled, the input to this routine must be writable.
2545 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ * Temporary changes may be made to the input, but the input is restored
2546 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** to its original state prior to returning. If zHtml[nHtml] is not a
2547 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** zero character, then a zero might be written in that position
2548 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** temporarily, but that slot will also be restored before this routine
2549 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** returns.
2525 2550 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
2526 2551 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
void safe_html_append(Blob *pBlob, char *zHtml, int nHtml){
2527 2552 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char cLast;
2528 2553 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int i, j, n;
2529 2554 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
HtmlTagStack s;
2530 2555 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
ParsedMarkup markup;
2531 2556 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
2532 2557 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( nHtml<=0 ) return;
2558 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !safeHtml ){
2559 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ blob_append(pBlob, zHtml, nHtml);
2560 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return;
2561 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
2533 2562 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
cLast = zHtml[nHtml];
2534 2563 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
zHtml[nHtml] = 0;
2535 2564 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
html_tagstack_init(&s);
2536 2565 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
2537 2566 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
i = 0;
2538 2567 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!