]> granicus.if.org Git - multimarkdown/commitdiff
FIXED: Improve handling of HTML entities (fixed #71)
authorFletcher T. Penney <fletcher@fletcherpenney.net>
Wed, 31 May 2017 02:31:19 +0000 (22:31 -0400)
committerFletcher T. Penney <fletcher@fletcherpenney.net>
Wed, 31 May 2017 02:31:19 +0000 (22:31 -0400)
Sources/libMultiMarkdown/html.c
Sources/libMultiMarkdown/include/libMultiMarkdown.h
Sources/libMultiMarkdown/latex.c
Sources/libMultiMarkdown/lexer.c
Sources/libMultiMarkdown/lexer.re
Sources/libMultiMarkdown/odf.c
tests/MMD6Tests/Amps and Angles.fodt
tests/MMD6Tests/Amps and Angles.html
tests/MMD6Tests/Amps and Angles.htmlc
tests/MMD6Tests/Amps and Angles.tex
tests/MMD6Tests/Amps and Angles.text

index f33ee8f97f52158ec5955fd4669bbd7a575d1076..bc6355a73e8b36160b735145c25550413275f3bf 100644 (file)
@@ -945,6 +945,9 @@ void mmd_export_token_html(DString * out, const char * source, token * t, scratc
                case HASH6:
                        print_token(t);
                        break;
+               case HTML_ENTITY:
+                       print_token(t);
+                       break;
                case HTML_COMMENT_START:
                        if (!(scratch->extensions & EXT_SMART)) {
                                print_const("&lt;!--");
@@ -1715,6 +1718,10 @@ void mmd_export_token_html_raw(DString * out, const char * source, token * t, sc
                        print_const("\\");
                        mmd_print_char_html(out, source[t->start + 1], false);
                        break;
+               case HTML_ENTITY:
+                       print_const("&amp;");
+                       d_string_append_c_array(out, &(source[t->start + 1]), t->len - 1);
+                       break;
                case MATH_BRACKET_OPEN:
                        print_const("\\[");
                        break;
index d74282c343c9798f7e974036a9272f07d5f18c5e..4d9f8327f1d2e5f1023df75d6f6fa2085484345e 100644 (file)
@@ -396,6 +396,7 @@ enum token_types {
 
        ESCAPED_CHARACTER,
 
+       HTML_ENTITY,
        HTML_COMMENT_START,
        HTML_COMMENT_STOP,
        PAIR_HTML_COMMENT,
index b1d7557a58dbbbfa4d25a7b5c8b16dbbb593cbb5..afcec2d7e4e1f964537f0d669beda8136b5063d9 100644 (file)
@@ -877,6 +877,15 @@ void mmd_export_token_latex(DString * out, const char * source, token * t, scrat
                                }
                        }
                        break;
+               case HTML_ENTITY:
+                       if (source[t->start + 1] == '#') {
+                               print_const("\\&\\#");
+                               d_string_append_c_array(out, &(source[t->start + 2]), t->len - 2);
+                       } else {
+                               print_const("\\");
+                               print_token(t);
+                       }
+                       break;
                case HTML_COMMENT_START:
                        if (!(scratch->extensions & EXT_SMART)) {
                                print_const("<!--");
@@ -1660,6 +1669,9 @@ void mmd_export_token_latex_raw(DString * out, const char * source, token * t, s
                        print_char(source[t->start + 1]);
 //                     mmd_print_char_latex(out, source[t->start + 1]);
                        break;
+               case HTML_ENTITY:
+                       print_token(t);
+                       break;
                case CODE_FENCE:
                        if (t->next)
                                t->next->type = TEXT_EMPTY;
@@ -1758,6 +1770,15 @@ void mmd_export_token_latex_tt(DString * out, const char * source, token * t, sc
                        print_const("\\textbackslash{}");
                        mmd_print_char_latex(out, source[t->start + 1]);
                        break;
+               case HTML_ENTITY:
+                       if (source[t->start + 1] == '#') {
+                               print_const("\\&\\#");
+                               d_string_append_c_array(out, &(source[t->start + 2]), t->len - 2);
+                       } else {
+                               print_const("\\");
+                               print_token(t);
+                       }
+                       break;
                case CODE_FENCE:
                        if (t->next)
                                t->next->type = TEXT_EMPTY;
index 31657277c6edda65dee65038cd9ae74a7482d13c..7c844c0bff1f61280c1b449f9f3ccc03efd01b51 100644 (file)
@@ -1,4 +1,4 @@
-/* Generated by re2c 0.14.3 on Mon May  1 09:51:46 2017 */
+/* Generated by re2c 0.14.3 on Tue May 30 21:57:22 2017 */
 /**
 
        MultiMarkdown 6 -- Lightweight markup processor to produce HTML, LaTeX, and more.
@@ -284,18 +284,18 @@ yy2:
        case 14:        goto yy128;
        case 15:        goto yy135;
        case 16:        goto yy145;
-       default:        goto yy286;
+       default:        goto yy300;
        }
 yy3:
        yyaccept = 0;
        yych = *(YYMARKER = ++YYCURSOR);
        switch (yych) {
-       case '+':       goto yy291;
-       case '-':       goto yy290;
-       case '=':       goto yy287;
-       case '>':       goto yy289;
-       case '{':       goto yy285;
-       case '~':       goto yy288;
+       case '+':       goto yy305;
+       case '-':       goto yy304;
+       case '=':       goto yy301;
+       case '>':       goto yy303;
+       case '{':       goto yy299;
+       case '~':       goto yy302;
        default:        goto yy4;
        }
 yy4:
@@ -304,7 +304,7 @@ yy5:
        yyaccept = 1;
        yych = *(YYMARKER = ++YYCURSOR);
        switch (yych) {
-       case '+':       goto yy282;
+       case '+':       goto yy296;
        default:        goto yy6;
        }
 yy6:
@@ -312,7 +312,7 @@ yy6:
 yy7:
        ++YYCURSOR;
        switch ((yych = *YYCURSOR)) {
-       case '-':       goto yy274;
+       case '-':       goto yy288;
        default:        goto yy8;
        }
 yy8:
@@ -321,8 +321,8 @@ yy9:
        yyaccept = 2;
        yych = *(YYMARKER = ++YYCURSOR);
        switch (yych) {
-       case '!':       goto yy267;
-       case '<':       goto yy268;
+       case '!':       goto yy281;
+       case '<':       goto yy282;
        default:        goto yy10;
        }
 yy10:
@@ -331,8 +331,8 @@ yy11:
        yyaccept = 3;
        yych = *(YYMARKER = ++YYCURSOR);
        switch (yych) {
-       case '>':       goto yy263;
-       case '~':       goto yy262;
+       case '>':       goto yy277;
+       case '~':       goto yy276;
        default:        goto yy12;
        }
 yy12:
@@ -341,7 +341,7 @@ yy13:
        yyaccept = 4;
        yych = *(YYMARKER = ++YYCURSOR);
        switch (yych) {
-       case '=':       goto yy259;
+       case '=':       goto yy273;
        default:        goto yy14;
        }
 yy14:
@@ -349,11 +349,11 @@ yy14:
 yy15:
        ++YYCURSOR;
        switch ((yych = *YYCURSOR)) {
-       case '#':       goto yy255;
-       case '%':       goto yy249;
-       case '>':       goto yy257;
-       case '?':       goto yy251;
-       case '^':       goto yy253;
+       case '#':       goto yy269;
+       case '%':       goto yy263;
+       case '>':       goto yy271;
+       case '?':       goto yy265;
+       case '^':       goto yy267;
        default:        goto yy16;
        }
 yy16:
@@ -364,7 +364,7 @@ yy17:
 yy19:
        ++YYCURSOR;
        switch ((yych = *YYCURSOR)) {
-       case '[':       goto yy247;
+       case '[':       goto yy261;
        default:        goto yy20;
        }
 yy20:
@@ -381,7 +381,7 @@ yy25:
 yy27:
        ++YYCURSOR;
        switch ((yych = *YYCURSOR)) {
-       case '}':       goto yy245;
+       case '}':       goto yy259;
        default:        goto yy28;
        }
 yy28:
@@ -392,7 +392,7 @@ yy29:
 yy31:
        ++YYCURSOR;
        switch ((yych = *YYCURSOR)) {
-       case '\'':      goto yy243;
+       case '\'':      goto yy257;
        default:        goto yy32;
        }
 yy32:
@@ -401,8 +401,8 @@ yy33:
        yyaccept = 5;
        yych = *(YYMARKER = ++YYCURSOR);
        switch (yych) {
-       case ' ':       goto yy235;
-       case '.':       goto yy236;
+       case ' ':       goto yy249;
+       case '.':       goto yy250;
        default:        goto yy20;
        }
 yy34:
@@ -412,8 +412,69 @@ yy36:
        yyaccept = 6;
        yych = *(YYMARKER = ++YYCURSOR);
        switch (yych) {
+       case '#':       goto yy233;
+       case '0':
+       case '1':
+       case '2':
+       case '3':
+       case '4':
+       case '5':
+       case '6':
+       case '7':
+       case '8':
+       case '9':
+       case 'B':
+       case 'C':
+       case 'D':
+       case 'E':
+       case 'F':
+       case 'G':
+       case 'H':
+       case 'I':
+       case 'J':
+       case 'K':
+       case 'L':
+       case 'M':
+       case 'N':
+       case 'O':
+       case 'P':
+       case 'Q':
+       case 'R':
+       case 'S':
+       case 'T':
+       case 'U':
+       case 'V':
+       case 'W':
+       case 'X':
+       case 'Y':
+       case 'Z':
+       case 'b':
+       case 'c':
+       case 'd':
+       case 'e':
+       case 'f':
+       case 'g':
+       case 'h':
+       case 'i':
+       case 'j':
+       case 'k':
+       case 'l':
+       case 'm':
+       case 'n':
+       case 'o':
+       case 'p':
+       case 'q':
+       case 'r':
+       case 's':
+       case 't':
+       case 'u':
+       case 'v':
+       case 'w':
+       case 'x':
+       case 'y':
+       case 'z':       goto yy230;
        case 'A':
-       case 'a':       goto yy230;
+       case 'a':       goto yy232;
        default:        goto yy37;
        }
 yy37:
@@ -1503,234 +1564,409 @@ yy228:
        ++YYCURSOR;
        { return MATH_BRACKET_CLOSE; }
 yy230:
+       ++YYCURSOR;
+       yych = *YYCURSOR;
+yy231:
+       switch (yych) {
+       case '0':
+       case '1':
+       case '2':
+       case '3':
+       case '4':
+       case '5':
+       case '6':
+       case '7':
+       case '8':
+       case '9':
+       case 'A':
+       case 'B':
+       case 'C':
+       case 'D':
+       case 'E':
+       case 'F':
+       case 'G':
+       case 'H':
+       case 'I':
+       case 'J':
+       case 'K':
+       case 'L':
+       case 'M':
+       case 'N':
+       case 'O':
+       case 'P':
+       case 'Q':
+       case 'R':
+       case 'S':
+       case 'T':
+       case 'U':
+       case 'V':
+       case 'W':
+       case 'X':
+       case 'Y':
+       case 'Z':
+       case 'a':
+       case 'b':
+       case 'c':
+       case 'd':
+       case 'e':
+       case 'f':
+       case 'g':
+       case 'h':
+       case 'i':
+       case 'j':
+       case 'k':
+       case 'l':
+       case 'm':
+       case 'n':
+       case 'o':
+       case 'p':
+       case 'q':
+       case 'r':
+       case 's':
+       case 't':
+       case 'u':
+       case 'v':
+       case 'w':
+       case 'x':
+       case 'y':
+       case 'z':       goto yy230;
+       case ';':       goto yy244;
+       default:        goto yy2;
+       }
+yy232:
        yych = *++YYCURSOR;
        switch (yych) {
        case 'M':
-       case 'm':       goto yy231;
+       case 'm':       goto yy243;
+       default:        goto yy231;
+       }
+yy233:
+       yych = *++YYCURSOR;
+       switch (yych) {
+       case '0':
+       case '1':
+       case '2':
+       case '3':
+       case '4':
+       case '5':
+       case '6':
+       case '7':
+       case '8':
+       case '9':       goto yy235;
+       case 'X':
+       case 'x':       goto yy234;
        default:        goto yy2;
        }
-yy231:
+yy234:
        yych = *++YYCURSOR;
        switch (yych) {
+       case ';':       goto yy2;
+       default:        goto yy240;
+       }
+yy235:
+       ++YYCURSOR;
+       yych = *YYCURSOR;
+       switch (yych) {
+       case '0':
+       case '1':
+       case '2':
+       case '3':
+       case '4':
+       case '5':
+       case '6':
+       case '7':
+       case '8':
+       case '9':       goto yy235;
+       case ';':       goto yy237;
+       default:        goto yy2;
+       }
+yy237:
+       ++YYCURSOR;
+       { return HTML_ENTITY; }
+yy239:
+       ++YYCURSOR;
+       yych = *YYCURSOR;
+yy240:
+       switch (yych) {
+       case '0':
+       case '1':
+       case '2':
+       case '3':
+       case '4':
+       case '5':
+       case '6':
+       case '7':
+       case '8':
+       case '9':
+       case 'A':
+       case 'B':
+       case 'C':
+       case 'D':
+       case 'E':
+       case 'F':
+       case 'G':
+       case 'H':
+       case 'I':
+       case 'J':
+       case 'K':
+       case 'L':
+       case 'M':
+       case 'N':
+       case 'O':
        case 'P':
-       case 'p':       goto yy232;
+       case 'Q':
+       case 'R':
+       case 'S':
+       case 'T':
+       case 'U':
+       case 'V':
+       case 'W':
+       case 'X':
+       case 'Y':
+       case 'Z':
+       case '[':
+       case '\\':
+       case ']':
+       case '^':
+       case '_':
+       case '`':
+       case 'a':
+       case 'b':
+       case 'c':
+       case 'd':
+       case 'e':
+       case 'f':       goto yy239;
+       case ';':       goto yy241;
        default:        goto yy2;
        }
-yy232:
+yy241:
+       ++YYCURSOR;
+       { return HTML_ENTITY; }
+yy243:
        yych = *++YYCURSOR;
        switch (yych) {
-       case ';':       goto yy233;
-       default:        goto yy2;
+       case 'P':
+       case 'p':       goto yy246;
+       default:        goto yy231;
        }
-yy233:
+yy244:
+       ++YYCURSOR;
+       { return HTML_ENTITY; }
+yy246:
+       yych = *++YYCURSOR;
+       switch (yych) {
+       case ';':       goto yy247;
+       default:        goto yy231;
+       }
+yy247:
        ++YYCURSOR;
        { return AMPERSAND_LONG; }
-yy235:
+yy249:
        yych = *++YYCURSOR;
        switch (yych) {
-       case '.':       goto yy239;
+       case '.':       goto yy253;
        default:        goto yy2;
        }
-yy236:
+yy250:
        yych = *++YYCURSOR;
        switch (yych) {
-       case '.':       goto yy237;
+       case '.':       goto yy251;
        default:        goto yy2;
        }
-yy237:
+yy251:
        ++YYCURSOR;
        { return ELLIPSIS; }
-yy239:
+yy253:
        yych = *++YYCURSOR;
        switch (yych) {
-       case ' ':       goto yy240;
+       case ' ':       goto yy254;
        default:        goto yy2;
        }
-yy240:
+yy254:
        yych = *++YYCURSOR;
        switch (yych) {
-       case '.':       goto yy241;
+       case '.':       goto yy255;
        default:        goto yy2;
        }
-yy241:
+yy255:
        ++YYCURSOR;
        { return ELLIPSIS; }
-yy243:
+yy257:
        ++YYCURSOR;
        { return QUOTE_RIGHT_ALT; }
-yy245:
+yy259:
        ++YYCURSOR;
        { return BRACE_DOUBLE_RIGHT; }
-yy247:
+yy261:
        ++YYCURSOR;
        { return BRACKET_IMAGE_LEFT; }
-yy249:
+yy263:
        ++YYCURSOR;
        { return BRACKET_VARIABLE_LEFT; }
-yy251:
+yy265:
        ++YYCURSOR;
        { return BRACKET_GLOSSARY_LEFT; }
-yy253:
+yy267:
        ++YYCURSOR;
        { return BRACKET_FOOTNOTE_LEFT; }
-yy255:
+yy269:
        ++YYCURSOR;
        { return BRACKET_CITATION_LEFT; }
-yy257:
+yy271:
        ++YYCURSOR;
        { return BRACKET_ABBREVIATION_LEFT; }
-yy259:
+yy273:
        yych = *++YYCURSOR;
        switch (yych) {
-       case '}':       goto yy260;
+       case '}':       goto yy274;
        default:        goto yy2;
        }
-yy260:
+yy274:
        ++YYCURSOR;
        { return CRITIC_HI_CLOSE; }
-yy262:
+yy276:
        yych = *++YYCURSOR;
        switch (yych) {
-       case '}':       goto yy265;
+       case '}':       goto yy279;
        default:        goto yy2;
        }
-yy263:
+yy277:
        ++YYCURSOR;
        { return CRITIC_SUB_DIV; }
-yy265:
+yy279:
        ++YYCURSOR;
        { return CRITIC_SUB_CLOSE; }
-yy267:
+yy281:
        yych = *++YYCURSOR;
        switch (yych) {
-       case '-':       goto yy271;
+       case '-':       goto yy285;
        default:        goto yy2;
        }
-yy268:
+yy282:
        yych = *++YYCURSOR;
        switch (yych) {
-       case '}':       goto yy269;
+       case '}':       goto yy283;
        default:        goto yy2;
        }
-yy269:
+yy283:
        ++YYCURSOR;
        { return CRITIC_COM_CLOSE; }
-yy271:
+yy285:
        yych = *++YYCURSOR;
        switch (yych) {
-       case '-':       goto yy272;
+       case '-':       goto yy286;
        default:        goto yy2;
        }
-yy272:
+yy286:
        ++YYCURSOR;
        { return HTML_COMMENT_START; }
-yy274:
+yy288:
        ++YYCURSOR;
        switch ((yych = *YYCURSOR)) {
-       case '-':       goto yy280;
-       case '>':       goto yy278;
-       case '}':       goto yy276;
-       default:        goto yy275;
+       case '-':       goto yy294;
+       case '>':       goto yy292;
+       case '}':       goto yy290;
+       default:        goto yy289;
        }
-yy275:
+yy289:
        { return DASH_N; }
-yy276:
+yy290:
        ++YYCURSOR;
        { return CRITIC_DEL_CLOSE; }
-yy278:
+yy292:
        ++YYCURSOR;
        { return HTML_COMMENT_STOP; }
-yy280:
+yy294:
        ++YYCURSOR;
        { return DASH_M; }
-yy282:
+yy296:
        yych = *++YYCURSOR;
        switch (yych) {
-       case '}':       goto yy283;
+       case '}':       goto yy297;
        default:        goto yy2;
        }
-yy283:
+yy297:
        ++YYCURSOR;
        { return CRITIC_ADD_CLOSE; }
-yy285:
+yy299:
        yyaccept = 17;
        yych = *(YYMARKER = ++YYCURSOR);
        switch (yych) {
-       case 'T':       goto yy302;
-       default:        goto yy286;
+       case 'T':       goto yy316;
+       default:        goto yy300;
        }
-yy286:
+yy300:
        { return BRACE_DOUBLE_LEFT; }
-yy287:
+yy301:
        yych = *++YYCURSOR;
        switch (yych) {
-       case '=':       goto yy300;
+       case '=':       goto yy314;
        default:        goto yy2;
        }
-yy288:
+yy302:
        yych = *++YYCURSOR;
        switch (yych) {
-       case '~':       goto yy298;
+       case '~':       goto yy312;
        default:        goto yy2;
        }
-yy289:
+yy303:
        yych = *++YYCURSOR;
        switch (yych) {
-       case '>':       goto yy296;
+       case '>':       goto yy310;
        default:        goto yy2;
        }
-yy290:
+yy304:
        yych = *++YYCURSOR;
        switch (yych) {
-       case '-':       goto yy294;
+       case '-':       goto yy308;
        default:        goto yy2;
        }
-yy291:
+yy305:
        yych = *++YYCURSOR;
        switch (yych) {
-       case '+':       goto yy292;
+       case '+':       goto yy306;
        default:        goto yy2;
        }
-yy292:
+yy306:
        ++YYCURSOR;
        { return CRITIC_ADD_OPEN; }
-yy294:
+yy308:
        ++YYCURSOR;
        { return CRITIC_DEL_OPEN; }
-yy296:
+yy310:
        ++YYCURSOR;
        { return CRITIC_COM_OPEN; }
-yy298:
+yy312:
        ++YYCURSOR;
        { return CRITIC_SUB_OPEN; }
-yy300:
+yy314:
        ++YYCURSOR;
        { return CRITIC_HI_OPEN; }
-yy302:
+yy316:
        yych = *++YYCURSOR;
        switch (yych) {
-       case 'O':       goto yy303;
+       case 'O':       goto yy317;
        default:        goto yy2;
        }
-yy303:
+yy317:
        yych = *++YYCURSOR;
        switch (yych) {
-       case 'C':       goto yy304;
+       case 'C':       goto yy318;
        default:        goto yy2;
        }
-yy304:
+yy318:
        yych = *++YYCURSOR;
        switch (yych) {
-       case '}':       goto yy305;
+       case '}':       goto yy319;
        default:        goto yy2;
        }
-yy305:
+yy319:
        yych = *++YYCURSOR;
        switch (yych) {
-       case '}':       goto yy306;
+       case '}':       goto yy320;
        default:        goto yy2;
        }
-yy306:
+yy320:
        ++YYCURSOR;
        { return TOC; }
 }
index ff9292218014cf3a654a83a78d49aeac87f8fcb1..b7259556b10798ad9eaa5a5a61c4d2f48763f19c 100644 (file)
@@ -145,7 +145,11 @@ int scan(Scanner * s, const char * stop) {
                "..."                                                   { return ELLIPSIS; }
                ". . ."                                                 { return ELLIPSIS; }
                ":"                                                             { return COLON; }
+
                '&amp;'                                                 { return AMPERSAND_LONG; }
+               "&#" [Xx] [0-9a-fA-f]+ ';'              { return HTML_ENTITY; }
+               "&#" [0-9]+ ';'                                 { return HTML_ENTITY; }
+               "&" [A-Za-z0-9]+ ';'                    { return HTML_ENTITY; }
                "&"                                                             { return AMPERSAND; }
 
                "/"                                                             { return SLASH; }
index 27fd11d526cad37bd12bd7509c2f6a0d701df321..479c329d30c160271ac72e3cdf2ef34cff184762 100644 (file)
@@ -803,6 +803,10 @@ void mmd_export_token_odf(DString * out, const char * source, token * t, scratch
                case HASH6:
                        print_token(t);
                        break;
+               case HTML_ENTITY:
+                       print_const("&amp;");
+                       d_string_append_c_array(out, &(source[t->start + 1]), t->len - 1);
+                       break;
                case HTML_COMMENT_START:
                        if (!(scratch->extensions & EXT_SMART)) {
                                print_const("&lt;!--");
@@ -1585,6 +1589,10 @@ void mmd_export_token_odf_raw(DString * out, const char * source, token * t, scr
                        print_const("\\");
                        mmd_print_char_odf(out, source[t->start + 1]);
                        break;
+               case HTML_ENTITY:
+                       print_const("&amp;");
+                       d_string_append_c_array(out, &(source[t->start + 1]), t->len - 1);
+                       break;
                case INDENT_TAB:
                        print_const("<text:tab/>");
                        break;
index 52373bc124593b5cf665ef9b182ed91fb8d13296..be6699499b0e56a5915238d8853ce1d884d25257 100644 (file)
 <text:p text:style-name="Preformatted Text">&amp; and &amp;amp; and &lt; and &gt; in code block.<text:line-break/></text:p>
 
 <text:p text:style-name="Standard">10</text:p>
+
+<text:p text:style-name="Standard">&amp;copy; <text:span text:style-name="Source_20_Text">&amp;copy;</text:span></text:p>
+
+<text:p text:style-name="Standard">&amp;#169; <text:span text:style-name="Source_20_Text">&amp;#169;</text:span></text:p>
+
+<text:p text:style-name="Standard">&amp;#xA9; <text:span text:style-name="Source_20_Text">&amp;#xA9;</text:span></text:p>
 </office:text>
 </office:body>
 </office:document>
index c540daed14e46521961530df0bb86e5aecaf430b..10887c8d8923c9f15ce77f0fdeb08026cfbc42c3 100644 (file)
 
 <p>10</p>
 
+<p>&copy; <code>&amp;copy;</code></p>
+
+<p>&#169; <code>&amp;#169;</code></p>
+
+<p>&#xA9; <code>&amp;#xA9;</code></p>
+
 </body>
 </html>
 
index bc338aeabfbf32885c6e3437955c13a314017adb..159c49fb6ee91c5e1188d7ed96550c693b6718d1 100644 (file)
@@ -25,3 +25,9 @@ latex config: article</p>
 </code></pre>
 
 <p>10</p>
+
+<p>&copy; <code>&amp;copy;</code></p>
+
+<p>&#169; <code>&amp;#169;</code></p>
+
+<p>&#xA9; <code>&amp;#xA9;</code></p>
index 95d6206bcba7a5b5597dc23d5e4551d418bdb794..ffe693341eccc6a4bdc58acc60427c5c285bd4a2 100644 (file)
@@ -28,5 +28,11 @@ Here is an inline \href{/script?foo=1&bar=2}{link}\footnote{\href{/script?foo=1&
 
 10
 
+\&copy; \texttt{\&copy;}
+
+\&\#169; \texttt{\&\#169;}
+
+\&\#xA9; \texttt{\&\#xA9;}
+
 \input{mmd6-article-footer}
 \end{document}
index f63b3c3e944c21727818c60a7cb5e44056ec0e72..c3771283844a500b42df1cd33a6d92fd2486946e 100644 (file)
@@ -27,3 +27,9 @@ Here is an inline [link](</script?foo=1&bar=2>).
 
 [1]: http://example.com/?foo=1&bar=2
 [2]: http://att.com/  "AT&T"
+
+&copy; `&copy;`
+&#169; `&#169;`
+&#xA9; `&#xA9;`