📄 pprint.c
字号:
if (indent + linelen < wraplen) wraphere = linelen; else PCondFlushLine(fout, indent); } AddC(delim, linelen++); if (value) { InString = no; while (*value != '\0') { c = (unsigned char)*value; if (wrappable && c == ' ' && indent + linelen < wraplen) { wraphere = linelen; wasinstring = InString; } if (wrappable && wraphere > 0 && indent + linelen >= wraplen) WrapAttrVal(fout, indent, wasinstring); if (c == (uint)delim) { char *entity; entity = (c == '"' ? """ : "'"); while (*entity != '\0') AddC(*entity++, linelen++); ++value; continue; } else if (c == '"') { if (QuoteMarks) { AddC('&', linelen++); AddC('q', linelen++); AddC('u', linelen++); AddC('o', linelen++); AddC('t', linelen++); AddC(';', linelen++); } else AddC('"', linelen++); if (delim == '\'') InString = (Bool)(!InString); ++value; continue; } else if (c == '\'') { if (QuoteMarks) { AddC('&', linelen++); AddC('#', linelen++); AddC('3', linelen++); AddC('9', linelen++); AddC(';', linelen++); } else AddC('\'', linelen++); if (delim == '"') InString = (Bool)(!InString); ++value; continue; } /* look for UTF-8 multibyte character */ if (c > 0x7F) value += GetUTF8((unsigned char *)value, &c); ++value; if (c == '\n') { PFlushLine(fout, indent); continue; } PPrintChar(c, mode); } } InString = no; AddC(delim, linelen++);}void PPrintAttribute(Out *fout, uint indent, Node *node, AttVal *attr){ char *name; Bool wrappable = no; if (IndentAttributes) { PFlushLine(fout, indent); indent += spaces; } name = attr->attribute; if (indent + linelen >= wraplen) WrapLine(fout, indent); if (!XmlTags && !XmlOut && attr->dict) { if (IsScript(name)) wrappable = WrapScriptlets; else if (!attr->dict->nowrap || WrapAttVals) wrappable = yes; } if (indent + linelen < wraplen) { wraphere = linelen; AddC(' ', linelen++); } else { PCondFlushLine(fout, indent); AddC(' ', linelen++); } while (*name != '\0') AddC(FoldCase(*name++, UpperCaseAttrs), linelen++); if (indent + linelen >= wraplen) WrapLine(fout, indent); if (attr->value == null) { if (XmlTags || XmlOut) PPrintAttrValue(fout, indent, attr->attribute, attr->delim, yes); else if (!IsBoolAttribute(attr) && !IsNewNode(node)) PPrintAttrValue(fout, indent, "", attr->delim, yes); else if (indent + linelen < wraplen) wraphere = linelen; } else PPrintAttrValue(fout, indent, attr->value, attr->delim, wrappable);}void PPrintAttrs(Out *fout, uint indent, Lexer *lexer, Node *node, AttVal *attr){ if (attr) { if (attr->next) PPrintAttrs(fout, indent, lexer, node, attr->next); if (attr->attribute != null) PPrintAttribute(fout, indent, node, attr); else if (attr->asp != null) { AddC(' ', linelen++); PPrintAsp(fout, indent, lexer, attr->asp); } else if (attr->php != null) { AddC(' ', linelen++); PPrintPhp(fout, indent, lexer, attr->php); } }}/* Line can be wrapped immediately after inline start tag provided if follows a text node ending in a space, or it parent is an inline element that that rule applies to. This behaviour was reverse engineered from Netscape 3.0*/Bool AfterSpace(Lexer *lexer, Node *node){ Node *prev; uint c; if (!node || !node->tag || !(node->tag->model & CM_INLINE)) return yes; prev = node->prev; if (prev) { if (prev->type == TextNode && prev->end > prev->start) { c = (unsigned char)lexer->lexbuf[prev->end - 1]; if (c == 160 || c == ' ' || c == '\n') return yes; } return no; } return AfterSpace(lexer, node->parent);}void PPrintTag(Lexer *lexer, Out *fout, uint mode, uint indent, Node *node){ char c, *p; AddC('<', linelen++); if (node->type == EndTag) AddC('/', linelen++); for (p = node->element; (c = *p); ++p) AddC(FoldCase(c, UpperCaseTags), linelen++); PPrintAttrs(fout, indent, lexer, node, node->attributes); if ((XmlOut == yes || lexer->isvoyager) && (node->type == StartEndTag || node->tag->model & CM_EMPTY )) { AddC(' ', linelen++); /* compatibility hack */ AddC('/', linelen++); } AddC('>', linelen++);; if (node->type != StartEndTag && !(mode & PREFORMATTED)) { if (indent + linelen >= wraplen) WrapLine(fout, indent); if (indent + linelen < wraplen) { /* avoid wrapping after inline start tag unless it or its parent follows a space and its not an empty tag (e.g. IMG) followed by </a> */ if (AfterSpace(lexer, node)) { if (!(mode & NOWRAP) && !((node->tag->model & CM_EMPTY) && node->next == null && node->parent->tag == tag_a)) { wraphere = linelen; } } } else PCondFlushLine(fout, indent); }}void PPrintEndTag(Out *fout, uint mode, uint indent, Node *node){ char c, *p; /* Netscape ignores SGML standard by not ignoring a line break before </A> or </U> etc. To avoid rendering this as an underlined space, I disable line wrapping before inline end tags by the #if 0 ... #endif */#if 0 if (indent + linelen < wraplen && !(mode & NOWRAP)) wraphere = linelen;#endif AddC('<', linelen++); AddC('/', linelen++); for (p = node->element; (c = *p); ++p) AddC(FoldCase(c, UpperCaseTags), linelen++); AddC('>', linelen++);}void PPrintComment(Out *fout, uint indent, Lexer *lexer, Node *node){ if (indent + linelen < wraplen) wraphere = linelen; AddC('<', linelen++); AddC('!', linelen++); AddC('-', linelen++); AddC('-', linelen++);#if 0 if (linelen < wraplen) wraphere = linelen;#endif PPrintText(fout, COMMENT, indent, lexer, node->start, node->end);#if 0 if (indent + linelen < wraplen) wraphere = linelen; AddC('-', linelen++); AddC('-', linelen++);#endif AddC('>', linelen++);}void PPrintDocType(Out *fout, uint indent, Lexer *lexer, Node *node){ Bool q = QuoteMarks; QuoteMarks = no; if (indent + linelen < wraplen) wraphere = linelen; PCondFlushLine(fout, indent); AddC('<', linelen++); AddC('!', linelen++); AddC('D', linelen++); AddC('O', linelen++); AddC('C', linelen++); AddC('T', linelen++); AddC('Y', linelen++); AddC('P', linelen++); AddC('E', linelen++); AddC(' ', linelen++); if (indent + linelen < wraplen) wraphere = linelen; PPrintText(fout, null, indent, lexer, node->start, node->end); if (linelen < wraplen) wraphere = linelen; AddC('>', linelen++); QuoteMarks = q; PCondFlushLine(fout, indent);}void PPrintPI(Out *fout, uint indent, Lexer *lexer, Node *node){ if (indent + linelen < wraplen) wraphere = linelen; AddC('<', linelen++); AddC('?', linelen++); /* set CDATA to pass < and > unescaped */ PPrintText(fout, CDATA, indent, lexer, node->start, node->end); if (lexer->lexbuf[node->end - 1] != '?') AddC('?', linelen++); AddC('>', linelen++); /* PCondFlushLine(fout, indent); */}/* note ASP and JSTE share <% ... %> syntax */void PPrintAsp(Out *fout, uint indent, Lexer *lexer, Node *node){ int savewraplen = wraplen; /* disable wrapping if so requested */ if (!WrapAsp || !WrapJste) wraplen = 0xFFFFFF; /* a very large number */#if 0 if (indent + linelen < wraplen) wraphere = linelen;#endif AddC('<', linelen++); AddC('%', linelen++); PPrintText(fout, (WrapAsp ? CDATA : COMMENT), indent, lexer, node->start, node->end); AddC('%', linelen++); AddC('>', linelen++); /* PCondFlushLine(fout, indent); */ wraplen = savewraplen;}/* JSTE also supports <# ... #> syntax */void PPrintJste(Out *fout, uint indent, Lexer *lexer, Node *node){ int savewraplen = wraplen; /* disable wrapping if so requested */ if (!WrapAsp) wraplen = 0xFFFFFF; /* a very large number */ AddC('<', linelen++); AddC('#', linelen++); PPrintText(fout, (WrapJste ? CDATA : COMMENT), indent, lexer, node->start, node->end); AddC('#', linelen++); AddC('>', linelen++); /* PCondFlushLine(fout, indent); */ wraplen = savewraplen;}/* PHP is based on XML processing instructions */void PPrintPhp(Out *fout, uint indent, Lexer *lexer, Node *node){ int savewraplen = wraplen; /* disable wrapping if so requested */ if (!WrapPhp) wraplen = 0xFFFFFF; /* a very large number */#if 0 if (indent + linelen < wraplen) wraphere = linelen;#endif AddC('<', linelen++); AddC('?', linelen++); PPrintText(fout, (WrapPhp ? CDATA : COMMENT), indent, lexer, node->start, node->end); AddC('?', linelen++); AddC('>', linelen++); /* PCondFlushLine(fout, indent); */ wraplen = savewraplen;}void PPrintCDATA(Out *fout, uint indent, Lexer *lexer, Node *node){ int savewraplen = wraplen; PCondFlushLine(fout, indent); /* disable wrapping */ wraplen = 0xFFFFFF; /* a very large number */ AddC('<', linelen++); AddC('!', linelen++); AddC('[', linelen++); AddC('C', linelen++); AddC('D', linelen++); AddC('A', linelen++); AddC('T', linelen++); AddC('A', linelen++); AddC('[', linelen++); PPrintText(fout, COMMENT, indent, lexer, node->start, node->end); AddC(']', linelen++); AddC(']', linelen++); AddC('>', linelen++); PCondFlushLine(fout, indent); wraplen = savewraplen;}void PPrintSection(Out *fout, uint indent, Lexer *lexer, Node *node){ int savewraplen = wraplen; /* disable wrapping if so requested */ if (!WrapSection) wraplen = 0xFFFFFF; /* a very large number */#if 0 if (indent + linelen < wraplen) wraphere = linelen;#endif AddC('<', linelen++); AddC('!', linelen++); AddC('[', linelen++); PPrintText(fout, (WrapSection ? CDATA : COMMENT), indent, lexer, node->start, node->end); AddC(']', linelen++); AddC('>', linelen++); /* PCondFlushLine(fout, indent); */ wraplen = savewraplen;}Bool ShouldIndent(Node *node){ if (IndentContent == no) return no; if (SmartIndent) { if (node->content && (node->tag->model & CM_NO_INDENT)) { for (node = node->content; node; node = node->next) if (node->tag && node->tag->model & CM_BLOCK) return yes; return no; } if (node->tag->model & CM_HEADING) return no; if (node->tag == tag_p) return no; if (node->tag == tag_title) return no; } if (node->tag->model & (CM_FIELD | CM_OBJECT)) return yes; if (node->tag == tag_map) return yes; return (Bool)(!(node->tag->model & CM_INLINE));}void PPrintTree(Out *fout, uint mode, uint indent, Lexer *lexer, Node *node){ Node *content, *last; if (node == null) return; if (node->type == TextNode) PPrintText(fout, mode, indent, lexer, node->start, node->end); else if (node->type == CommentTag) { PPrintComment(fout, indent, lexer, node); } else if (node->type == RootNode) { for (content = node->content; content != null; content = content->next) PPrintTree(fout, mode, indent, lexer, content); } else if (node->type == DocTypeTag) PPrintDocType(fout, indent, lexer, node); else if (node->type == ProcInsTag) PPrintPI(fout, indent, lexer, node); else if (node->type == CDATATag) PPrintCDATA(fout, indent, lexer, node); else if (node->type == SectionTag) PPrintSection(fout, indent, lexer, node); else if (node->type == AspTag)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -