Macro/投稿/211

http://sakura.qp.land.to/?Macro%2F%C5%EA%B9%C6%2F211


Top > Macro > 投稿 > 211

選択範囲をXML整形

  • ページ: Macro/投稿
  • 作者: syat?
  • カテゴリー: js
  • 投稿日: 2010-04-04 (日) 10:49:17

メッセージ

fileXmlFormat.js
  0
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
// XML整形マクロ
//   選択範囲のテキストをXMLとみなして整形します。
//   以下の機能があります。
//     ・階層構造をインデントで出力
//     ・インデント、改行文字の指定
//     ・コメント、CDATAに対応
//     ・テキストノードの前後に無駄な改行・空白を入れません
//   以下の制限があります。
//     ・XML宣言、DOCTYPE未対応(削除される)
//     ・msxmlが必要
//     ・XML形式エラーがあった場合はなにもしません
// 
//   2010/04/04 ver 1.0  syat 新規作成
 
//文字参照をエスケープする
String.prototype.escape = function() {
    return this.replace("<", "&lt;")
               .replace(">", "&gt;")
               .replace("\"", "&quot;")
               .replace("'", "&apos;")
               .replace("&", "&amp;");
}
 
//ノードを整形する
function format(node, indent, indentUnit, crlf) {
    var s = "";
    if (node.nodeName == "#comment") {
        s += "<!--" + node.nodeValue.escape() + "-->";
    } else if (node.nodeName == "#cdata-section") {
        s += "<![CDATA[" + node.nodeValue + "]]>";    //CDATAはエスケープしない
    } else if (node.nodeName == "#text") {
        s += node.nodeValue.escape();
    } else {
        s += indent + "<" + node.nodeName;
        var ats = node.attributes;
        if (ats != null) {
            for (var i=0; i<ats.length; i++) {
                s += " " + ats[i].name + "=\"" + ats[i].value.escape() + "\"";
            }
        }
        var childs = node.childNodes;
        if (childs == null || childs.length == 0) {
            s += " />";
        } else {
            s += ">";
            if (childs[0].nodeName != "#text") {
                s += crlf;
            }
            for (var i=0; i<childs.length; i++) {
                if (childs[i].nodeName != "#text" && !(i>0 && childs[i-1].nodeName == "#text")) {
                    s += indent + indentUnit;
                }
                s += format(childs[i], indent + indentUnit, indentUnit, crlf).replace(/^\s+/, "").replace(/\s+$/, "");
                if (childs[i].nodeName != "#text" && !(i<childs.length-1 && childs[i+1].nodeName == "#text")) {
                    s += crlf;
                }
            }
            if (! (childs.length == 0 || (childs[childs.length-1].nodeName == "#text")) ) {
                s += indent;
            }
            s += "</" + node.nodeName + ">" + crlf;
        }
    }
    return s;
}
 
function main() {
    var raw = Editor.GetSelectedString();
    var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
    xmlDoc.async = false;
    xmlDoc.loadXML(raw);
    if (xmlDoc.documentElement == null) return;
    
    var s = "";
    s += format(xmlDoc.documentElement, "", "  ", "\r\n");
    Editor.InsText(s);
}
 
main();

  • 16〜20行目、HTMLエスケープの処理に問題があります。"&"→"&amp"の置換を最初に行うべきです。また、replaceAll を用いるべきです。 -- sukobuto.com? 2012-09-28 (金) 19:58:07

URL B I U SIZE Black Maroon Green Olive Navy Purple Teal Gray Silver Red Lime Yellow Blue Fuchsia Aqua White

添付ファイル: fileXmlFormat.js 5025件 [詳細]

リロード   新規 編集 凍結 差分 添付 複製 名前変更   ホーム 一覧 単語検索 最終更新 バックアップ リンク元   ヘルプ   最終更新のRSS
Last-modified: 2012-09-28 (金) 19:58:07 (2117d)