Macro/投稿/158 の変更点

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


Top > Macro > 投稿 > 158
  • 追加された行はこの色です。
  • 削除された行はこの色です。
  • Macro/投稿/158 へ行く。

* VSライクなhtml終タグ自動補完 & texの\end補完 [#a40e6c88]
-ページ: [[Macro/投稿]]
-作者: [[peak]]
-カテゴリー: js
-投稿日: 2006-12-23 (土) 11:40:43

** メッセージ [#qc8ceefc]
gis_dur 氏のマクロにインスパイアされたものです。
*** HTML/XML [#jf6cbead]
#code(javascript){{
////////////////////////////////////////////////////////////////////////////////
// html, xml 入力支援
// <...>の直後に</...>を自動で補完します。
//
// インストール方法
// キー SHIFT + . にこのマクロを割り当ててください。


////////////////////////////////////////////////////////////////////////////////
// エントリーポイント
Entry();


function Entry()
{
	// SHIFT + . で呼び出されるので、とりあえず > を出力する
	Editor.Char(0x3e); // 0x3e = '>'

	var strFileName = Editor.GetFileName();
	if(/\.(htm|html|shtml)$/.test(strFileName)){
		ComplementTag(true);
	}
	else if(/\.(xml|xhtml)$/.test(strFileName)){
		ComplementTag(false);
	}
}


function ComplementTag(isHTML)
{
	var strLine = GetCurLineUntilCursor();
	var astrMatched = strLine.match(/<([^<>"']|"[^"]*?"|'[^']*?')+>$/); //'
	if(astrMatched == null) return false;
	var strTag = astrMatched[0];

	// 終タグを必要としないタグなら何もしない
	if(/-->$|\/>$|\?>$/.test(strTag)) return;
	if(strTag.search(/^<\s*(\w+)/) < 0) return;

	// タグ名を抽出
	strTag = RegExp.$1;

	if(isHTML){
		// HTMLの場合は、タグの種類によっては終タグがいらない
		if("|area|base|basefont|bgsound|br|col|embed|frame|hr|img|input|isindex|keygen|link|meta|nextid|param|spacer|wbr|"
			.indexOf("|" + strTag + "|") >= 0)
		{
			return;
		}
	}

	// 終タグを作って挿入
	strTag = "</" + strTag + ">";

	Editor.InsText(strTag);
	for(var i = 0; i < strTag.length; ++i){
		Editor.Left();
	}

	return true;
}


function GetCurLineUntilCursor()
{
	// カーソル位置取得
	var xCursor = parseInt(Editor.ExpandParameter('$x'));
	var yCursor = parseInt(Editor.ExpandParameter('$y'));

	// カーソル行全体を取得
	var str = Editor.GetLineStr(yCursor);

	// xCursor はマルチバイトコードでの値なのでユニコード用に補正
	--xCursor; // 1起算だったものを0起算に直す
	for (var x = 0; x < xCursor; ++x){
		if(IsWide(str.charCodeAt(x))) --xCursor;
	}

	return str.substring(0, xCursor);
}


////////////////////////////////////////////////////////////////////////////////
// 2バイト文字判定
function IsWide(charCode)
{
	return  0x80 <= charCode && (charCode <= 0xff60 || 0xffa0 <= charCode);
}
}}

*** tex [#h9c374a2]
#code(javascript){{
////////////////////////////////////////////////////////////////////////////////
// tex 入力支援
// \begin{...}の直後に\end{...}を自動で補完します。
//
// インストール方法
// キー SHIFT + ] にこのマクロを割り当ててください。


////////////////////////////////////////////////////////////////////////////////
// エントリーポイント
Entry();


function Entry()
{
	// SHIFT + ] で呼び出されるので、とりあえず } を出力する
	Editor.Char(0x7d); // 0x7d = '}'

	var strFileName = Editor.GetFileName();
	var ixExt = strFileName.lastIndexOf('.');
	if(ixExt >= 0){
		var strExt = strFileName.substr(ixExt).toLowerCase();
		if(strExt == '.tex'){
			ComplementTag();
		}
	}
}


function ComplementTag()
{
	var strLine = GetCurLineUntilCursor();
	var astrMatched = strLine.match(/\\begin\{[^{}]+?\}$/);
	if(astrMatched == null){
		return false;
	}
	var strEndTag = astrMatched[0].replace(/^\\begin/, "\\end");

	Editor.InsText(strEndTag);
	for(var i = 0; i < strEndTag.length; ++i){
		Editor.Left();
	}

	return true;
}


function GetCurLineUntilCursor()
{
	// カーソル位置取得
	var xCursor = parseInt(Editor.ExpandParameter('$x'));
	var yCursor = parseInt(Editor.ExpandParameter('$y'));

	// カーソル行全体を取得
	var str = Editor.GetLineStr(yCursor);

	// xCursor はマルチバイトコードでの値なのでユニコード用に補正
	--xCursor; // 1起算だったものを0起算に直す
	for (var x = 0; x < xCursor; ++x){
		if(IsWide(str.charCodeAt(x))) --xCursor;
	}

	return str.substring(0, xCursor);
}


////////////////////////////////////////////////////////////////////////////////
// 2バイト文字判定
function IsWide(charCode)
{
	return  0x80 <= charCode && (charCode <= 0xff60 || 0xffa0 <= charCode);
}
}}

----

#comment

    ホーム 一覧 単語検索 最終更新 バックアップ リンク元   ヘルプ   最終更新のRSS