📄 dtd.cpp
字号:
ID_HR, ID_TABLE, ID_FIELDSET, ID_ADDRESS, ID_TEXT, ID_TT, ID_I, ID_B, ID_U, ID_S, ID_STRIKE, ID_BIG, ID_SMALL, ID_EM, ID_STRONG, ID_DFN, ID_CODE, ID_SAMP, ID_KBD, ID_VAR, ID_CITE, ID_ABBR, ID_ACRONYM, ID_A, ID_IMG, ID_APPLET, ID_OBJECT, ID_EMBED, ID_FONT, ID_BASEFONT, ID_BR, ID_SCRIPT, ID_MAP, ID_Q, ID_SUB, ID_SUP, ID_SPAN, ID_BDO, ID_IFRAME, ID_INPUT, ID_SELECT, ID_TEXTAREA, ID_LABEL, ID_BUTTON, ID_COMMENT, ID_LI, ID_XMP, ID_MARQUEE, 0};static const ushort tag_list_6[] = { ID_DT, ID_DD, ID_COMMENT, 0};static const ushort tag_list_7[] = { ID_TEXT, ID_OPTGROUP, ID_OPTION, ID_COMMENT, ID_SCRIPT, 0};static const ushort tag_list_10[] = { ID_FRAMESET, ID_FRAME, ID_NOFRAMES, ID_COMMENT, 0};static const ushort tag_list_11[] = { ID_SCRIPT, ID_STYLE, ID_META, ID_LINK, ID_TITLE, ID_ISINDEX, ID_BASE, ID_COMMENT, 0};static bool check_array(ushort child, const ushort *tagList){ int i = 0; while(tagList[i] != 0) { if(tagList[i] == child) return true; i++; } return false;}bool DOM::checkChild(ushort tagID, ushort childID, bool strict){ //kdDebug( 6030 ) << "checkChild: " << tagID << "/" << childID << endl; // ### allow comments inside ANY node that can contain children if (tagID >= 1000 || childID >= 1000) return true; // one or both of the elements in an XML element; just allow for now switch(tagID) { case ID_TT: case ID_I: case ID_B: case ID_U: case ID_S: case ID_STRIKE: case ID_BIG: case ID_SMALL: case ID_EM: case ID_STRONG: case ID_DFN: case ID_CODE: case ID_SAMP: case ID_KBD: case ID_VAR: case ID_CITE: case ID_ABBR: case ID_ACRONYM: case ID_SUB: case ID_SUP: case ID_BDO: case ID_FONT: case ID_LEGEND: case ID_Q: case ID_A: case ID_NOBR: case ID_WBR: // _1 * return check_array(childID, tag_list_1) || check_array(childID, tag_list_6); case ID_P: // P: ( _0 | TABLE ) * return check_array(childID, tag_list_0) || (!strict && childID == ID_TABLE); case ID_H1: case ID_H2: case ID_H3: case ID_H4: case ID_H5: case ID_H6: // _0 * return check_array(childID, tag_list_0) || (!strict && check_array(childID, tag_list_3) && (childID < ID_H1 || childID > ID_H6)); case ID_BASEFONT: case ID_BR: case ID_AREA: case ID_LINK: case ID_IMG: case ID_PARAM: case ID_HR: case ID_INPUT: case ID_COL: case ID_FRAME: case ID_ISINDEX: case ID_BASE: case ID_META: case ID_COMMENT: // BASEFONT: EMPTY return false; case ID_BODY: // BODY: _1 * + _2 return check_array(childID, tag_list_1) || check_array(childID, tag_list_2); case ID_ADDRESS: // ADDRESS: ( _0 | P ) * return check_array(childID, tag_list_0) || childID == ID_P; case ID_DT: if ( childID == ID_DL ) return false; case ID_LI: case ID_DIV: case ID_SPAN: case ID_ILAYER: case ID_LAYER: case ID_CENTER: case ID_BLOCKQUOTE: case ID_INS: case ID_DEL: case ID_DD: case ID_TH: case ID_TD: case ID_IFRAME: case ID_NOFRAMES: case ID_NOSCRIPT: case ID_CAPTION: case ID_MARQUEE: // DIV: _1 * return check_array(childID, tag_list_1); case ID_MAP: // We accept SCRIPT in client-side image maps as an extension to the DTD. // MAP: ( _3 + | AREA + | SCRIPT + ) return check_array(childID, tag_list_3) || childID == ID_AREA || childID == ID_SCRIPT; case ID_OBJECT: case ID_EMBED: case ID_APPLET: // OBJECT: _4 * return check_array(childID, tag_list_4); case ID_PRE: case ID_XMP: case ID_PLAINTEXT: // PRE: _0 * - _5 return check_array(childID, tag_list_1); case ID_DL: // DL: _6 + return check_array(childID, tag_list_6) || check_array(childID, tag_list_1); case ID_OL: case ID_UL: // OL: LI + return check_array(childID, tag_list_1); case ID_DIR: case ID_MENU: // (DIR|MENU): LI + - _3 if(childID == ID_LI) return true; return false; case ID_FORM: // FORM: _1 * - FORM return check_array(childID, tag_list_1); case ID_LABEL: // LABEL: _1 * - LABEL return check_array(childID, tag_list_1); // KEYGEN does not really allow any children // from outside, just need this to be able // to add the keylengths ourself // Yes, consider it a hack (Dirk) case ID_KEYGEN: case ID_SELECT: // SELECT: _7 + return check_array(childID, tag_list_7); case ID_OPTGROUP: // OPTGROUP: OPTION + if(childID == ID_OPTION) return true; return false; case ID_OPTION: case ID_TEXTAREA: case ID_TITLE: case ID_STYLE: case ID_SCRIPT: // OPTION: TEXT if(childID == ID_TEXT) return true; return false; case ID_FIELDSET: // FIELDSET: ( TEXT , LEGEND , _1 * ) if(childID == ID_TEXT) return true; if(childID == ID_LEGEND) return true; return check_array(childID, tag_list_1); case ID_BUTTON: // BUTTON: _1 * - _8 return check_array(childID, tag_list_1); case ID_TABLE: // TABLE: ( CAPTION ? , ( COL * | COLGROUP * ) , THEAD ? , TFOOT ? , TBODY + ) switch(childID) { case ID_CAPTION: case ID_COL: case ID_COLGROUP: case ID_THEAD: case ID_TFOOT: case ID_TBODY: case ID_FORM: case ID_SCRIPT: return true; default: return false; } case ID_THEAD: case ID_TFOOT: case ID_TBODY: // THEAD: TR + if(childID == ID_TR || childID == ID_SCRIPT) return true; return false; case ID_COLGROUP: // COLGROUP: COL * if(childID == ID_COL) return true; return false; case ID_TR: // TR: (TD, TH) return (childID == ID_TH || childID == ID_TD || childID == ID_SCRIPT); case ID_FRAMESET: // FRAMESET: _10 return check_array(childID, tag_list_10); case ID_HEAD: // HEAD: _11 return check_array(childID, tag_list_11); case ID_HTML: // HTML: ( HEAD , COMMENT, ( BODY | ( FRAMESET & NOFRAMES ? ) ) ) switch(childID) { case ID_HEAD: case ID_COMMENT: case ID_BODY: case ID_FRAMESET: case ID_NOFRAMES: case ID_SCRIPT: return true; default: return false; } default: kdDebug( 6030 ) << "unhandled tag in dtd.cpp:checkChild(): tagID=" << tagID << "!" << endl; return false; }}void DOM::addForbidden(int tagId, ushort *forbiddenTags){ switch(tagId) { case ID_A: // we allow nested anchors. The innermost one wil be taken... //forbiddenTags[ID_A]++; break; case ID_NOBR: forbiddenTags[ID_PRE]++; // fall through case ID_PRE: case ID_PLAINTEXT: case ID_XMP: //forbiddenTags[ID_IMG]++; forbiddenTags[ID_OBJECT]++; forbiddenTags[ID_EMBED]++; forbiddenTags[ID_APPLET]++; // why forbid them. We can deal with them in PRE //forbiddenTags[ID_BIG]++; //forbiddenTags[ID_SMALL]++; //forbiddenTags[ID_SUB]++; //forbiddenTags[ID_SUP]++; forbiddenTags[ID_BASEFONT]++; break; case ID_DIR: case ID_MENU: forbiddenTags[ID_P]++; forbiddenTags[ID_H1]++; forbiddenTags[ID_H2]++; forbiddenTags[ID_H3]++; forbiddenTags[ID_H4]++; forbiddenTags[ID_H5]++; forbiddenTags[ID_H6]++; forbiddenTags[ID_UL]++; forbiddenTags[ID_OL]++; forbiddenTags[ID_DIR]++; forbiddenTags[ID_MENU]++; forbiddenTags[ID_PRE]++; forbiddenTags[ID_PLAINTEXT]++; forbiddenTags[ID_XMP]++; forbiddenTags[ID_DL]++; forbiddenTags[ID_DIV]++; forbiddenTags[ID_CENTER]++; forbiddenTags[ID_NOSCRIPT]++; forbiddenTags[ID_NOFRAMES]++; forbiddenTags[ID_BLOCKQUOTE]++; forbiddenTags[ID_FORM]++; forbiddenTags[ID_ISINDEX]++; forbiddenTags[ID_HR]++; forbiddenTags[ID_TABLE]++; forbiddenTags[ID_FIELDSET]++; forbiddenTags[ID_ADDRESS]++; break; case ID_LABEL: forbiddenTags[ID_LABEL]++; break; case ID_BUTTON: forbiddenTags[ID_A]++; forbiddenTags[ID_INPUT]++; forbiddenTags[ID_SELECT]++; forbiddenTags[ID_TEXTAREA]++; forbiddenTags[ID_LABEL]++; forbiddenTags[ID_BUTTON]++; forbiddenTags[ID_FORM]++; forbiddenTags[ID_ISINDEX]++; forbiddenTags[ID_FIELDSET]++; forbiddenTags[ID_IFRAME]++; break; default: break; }}void DOM::removeForbidden(int tagId, ushort *forbiddenTags){ switch(tagId) { case ID_A: //forbiddenTags[ID_A]--; break; case ID_NOBR: forbiddenTags[ID_PRE]--; // fall through case ID_PRE: case ID_XMP: case ID_PLAINTEXT: //forbiddenTags[ID_IMG]--; forbiddenTags[ID_OBJECT]--; forbiddenTags[ID_EMBED]--; forbiddenTags[ID_APPLET]--; //forbiddenTags[ID_BIG]--; //forbiddenTags[ID_SMALL]--; //forbiddenTags[ID_SUB]--; //forbiddenTags[ID_SUP]--; forbiddenTags[ID_BASEFONT]--; break; case ID_DIR: case ID_MENU: forbiddenTags[ID_P]--; forbiddenTags[ID_H1]--; forbiddenTags[ID_H2]--; forbiddenTags[ID_H3]--; forbiddenTags[ID_H4]--; forbiddenTags[ID_H5]--; forbiddenTags[ID_H6]--; forbiddenTags[ID_UL]--; forbiddenTags[ID_OL]--; forbiddenTags[ID_DIR]--; forbiddenTags[ID_MENU]--; forbiddenTags[ID_PRE]--; forbiddenTags[ID_PLAINTEXT]--; forbiddenTags[ID_XMP]--; forbiddenTags[ID_DL]--; forbiddenTags[ID_DIV]--; forbiddenTags[ID_CENTER]--; forbiddenTags[ID_NOSCRIPT]--; forbiddenTags[ID_NOFRAMES]--; forbiddenTags[ID_BLOCKQUOTE]--; forbiddenTags[ID_FORM]--; forbiddenTags[ID_ISINDEX]--; forbiddenTags[ID_HR]--; forbiddenTags[ID_TABLE]--; forbiddenTags[ID_FIELDSET]--; forbiddenTags[ID_ADDRESS]--; break; case ID_LABEL: forbiddenTags[ID_LABEL]--; break; case ID_BUTTON: forbiddenTags[ID_A]--; forbiddenTags[ID_INPUT]--; forbiddenTags[ID_SELECT]--; forbiddenTags[ID_TEXTAREA]--; forbiddenTags[ID_LABEL]--; forbiddenTags[ID_BUTTON]--; forbiddenTags[ID_FORM]--; forbiddenTags[ID_ISINDEX]--; forbiddenTags[ID_FIELDSET]--; forbiddenTags[ID_IFRAME]--; break; default: break; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -