テキストブラウザ

提供: MeryWiki
ナビゲーションに移動 検索に移動

注意事項[編集]

下記のマクロはInternet Explorer上で動作しますが、Internet Explorerのサポートは2022年6月16日に終了したため、下記のマクロを使用することはおすすめしません。

Kuro 版[編集]

URL の上にカーソルを置いて実行するとその内容をエディタ内に表示します。

ソースコード[編集]

#title = "テキストブラウザ"
#tooltip = "URL の上にカーソルを置いて実行するとその内容をエディタ内に表示します。"
// -----------------------------------------------------------------------------
// Copyright (c) Kuro. All Rights Reserved.
// www:    https://www.haijin-boys.com/
// -----------------------------------------------------------------------------

var indent = "\t";

var sc = new ActiveXObject("ScriptControl");
sc.Language = "VBScript";
sc.AddCode("Function GetTypeName(arg1) : GetTypeName = TypeName(arg1) : End Function");

function getTypeName(arg1) {
	return sc.Run("GetTypeName", arg1);
}

var sel = document.selection;
var s1 = sel.Text;
if (s1 == "") {
	var x = sel.GetActivePointX(mePosView);
	var y = sel.GetActivePointY(mePosView);
	sel.SelectWord();
	s1 = sel.Text;
	sel.SetActivePoint(mePosView, x, y);
}
if (s1.substr(0, 7) == "http://" || s1.substr(0, 8) == "https://") {
	var o = new ActiveXObject("InternetExplorer.Application");
	if (o) {
		o.visible = false;
		o.navigate(s1);
		do {
			Sleep(100);
		} while(o.Busy);
		var s2 = s1 + "\n";
		s2 = s2 + o.document.title + "\n";
		s2 = s2 + "--------------------------------------------------------------------------------" + "\n";
		s2 = s2 + getHtml(o.document.body.childNodes, "");
		sel.SelectAll();
		sel.Text = s2;
		sel.StartOfDocument();
	}
}

function getHtml(arg1, arg2) {
	var s = "";
	for (var i = 0; i < arg1.length; i++) {
		var v = arg1[i];
		switch (getTypeName(v)) {
			case "HTMLBRElement":
				s = s + "\n" + arg2;
				break;
			case "DispHTMLDOMTextNode":
				var node;
				var prev_node;
				node = v.data.replace(/^[ ]+|[ ]+$/g, '');
				do {
					prev_node = node;
					node = node.replace("  ", " ");
				} while(node != prev_node);
				if (node != "") {
					s = s + node;
				}
				break;
			case "HTMLAnchorElement":
				s = s + getHtml(v.childNodes, arg2);
				s = s + "<\"" + v.href + "\">";
				break;
			default:
				var temp = "";
				switch (v.tagName) {
					case "P":
					case "DIV":
					case "TABLE":
					case "TR":
					case "H1":
					case "H2":
					case "H3":
					case "H4":
					case "H5":
					case "H6":
					case "H7":
					case "UL":
					case "OL":
					case "SELECT":
					case "TEXTAREA":
						temp = indent;
						s = s + "\n" + arg2 + temp;
						break;
					case "TD":
					case "LI":
					case "OPTION":
						s = s + "\n" + arg2;
						break;
					default:
						break;
				}
				s = s + getHtml(v.childNodes, arg2 + temp);
				if (temp != "") {
					s = s + "\n" + arg2;
				}
				break;
		}
	}
	return s;
}

MSY-07 版[編集]

Kuro氏が作成したマクロはWindowsの64ビット版では動作しないため、改造して64ビット版で動作するようにしました。

ソースコード[編集]

#title = "テキストブラウザ"
#tooltip = "URL の上にカーソルを置いて実行するとその内容をエディタ内に表示します。"

// 定数
var indent = "\t";

// getTypeName関数の代替実装
function getTypeName(arg1) {
	try {
		return Object.prototype.toString.call(arg1).match(/\[object (.+)\]/)[1];
	} catch (e) {
		return "Unknown";
	}
}

// 選択テキスト取得
var sel = document.selection;
var s1 = sel.Text;
if (s1 == "") {
	var x = sel.GetActivePointX(mePosView);
	var y = sel.GetActivePointY(mePosView);
	sel.SelectWord();
	s1 = sel.Text;
	sel.SetActivePoint(mePosView, x, y);
}

// URLが選択されている場合の処理
if (s1.substr(0, 7) == "http://" || s1.substr(0, 8) == "https://") {
	try {
		var xhr = new ActiveXObject("MSXML2.XMLHTTP.6.0");
		xhr.open("GET", s1, false);
		xhr.send();

		if (xhr.status == 200) {
			var html = xhr.responseText;

			// タイトル取得
			var title = html.match(/<title[^>]*>([^<]*)<\/title>/i);
			var s2 = s1 + "\n";
			s2 += (title ? title[1] : "No Title") + "\n";
			s2 += "--------------------------------------------------------------------------------" + "\n";

			// HTML解析と整形
			var bodyContent = html.match(/<body[^>]*>([\s\S]*)<\/body>/i);
			if (bodyContent) {
				s2 += getHtml(parseHtml(bodyContent[1]), "");
			}

			// 新しいタブに結果を出力
			editor.NewFile();
			editor.ActiveDocument.selection.Text = s2;
			editor.ActiveDocument.selection.StartOfDocument();
		}
	} catch (e) {
		alert("エラー: " + e.message);
	}
}

// HTML文字列をDOM風オブジェクトに変換
function parseHtml(html) {
	var div = new ActiveXObject("htmlfile");
	div.write(html);
	div.close();
	return div.body.children;
}

// HTML解析関数
function getHtml(arg1, arg2) {
	var s = "";
	for (var i = 0; i < arg1.length; i++) {
		var v = arg1[i];
		var tagName = (v.tagName || "").toUpperCase();
		var temp = "";

		switch (tagName) {
			case "BR":
				s += "\n" + arg2;
				break;
			case "P":
			case "DIV":
			case "TABLE":
			case "TR":
			case "H1":
			case "H2":
			case "H3":
			case "H4":
			case "H5":
			case "H6":
			case "UL":
			case "OL":
			case "SELECT":
			case "TEXTAREA":
				temp = indent;
				s += "\n" + arg2 + temp;
				break;
			case "TD":
			case "LI":
			case "OPTION":
				s += "\n" + arg2;
				break;
			default:
				break;
		}

		s += (v.innerText || "");
		s += getHtml(v.children || [], arg2 + temp);

		if (temp != "") {
			s += "\n" + arg2;
		}
	}
	return s;
}
スポンサーリンク