Macro/投稿/129

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


Top > Macro > 投稿 > 129

文字列の縦位置合わせ

  • ページ: Macro/投稿
  • 作者: べるぽん?
  • カテゴリー: js
  • 投稿日: 2004-05-07 (金) 06:24:56

メッセージ

ブラウザでの表示ではソース内実行例の縦位置が揃いません。

fileTextAlign.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
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
/*
文字列の位置合わせMacro。ソースの整頓に使えると思います。
文字列の入力インターフェイスにExcelを使っています。(@function : InputBox)
C, C++コメントには対応していません。
 
実行例:
	int nMoge = 256;
	string strMogeMoge = "もげもげ";
	float fHoge = 0.001;
 
		↓ (区切り文字に、= を利用)
 
	int nMoge 		   = 256;
	string strMogeMoge = "もげもげ";
	float fHoge 	   = 0.001;
*/
 
/// 設定
var tabLen = 4;            // tab の文字幅。設定取得が出来ないのでハードコーディング。
var useSpace = false;    // 位置詰めの文字にspaceを使うかどうか(falseの場合は、出来るだけ tab を使う。
 
/// メインルーチン
var segmentStr = InputBox("区切りの文字を入力して下さい。");
if (segmentStr == "") {
    
}else {
    // 文字列取得
    var str = Editor.GetSelectedString();
    var lines = str.split("\r\n");
    // 整頓
    AlignLines(lines, segmentStr, useSpace);
    // 文字列設定
    Editor.InsText(lines.join("\r\n"));
}
 
/// 関数群
function InputBox(message, titleCaption, input)
{
    var objXL = new ActiveXObject("Excel.Application");
    if (input == null) { input = ""; }
    var strRet = objXL.InputBox(message, titleCaption, input);
    return strRet;
}
 
function MsgBox(message, title, nType)
{
    if (title == null) title = "";
    if (nType == null) nType = 0;
    var Shell = new ActiveXObject("WScript.Shell");
    return Shell.Popup(
        message,
        0, // nSecToWait,
        title,
        nType
    );
}
 
// 何文字目という位置を、     を考慮した見た目の位置の数値に変換する。
function CalcStringLookPosition(str, letterPos)
{
    var lookPosCnt = 0;
    var str = str.substring(0, letterPos);
    var code;
    var letter;
    for (var i=0; i<str.length; ++i) {
        code = str.charCodeAt(i);
        if (code >= 0x20 && code <= 0xdf) {        // ascii
            ++lookPosCnt;
        }else if (code == 0x09) {                //     
            lookPosCnt = GetNextTabPosition(lookPosCnt, tabLen);
        }else {                                    // 2byte文字
            lookPosCnt += 2;
        }
    }
    return lookPosCnt;
}
 
function RepeatString(str, nRepeat)
{
    var ret = "";
    for (var i=0; i<nRepeat; ++i) {
        ret += str;
    }
    return ret;
}
 
function GetNextTabPosition(idx, tabSize)
{
    var mod = idx % tabSize;
    if (mod > 0) {
        return idx - mod + tabSize;
    }else {
        return idx + tabSize;
    }
}
 
// 何文字目の位置を、     を考慮した見た目の位置()に設定する。
function GetLookPositionSettedString(line, letterPos, setLookPos, useSpace)
{
    var lookPos = CalcStringLookPosition(line, letterPos);
    if (setLookPos <= lookPos) {
        return line;
    }
    var front = line.substring(0, letterPos);
    var tail = line.substring(letterPos);
    var diff = setLookPos - lookPos;
    if (useSpace) {
        return front + RepeatString(" ", diff) + tail;
    }else {
        // useTab
        var nextTabPos = GetNextTabPosition(lookPos, tabLen);
        // tabも出来ない位置までの場合はspaceを置いて終わる。
        if (setLookPos < nextTabPos) {
            return front + RepeatString(" ", diff) + tail;
        }else {
            // tab出来る位置までtabを置く。残りがあったらspaceを置く。
            var tabCnt = 1;
            var spaceCnt = 0;
            while (nextTabPos < setLookPos) {
                nextTabPos = GetNextTabPosition(nextTabPos, tabLen);
                if (nextTabPos > setLookPos) {
                    spaceCnt = setLookPos - (nextTabPos - tabLen);
                }else {
                    ++tabCnt;
                }
            }
            return front + RepeatString("\t", tabCnt) + RepeatString(" ", spaceCnt) + tail;
        }
    }
}
 
function AlignLines(lines, segmentStr, useSpace)
{
    // 最大右位置探索
    var maxPos = 0;
    var pos;
    var line;
    for (var i=0; i<lines.length; ++i) {
        line = lines[i];
        var letterIdx = line.indexOf(segmentStr);
        pos = CalcStringLookPosition(line, letterIdx);
        if (pos > maxPos) {
            maxPos = pos;
        }
    }
    // 文字列編集
    for (var i=0; i<lines.length; ++i) {
        line = lines[i];
        var letterIdx = line.indexOf(segmentStr);
        if (letterIdx != -1) {
            lines[i] = GetLookPositionSettedString(lines[i], letterIdx, maxPos, useSpace);
        }
    }
}
 


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

添付ファイル: fileTextAlign.js 347件 [詳細]

リロード   新規 編集 凍結 差分 添付 複製 名前変更   ホーム 一覧 単語検索 最終更新 バックアップ リンク元   ヘルプ   最終更新のRSS
Last-modified: 2006-07-30 (日) 04:12:45 (4466d)