[解決済み] シンプルHTMLプリティプリント
質問
<ブロッククオートhttp://jsfiddle.net/JamesKyle/L4b8b/
無駄な努力かもしれませんが、個人的には可能だと思っています。
私はJavascriptやjQueryが得意ではありませんが、htmlに簡単なprettyprintを作成する方法を見つけたと思います。
このprettyprintには、4種類のコードがあります。
- プレーンなテキスト
- 要素
- 属性
- 値
これをスタイリッシュにするために、私は
elements
,
attibutes
と
values
を、独自のクラスを持つスパンで表現しています。
私が持っている最初の方法は、あらゆる種類の要素と属性を保存し(下図)、それらを対応するスパンでラッピングすることです。
$(document).ready(function() {
$('pre.prettyprint.html').each(function() {
$(this).css('white-space','pre-line');
var code = $(this).html();
var html-element = $(code).find('a, abbr, acronym, address, area, article, aside, audio, b, base, bdo, bdi, big, blockquote, body, br, button, canvas, caption, cite, code, col, colgroup, command, datalist, dd, del, details, dfn, div, dl, dt, em, embed, fieldset, figcaption, figure, footer, form, h1, h2, h3, h4, h5, h6, head, header, hgroup, hr, html, i, img, input, ins, kbd, keygen, label, legend, li, link, map, mark, meta, meter, nav, noscript, object, ol, optgroup, option, output, p, param, pre, progress, q, rp, rt, ruby, samp, script, section, select, small, source, span, strong, summary, style, sub, sup, table, tbody, td, textarea, tfoot, th, thead, title, time, tr, track, tt, ul, var, video, wbr');
var html-attribute = $(code).find('abbr, accept-charset, accept, accesskey, actionm, align, alink, alt, archive, axis, background, bgcolor, border, cellpadding, cellspacing, char, charoff, charset, checked, cite, class, classid, clear, code, codebase, codetype, color, cols, colspan, compact, content, coords, data, datetime, declare, defer, dir, disabled, enctype, face, for, frame, frameborder, headers, height, href, hreflang, hspace, http-equiv, id, ismap, label, lang, language, link, longdesc, marginheight, marginwidth, maxlength, media, method, multiple, name, nohref, noresize, noshade, nowrap, object, onblur, onchange,onclick ondblclick onfocus onkeydown, onkeypress, onkeyup, onload, onmousedown, onmousemove, onmouseout, onmouseover, onmouseup, onreset, onselect, onsubmit, onunload, profile, prompt, readonly, rel, rev, rows, rowspan, rules, scheme, scope, scrolling, selected, shape, size, span, src, standby, start, style, summary, tabindex, target, text, title, type, usemap, valign, value, valuetype, version, vlink, vspace, width');
var html-value = $(code).find(/* Any instance of text inbetween two parenthesis */);
$(element).wrap('<span class="element" />');
$(attribute).wrap('<span class="attribute" />');
$(value).wrap('<span class="value" />');
$(code).find('<').replaceWith('<');
$(code).find('>').replaceWith('>');
});
});
二つ目の方法として考えたのは、検出
elements
を2つの< >で囲まれた任意の量のテキストとして検出し、次に
attributes
の中のテキストとして
element
は、2つのスペースで囲まれているか、または
=
のすぐ後にある。
$(document).ready(function() {
$('pre.prettyprint.html').each(function() {
$(this).css('white-space','pre-line');
var code = $(this).html();
var html-element = $(code).find(/* Any instance of text inbeween two < > */);
var html-attribute = $(code).find(/* Any instance of text inside an element that has a = immeadiatly afterwards or has spaces on either side */);
var html-value = $(code).find(/* Any instance of text inbetween two parenthesis */);
$(element).wrap('<span class="element" />');
$(attribute).wrap('<span class="attribute" />');
$(value).wrap('<span class="value" />');
$(code).find('<').replaceWith('<');
$(code).find('>').replaceWith('>');
});
});
可能であれば、これらのどちらかをどのようにコード化しますか?
ここでもjsfiddleとして見ることができます。 http://jsfiddle.net/JamesKyle/L4b8b/
解決方法は?
わずかな行数でHTMLをきれいに印刷するためのすべてを手に入れたと思い込まないでください。 私はこのトピックを完全に理解するのに1年以上、2000行を費やしました。 私のコードをそのまま使ってもいいし、あなたのニーズに合わせてリファクタリングしてもいいのです。
https://github.com/prettydiff/prettydiff/blob/master/lib/markuppretty.js (そして Githubプロジェクト )
でデモができます。 http://prettydiff.com/?m=beautify&html
なぜこれほど多くのコードが必要かというと、人々は本当にテキストノードの重要性を理解し、価値を認めていないようだからです。 もし、美化中に新しい空のテキストノードを追加しているのなら、それは間違った方法で、コンテンツを破損している可能性が高いです。 また、逆に、コンテンツ内の空白を削除してしまうこともあります。 このようなことに気をつけないと、ドキュメントの整合性を完全に壊してしまうことになります。
また、文書にCSSやJavaScriptが含まれている場合はどうでしょうか。 これらもかなり印刷されているはずですが、HTMLとはかなり異なる要件があります。 HTMLとXMLでも要件は異なるのです。 これは簡単なことではありませんので、どうか私の言葉をお受け取りください。 HTML Tidyは10年以上これに取り組んできて、いまだに多くのエッジケースを台無しにしています。
私が知る限り、私のmarkup_beauty.jsアプリケーションは、HTML/XMLのために書かれた最も完全なプリティプリンターだと思います。 これは非常に大胆な発言であり、おそらく傲慢であることは承知していますが、これまでのところ、異議を唱えられたことはありません。 私のコードを見て、もし必要なものがあれば、私に知らせてください。
関連
-
[解決済み】フォームコントロールの値アクセサがない
-
[解決済み】Uncaught TypeError: 未定義のプロパティ 'msie' を読み取れない - jQuery tools
-
[解決済み] ループ内のJavaScriptクロージャ - シンプルな実用例
-
[解決済み] JavaScriptでJSONをきれいに印刷する
-
[解決済み] リンクのように動作するHTMLボタンを作成する方法
-
[解決済み] JavaScriptでカンマを桁区切りにして数値を表示する方法
-
[解決済み] HTML 5: Is it <br>, <br/>, or <br />?
-
[解決済み] HTMLのid属性に有効な値は何ですか?
-
[解決済み] HTMLマークアップのどこに<script>タグを記述すればよいですか?
-
[解決済み】なぜHTMLは "chucknorris "を色と見なすのか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Failed to load resource: net::ERR_FILE_NOT_FOUND loading json.js
-
[解決済み】Javascript:getElementById対getElementsById(両方が別のページで動作する)。
-
[解決済み】XMLHttpRequestモジュールが定義されていない/見つからない
-
[解決済み】最大呼び出しスタックサイズ超過エラーとその修正方法とは?
-
[解決済み】ある要素が可視DOMに存在するかどうかを確認するにはどうすればいいですか?
-
[解決済み】Reactのeslintエラーはpropsの検証で見つからない
-
[解決済み】SyntaxError: JSON の位置 1 に予期しないトークン o があります。
-
[解決済み】npm install --legacy-peer-deps は具体的に何をするのですか?どんなときに推奨されるのか/どんな使用例が考えられるのか?
-
[解決済み】 Uncaught Error: Invariant Violation: 解決済み】 Uncaught Error: Invariant Violation: Element type is invalid: expected a string (for built-in components) or a class/function but got: object.
-
[解決済み】Babel NodeJS ES6: SyntaxError: 予期しないトークンのエクスポート