[BACK] Return to HTMLPDTD.c CVS log [TXT] [DIR] Up to [Public] / libwww / Library / src

Annotation of libwww/Library/src/HTMLPDTD.c, revision 2.2

2.1 timbl 1: /*       Our Static DTD for HTML
 2: **       -----------------------
 3: **
 4: **   6 Nov 93    MD   Increased size of img_attr array to make space
 5: **               for terminator.
 6: */
 7: 
 8: /* Implements:
 9: */
 10: 
 11: #include "HTMLPDTD.h"
 12: 
 13: /*   Entity Names
 14: **   ------------
 15: **
 16: **   This table must be matched exactly with ALL the translation tables
 17: */
 18: static CONST char* entities[] = {
 19:  "AElig",   /* capital AE diphthong (ligature) */ 
 20:  "Aacute",  /* capital A, acute accent */ 
 21:  "Acirc",   /* capital A, circumflex accent */ 
 22:  "Agrave",  /* capital A, grave accent */ 
 23:  "Aring",   /* capital A, ring */ 
 24:  "Atilde",  /* capital A, tilde */ 
 25:  "Auml",   /* capital A, dieresis or umlaut mark */ 
 26:  "Ccedil",  /* capital C, cedilla */ 
 27:  "ETH",    /* capital Eth, Icelandic */ 
 28:  "Eacute",  /* capital E, acute accent */ 
 29:  "Ecirc",   /* capital E, circumflex accent */ 
 30:  "Egrave",  /* capital E, grave accent */ 
 31:  "Euml",   /* capital E, dieresis or umlaut mark */ 
 32:  "Iacute",  /* capital I, acute accent */ 
 33:  "Icirc",   /* capital I, circumflex accent */ 
 34:  "Igrave",  /* capital I, grave accent */ 
 35:  "Iuml",   /* capital I, dieresis or umlaut mark */ 
 36:  "Ntilde",  /* capital N, tilde */ 
 37:  "Oacute",  /* capital O, acute accent */ 
 38:  "Ocirc",   /* capital O, circumflex accent */ 
 39:  "Ograve",  /* capital O, grave accent */ 
 40:  "Oslash",  /* capital O, slash */ 
 41:  "Otilde",  /* capital O, tilde */ 
 42:  "Ouml",   /* capital O, dieresis or umlaut mark */ 
 43:  "THORN",   /* capital THORN, Icelandic */ 
 44:  "Uacute",  /* capital U, acute accent */ 
 45:  "Ucirc",   /* capital U, circumflex accent */ 
 46:  "Ugrave",  /* capital U, grave accent */ 
 47:  "Uuml",   /* capital U, dieresis or umlaut mark */ 
 48:  "Yacute",  /* capital Y, acute accent */ 
 49:  "aacute",  /* small a, acute accent */ 
 50:  "acirc",   /* small a, circumflex accent */ 
 51:  "aelig",   /* small ae diphthong (ligature) */ 
 52:  "agrave",  /* small a, grave accent */ 
 53:  "amp",    /* ampersand */ 
 54:  "aring",   /* small a, ring */ 
 55:  "atilde",  /* small a, tilde */ 
 56:  "auml",   /* small a, dieresis or umlaut mark */ 
 57:  "ccedil",  /* small c, cedilla */ 
 58:  "eacute",  /* small e, acute accent */ 
 59:  "ecirc",   /* small e, circumflex accent */ 
 60:  "egrave",  /* small e, grave accent */ 
 61:  "eth",    /* small eth, Icelandic */ 
 62:  "euml",   /* small e, dieresis or umlaut mark */ 
 63:  "gt",        /* greater than */ 
 64:  "iacute",  /* small i, acute accent */ 
 65:  "icirc",   /* small i, circumflex accent */ 
 66:  "igrave",  /* small i, grave accent */ 
 67:  "iuml",   /* small i, dieresis or umlaut mark */ 
 68:  "lt",        /* less than */ 
 69:  "ntilde",  /* small n, tilde */ 
 70:  "oacute",  /* small o, acute accent */ 
 71:  "ocirc",   /* small o, circumflex accent */ 
 72:  "ograve",  /* small o, grave accent */ 
 73:  "oslash",  /* small o, slash */ 
 74:  "otilde",  /* small o, tilde */ 
 75:  "ouml",   /* small o, dieresis or umlaut mark */ 
 76:  "szlig",   /* small sharp s, German (sz ligature) */ 
 77:  "thorn",   /* small thorn, Icelandic */ 
 78:  "uacute",  /* small u, acute accent */ 
 79:  "ucirc",   /* small u, circumflex accent */ 
 80:  "ugrave",  /* small u, grave accent */ 
 81:  "uuml",   /* small u, dieresis or umlaut mark */ 
 82:  "yacute",  /* small y, acute accent */ 
 83:  "yuml",   /* small y, dieresis or umlaut mark */ 
 84: };
 85: 
 86: #define HTML_ENTITIES 65
 87: 
 88: 
 89: /*       Attribute Lists
 90: **       ---------------
 91: **
 92: **   Lists must be in alphatbetical order by attribute name
 93: **   The tag elements contain the number of attributes
 94: */
 95: static attr no_attr[1] = 
 96:    {{ 0 }};
 97: 
 98: static attr a_attr[HTML_A_ATTRIBUTES+1] = {      /* Anchor attributes */
 99:    { "EFFECT" },
 100:    { "HREF"},
 101:    { "ID" },
 102:    { "METHODS" },
 103:    { "NAME" },           /* Should be ID */
 104:    { "PRINT" },
 105:    { "REL" },           /* Relationship */
 106:    { "REV" },           /* Reverse relationship */
 107:    { "SHAPE" },
 108:    { "TITLE" },
 109:    { 0 }  /* Terminate list */
 110: };   
 111: 
 112: static attr base_attr[] = {      /* BASE attributes */
 113:    { "HREF"},
 114:    { 0 }  /* Terminate list */
 115: };   
 116: 
 117: 
 118: static attr changed_attr[] = {
 119:    { "ID" },
 120:    { "IDREF" },
 121:    { 0 }  /* terminate list */
 122: };
 123: 
 124: static attr fig_attr[] = {       /* Figures */
 125:    { "ALIGN" },
 126:    { "ID" },
 127:    { "INDEX" },
 128:    { "ISMAP" },              /* @@@ NO! */
 129:    { "LANG" },
 130:    { "SRC" },
 131:    { 0 }  /* terminate list */
 132: };
 133: 
 134: static attr form_attr[] = {      /* General, for many things */
 135:    { "ACTION" },
 136:    { "ID" },
 137:    { "INDEX" },
 138:    { "LANG" },
 139:    { "METHOD" },
 140:    { 0 }  /* terminate list */
 141: };
 142: 
 143: static attr gen_attr[] = {       /* General, for many things */
 144:    { "ID" },
 145:    { "INDEX" },
 146:    { "LANG" },
 147:    { 0 }  /* terminate list */
 148: };
 149: 
 150: static attr htmlplus_attr[] = {        /* wrapper HTMLPLUS */
 151:    { "FORMS" },
 152:    { "VERSION" },
 153:    { 0 }              /* terminate list */
 154: };
 155: 
 156: static attr id_attr[2] = {
 157:    { "ID" },
 158:    { 0 }              /* terminate list */
 159: };
 160: 
 161: static attr image_attr[HTML_IMAGE_ATTRIBUTES+1] = {  /* Image attributes */
 162:    { "ALIGN" },
 163:    { "ISMAP"},           /* Use HTTP SpaceJump instead */
 164:    { "LANG" },
 165:    { "SEETHRU"},
 166:    { "SRC"},
 167:    { 0 }  /* Terminate list */
 168: };   
 169: 
 170: static attr img_attr[HTML_IMG_ATTRIBUTES+1] = {    /* IMG attributes */
 171:    { "ALIGN" },
 172:    { "ALT" },
 173:    { "ISMAP"},           /* Use HTTP SpaceJump instead */
 174:    { "SEETHRU"},
 175:    { "SRC"},
 176:    { 0 }  /* Terminate list */
 177: };   
 178: 
 179: static attr input_attr[HTML_INPUT_ATTRIBUTES+1] = {
 180:    { "ALIGN" },
 181:    { "CHECKED" },
 182:    { "DISABLED" },
 183:    { "ERROR" },
 184:    { "MAX" },
 185:    { "MIN" },
 186:    { "NAME" }, 
 187:    { "SIZE" },
 188:    { "SRC" },
 189:    { "TYPE" },
 190:    { "VALUE" },
2.2 ! timbl 191:    { "0" }
2.1 timbl 192: };
 193: 
 194: static attr l_attr[] = {
 195:    { "ALIGN"},
 196:    { "ID" },
 197:    { "LANG" },
 198:    { "INDEX" },
 199:    { 0 }  /* Terminate list */
 200: };
 201: 
 202: static attr li_attr[] = {
 203:    { "ID" },
 204:    { "LANG" },
 205:    { "INDEX" },
 206:    { "SRC"},
 207:    { 0 }  /* Terminate list */
 208: };
 209: 
 210: static attr link_attr[HTML_LINK_ATTRIBUTES+1] = {   /* link attributes */
 211:    { "HREF"},
 212:    { "IDREF" },
 213:    { "METHODS" },
 214:    { "REL" },           /* Relationship */
 215:    { "REV" },           /* Reverse relationship */
 216:    { 0 }  /* Terminate list */
 217: };   
 218: 
 219: static attr list_attr[] = {
 220:    { "COMPACT"},
 221:    { "ID" },
 222:    { "LANG" },
 223:    { "INDEX" },
 224:    { 0 }  /* Terminate list */
 225: };
 226: 
 227: static attr glossary_attr[] = {
 228:    { "COMPACT" },
 229:    { 0 }  /* Terminate list */
 230: };
 231: 
 232: static attr nextid_attr[HTML_NEXTID_ATTRIBUTES+1] = {
 233:    { "N" },
 234:    { 0 }  /* Terminate list */
 235: };
 236: 
 237: static attr note_attr[HTML_NOTE_ATTRIBUTES+1] = {   /* Footnotes etc etc */
 238:    { "ID" },
 239:    { "INDEX" },
 240:    { "LANG" },
 241:    { "ROLE" },
 242:    { 0 }  /* terminate list */
 243: };
 244: 
 245: static attr option_attr[HTML_OPTION_ATTRIBUTES+1] = {
 246:    { "DISABLED" },
 247:    { "LANG" },
 248:    { "SELECTED" },
 249:    { 0 }
 250: };
 251: 
 252: #ifdef OLD_CODE
 253: static attr pre_attr[HTML_PRE_ATTRIBUTES+1] = {
 254:    { "WIDTH" },
 255:    { 0 }  /* Terminate list */
 256: };
 257: #endif
 258: 
 259: static attr render_attr[HTML_RENDER_ATTRIBUTES+1] = {
 260:    { "STYLE" },
 261:    { "TAG" },
 262:    { 0 }  /* Terminate list */
 263: };
 264: 
 265: static attr select_attr[HTML_SELECT_ATTRIBUTES+1] = {
 266:    { "ERROR" },
 267:    { "LANG" },
 268:    { "NAME" },
 269:    { "SEVERAL" },
 270:    { 0 },
 271: };
 272: 
 273: static attr tab_attr[HTML_TAB_ATTRIBUTES+1] = {
 274:    { "ALIGN" },
 275:    { "AT" },
 276:    { 0 }
 277: };
 278: 
 279: static attr table_attr[HTML_TABLE_ATTRIBUTES+1] = {
 280:    { "BORDER" },
 281:    { "ID" },
 282:    { "INDEX" },
 283:    { "LANG" },
 284:    { 0 }
 285: };
 286: 
 287: static attr td_attr[HTML_TD_ATTRIBUTES+1] = {
 288:    { "ALIGN" },
 289:    { "COLSPAN" },
 290:    { "ROWSPAN" },
 291:    { "TAG" },
 292:    { 0 }
 293: };
 294: 
 295: static attr textarea_attr[HTML_TEXTAREA_ATTRIBUTES+1] = {
 296:    { "COLS" },
 297:    { "DISABLED" },
 298:    { "ERROR" },
 299:    { "LANG" },
 300:    { "NAME" },
 301:    { "ROWS" },
 302:    { 0 }
 303: };
 304: 
 305: static attr ul_attr[HTML_UL_ATTRIBUTES+1] = {
 306:    { "COMPACT" },
 307:    { "ID" },
 308:    { "INDEX" },
 309:    { "LANG" },
 310:    { "PLAIN" },
 311:    { "WRAP" },
 312:    { 0 }
 313: };
 314: 
 315: 
 316: /*   Elements
 317: **   --------
 318: **
 319: **   Must match definitions in HTMLPDTD.html!
 320: **   Must be in alphabetical order.
 321: **
 322: **   HTML is included to allow HTML documents to be parsed as a subset.
 323: **
 324: **  Name,  Attributes,       content
 325: */
 326: static HTTag tags[HTMLP_ELEMENTS] = {
 327:   { "A"   , a_attr,    HTML_A_ATTRIBUTES,   SGML_MIXED },
 328:   { "ABBREV" , gen_attr,   HTML_GEN_ATTRIBUTES,  SGML_MIXED },
 329:   { "ABSTRACT" , gen_attr,  HTML_GEN_ATTRIBUTES,  SGML_MIXED },
 330:   { "ACRONYM"    , gen_attr,   HTML_GEN_ATTRIBUTES,  SGML_MIXED },
 331:   { "ADDED" , gen_attr,   HTML_GEN_ATTRIBUTES,  SGML_MIXED },
 332:   { "ADDRESS"    , no_attr,   0,           SGML_MIXED },
 333:   { "ARG"  , gen_attr,   HTML_GEN_ATTRIBUTES,  SGML_MIXED },
 334:   { "B"   , no_attr,   0,           SGML_MIXED },
 335:   { "BASE"  , base_attr,  HTML_BASE_ATTRIBUTES,  SGML_MIXED },
 336:   { "BLOCKQUOTE", no_attr,  0,           SGML_MIXED },
 337:   { "BODY"  , no_attr,   0,           SGML_MIXED },
 338:   { "BOX"  , no_attr,   0,           SGML_MIXED },
 339:   { "BR"   , gen_attr,   HTML_GEN_ATTRIBUTES,  SGML_EMPTY },
 340:   { "BYLINE" , gen_attr,   HTML_GEN_ATTRIBUTES,  SGML_MIXED },
 341:   { "CAPTION"    , gen_attr,   HTML_GEN_ATTRIBUTES,  SGML_MIXED },
 342:   { "CHANGED"    , changed_attr, HTML_CHANGED_ATTRIBUTES, SGML_MIXED },
 343:   { "CITE"  , gen_attr,   HTML_GEN_ATTRIBUTES,  SGML_MIXED },
 344:   { "CMD"  , gen_attr,   HTML_GEN_ATTRIBUTES,  SGML_MIXED },
 345:   { "CODE"  , gen_attr,   HTML_GEN_ATTRIBUTES,  SGML_MIXED },
 346:   { "COMMENT"    , no_attr,   0,           SGML_MIXED },
 347:   { "DD"   , gen_attr,   HTML_GEN_ATTRIBUTES,  SGML_EMPTY },
 348:   { "DFN"  , gen_attr,   HTML_GEN_ATTRIBUTES,  SGML_MIXED },
 349:   { "DIR"  , gen_attr,   HTML_GEN_ATTRIBUTES,  SGML_MIXED },
 350:   { "DL"   , glossary_attr,HTML_DL_ATTRIBUTES,   SGML_MIXED },
 351:   { "DT"   , gen_attr,   HTML_GEN_ATTRIBUTES,  SGML_EMPTY },
 352:   { "EM"   , gen_attr,   HTML_GEN_ATTRIBUTES,  SGML_MIXED },
 353:   { "FIG"  , fig_attr,   HTML_FIG_ATTRIBUTES,  SGML_MIXED },
 354:   { "FOOTNOTE" , gen_attr,  HTML_GEN_ATTRIBUTES,  SGML_MIXED },
 355:   { "FORM"  , form_attr,  HTML_FORM_ATTRIBUTES,  SGML_MIXED },
 356:   { "H1"   , gen_attr,   HTML_GEN_ATTRIBUTES,  SGML_MIXED },
 357:   { "H2"   , gen_attr,   HTML_GEN_ATTRIBUTES,  SGML_MIXED },
 358:   { "H3"   , gen_attr,   HTML_GEN_ATTRIBUTES,  SGML_MIXED },
 359:   { "H4"   , gen_attr,   HTML_GEN_ATTRIBUTES,  SGML_MIXED },
 360:   { "H5"   , gen_attr,   HTML_GEN_ATTRIBUTES,  SGML_MIXED },
 361:   { "H6"   , gen_attr,   HTML_GEN_ATTRIBUTES,  SGML_MIXED },
 362:   { "H7"   , gen_attr,   HTML_GEN_ATTRIBUTES,  SGML_MIXED },
 363:   { "HEAD"  , no_attr,   0,           SGML_MIXED },
 364:   { "HR"   , gen_attr,   HTML_GEN_ATTRIBUTES,  SGML_EMPTY },
 365:   { "HTML"  , no_attr,   0,           SGML_MIXED }, /* */
2.2 ! timbl 366:   { "HTMLPLUS", htmlplus_attr,HTML_HTMLPLUS_ATTRIBUTES, SGML_MIXED },
2.1 timbl 367:   { "I"   , gen_attr,   HTML_GEN_ATTRIBUTES,  SGML_MIXED },
 368:   { "IMAGE" , image_attr,  HTML_IMAGE_ATTRIBUTES, SGML_EMPTY },
 369:   { "IMG"   , img_attr,  HTML_IMG_ATTRIBUTES,  SGML_EMPTY },
 370:   { "INPUT" , input_attr,  HTML_INPUT_ATTRIBUTES, SGML_EMPTY },
 371:   { "ISINDEX" , no_attr,   0,           SGML_EMPTY },
 372:   { "KBD"  , gen_attr,   HTML_GEN_ATTRIBUTES,  SGML_MIXED },
 373:   { "L"   , l_attr,    HTML_L_ATTRIBUTES,   SGML_MIXED },
 374:   { "LI"   , li_attr,   HTML_LI_ATTRIBUTES,   SGML_EMPTY },
 375:   { "LINK"  , link_attr,  HTML_LINK_ATTRIBUTES,  SGML_EMPTY },
 376:   { "LISTING"    , no_attr,   0,           SGML_LITERAL },
 377:   { "LIT"  , gen_attr,   HTML_GEN_ATTRIBUTES,  SGML_MIXED },
 378:   { "MARGIN" , gen_attr,   HTML_GEN_ATTRIBUTES,  SGML_MIXED },
 379:   { "MATH"  , id_attr,   HTML_ID_ATTRIBUTE,   SGML_MIXED },
 380:   { "MENU"  , gen_attr,   HTML_GEN_ATTRIBUTES,  SGML_MIXED },
 381:   { "NEXTID" , nextid_attr, 1,           SGML_EMPTY },
 382:   { "NOTE"  , note_attr,  HTML_NOTE_ATTRIBUTES,  SGML_EMPTY },
 383:   { "OL"   , list_attr,  HTML_LIST_ATTRIBUTES,  SGML_MIXED },
 384:   { "OPTION" , option_attr, HTML_OPTION_ATTRIBUTES, SGML_MIXED },
 385:   { "OVER"  , no_attr,   0,           SGML_MIXED },
 386:   { "P"   , l_attr,    HTML_L_ATTRIBUTES,   SGML_EMPTY },
 387:   { "PERSON" , gen_attr,   HTML_GEN_ATTRIBUTES,  SGML_MIXED },
 388:   { "PLAINTEXT", no_attr,  0,           SGML_LITERAL },
 389:   { "PRE"  , gen_attr,   HTML_GEN_ATTRIBUTES,  SGML_MIXED },
 390:   { "Q"   , gen_attr,   HTML_GEN_ATTRIBUTES,  SGML_MIXED },
 391:   { "QUOTE" , gen_attr,   HTML_GEN_ATTRIBUTES,  SGML_MIXED },
 392:   { "RENDER" , render_attr, HTML_RENDER_ATTRIBUTES, SGML_MIXED },
 393:   { "REMOVED"    , gen_attr,   HTML_GEN_ATTRIBUTES,  SGML_MIXED },
 394:   { "S"   , gen_attr,   HTML_GEN_ATTRIBUTES,  SGML_MIXED },
 395:   { "SAMP"  , gen_attr,   HTML_GEN_ATTRIBUTES,  SGML_MIXED },
 396:   { "SELECT" , select_attr, HTML_SELECT_ATTRIBUTES, SGML_MIXED },
 397:   { "STRONG" , gen_attr,   HTML_GEN_ATTRIBUTES,  SGML_MIXED },
 398:   { "SUB"  , gen_attr,   HTML_GEN_ATTRIBUTES,  SGML_MIXED },
 399:   { "SUP"  , gen_attr,   HTML_GEN_ATTRIBUTES,  SGML_MIXED },
 400:   { "TAB"  , tab_attr,   HTML_TAB_ATTRIBUTES,  SGML_EMPTY },
 401:   { "TABLE" , table_attr,  HTML_TABLE_ATTRIBUTES, SGML_MIXED },
 402:   { "TD"   , td_attr,   HTML_TABLE_ATTRIBUTES, SGML_MIXED },
 403:   { "TEXTAREA", textarea_attr,HTML_TEXTAREA_ATTRIBUTES,SGML_MIXED},
 404:   { "TH"   , td_attr,   HTML_TD_ATTRIBUTES,   SGML_MIXED },
 405:   { "TITLE" , gen_attr,   HTML_GEN_ATTRIBUTES,  SGML_CDATA },
 406:   { "TR"   , id_attr,   HTML_ID_ATTRIBUTE,   SGML_MIXED },
 407:   { "TT"   , gen_attr,   HTML_GEN_ATTRIBUTES,  SGML_MIXED },
 408:   { "U"   , gen_attr,   HTML_GEN_ATTRIBUTES,  SGML_MIXED },
 409:   { "UL"   , ul_attr,   HTML_UL_ATTRIBUTES,   SGML_MIXED },
 410:   { "VAR"  , gen_attr,   HTML_GEN_ATTRIBUTES,  SGML_MIXED },
 411:   { "XMP"  , no_attr,   0,           SGML_LITERAL }
 412: };
 413: 
 414: 
 415: #ifdef OLD_CODE
 416: PUBLIC CONST SGML_dtd HTML_dtd = {
 417:    tags,
 418:    HTML_ELEMENTS,
 419:    entities,
 420:    sizeof(entities)/sizeof(char**)
 421: };
 422: #endif
 423: 
 424: PUBLIC CONST SGML_dtd HTMLP_dtd = {
 425:    tags,
 426:    HTMLP_ELEMENTS,
 427:    entities,
 428:    sizeof(entities)/sizeof(char**)
 429: };
 430: 
 431: /*   Utility Routine: useful for people building HTML objects */
 432: 
 433: /*   Start anchor element
 434: **   --------------------
 435: **
 436: **   It is kinda convenient to have a particulr routine for
 437: **   starting an anchor element, as everything else for HTML is
 438: **   simple anyway.
 439: */
 440: struct _HTStructured {
 441:   HTStructuredClass * isa;
 442:    /* ... */
 443: };
 444: 
 445: PUBLIC void HTStartAnchor ARGS3(HTStructured *, obj,
 446:        CONST char *, name,
 447:        CONST char *, href)
 448: {
 449:   BOOL        present[HTML_A_ATTRIBUTES];
 450:   CONST char*        value[HTML_A_ATTRIBUTES];
 451:   
 452:   {
 453:    int i;
 454:    for(i=0; i<HTML_A_ATTRIBUTES; i++)
 455:      present[i] = NO;
 456:   }
 457:   if (name) {
 458:    present[HTML_A_NAME] = YES;
 459:    value[HTML_A_NAME] = name;
 460:   }
 461:   if (href) {
 462:     present[HTML_A_HREF] = YES;
 463:     value[HTML_A_HREF] = href;
 464:   }
 465:   
 466:   (*obj->isa->start_element)(obj, HTML_A , present, value);
 467: 
 468: }
 469: 
 470: PUBLIC void HTNextID ARGS2(HTStructured *, obj,
 471:        int,  next_one)
 472: {
 473:   BOOL        present[HTML_NEXTID_ATTRIBUTES];
 474:   CONST char*        value[HTML_NEXTID_ATTRIBUTES];
 475:   char string[10];
 476:   
 477:   sprintf(string, "z%i", next_one);
 478:   {
 479:    int i;
 480:    for(i=0; i<HTML_NEXTID_ATTRIBUTES; i++)
 481:      present[i] = NO;
 482:   }
 483:   present[HTML_NEXTID_N] = YES;
 484:   value[HTML_NEXTID_N] = string;
 485:   
 486:   (*obj->isa->start_element)(obj, HTML_NEXTID , present, value);
 487: 
 488: }
 489: 

Webmaster

AltStyle によって変換されたページ (->オリジナル) /