質問するログイン新規登録

回答編集履歴

2

WSHマクロ\(JScript\)版を追加

2017/08/14 12:02

投稿

raccy
raccy

スコア21784

answer CHANGED
@@ -75,4 +75,89 @@
75
75
  * ""で囲まれている場合等は一切考慮していません。
76
76
  * 改行はCRLFとLFの両方に対応しており、元々のテキストの最初の行の改行に従います。
77
77
  * ショートカットキーはお好みで変更してください。
78
- * プラグインは不要です。素のAtomだけで可能です。
78
+ * プラグインは不要です。素のAtomだけで可能です。
79
+
80
+ ---
81
+
82
+ ###サクラエディタのWSHマクロ(JScript)版
83
+
84
+ JavaScriptは禁止されているようですが、サクラエディタのWSHマクロとしてJScriptが禁止されているのか(というか、どうやって禁止するんだろう)が質問への追記・修正依頼にありますが、未だにその回答がありません。WSHのJScriptはJavaScriptとは違うから使えるという前提にして、WSHマクロ(JScript)を書きました(というか、ただの移植ですが)。適当なファイルに保存して、サクラエディタの「名前を指定してマクロ実行」から実行してください。
85
+
86
+ ```JavaScript
87
+ /**
88
+ * Traspose Matrix for Sakura Editor
89
+ * Copyright (c) 2017 raccy
90
+ * This software is released under the MIT License.
91
+ * https://opensource.org/licenses/MIT
92
+ */
93
+ (function() {
94
+ 'use strict';
95
+ var getLineEndings = function(str) {
96
+ switch(GetLineCode()) {
97
+ case 0:
98
+ return '\r\n';
99
+ break;
100
+ case 1:
101
+ return '\r';
102
+ break;
103
+ case 2:
104
+ return '\n';
105
+ break;
106
+ }
107
+ }
108
+ var lineSplit = function(str, lineEndings) {
109
+ var lines = str.split(lineEndings);
110
+ var oLen = lines.length;
111
+ if (oLen > 0 && lines[oLen - 1].length === 0) {
112
+ return lines.slice(0, oLen - 1);
113
+ } else {
114
+ return lines;
115
+ }
116
+ };
117
+ var transposeMatrix = function(matrix) {
118
+ var hSize = matrix.length;
119
+ var wSize = 0;
120
+ var i, len;
121
+ for (i = 0; i < hSize; i++) {
122
+ len = matrix[i].length;
123
+ if (len > wSize) {
124
+ wSize = len;
125
+ }
126
+ }
127
+ var results = [];
128
+ var x, y, line;
129
+ for (y = 0; y < wSize; y++) {
130
+ line = [];
131
+ for (x = 0; x < hSize; x++) {
132
+ line.push(matrix[x][y]);
133
+ }
134
+ results.push(line);
135
+ }
136
+ return results;
137
+ };
138
+ var transposeAll = function() {
139
+ var i, len;
140
+ SelectAll();
141
+ var text = GetSelectedString(0);
142
+ if (!text) {
143
+ return;
144
+ }
145
+ var lineEndings = getLineEndings(text);
146
+ var splitedText = lineSplit(text, lineEndings);
147
+ var textMatrix = [];
148
+ for (i = 0, len = splitedText.length; i < len; i++) {
149
+ textMatrix.push(splitedText[i].split('\t'));
150
+ }
151
+ var newTextMatrix = transposeMatrix(textMatrix);
152
+ var newTextLines = [];
153
+ for (i = 0, len = newTextMatrix.length; i < len; i++) {
154
+ newTextLines.push(newTextMatrix[i].join('\t'));
155
+ }
156
+ newText = newTextLines.join(lineEndings) + lineEndings;
157
+ InsText(newText);
158
+ };
159
+ transposeAll();
160
+ })();
161
+ ```
162
+
163
+ ES6以降が使えないのはまだしも、Array.prototype.mapすらないJScriptがきつい。もう、二度と書きたくない。

1

ソースに要らない\(無害な\)行が入っていたので、修正

2017/08/14 12:02

投稿

raccy
raccy

スコア21784

answer CHANGED
@@ -48,7 +48,6 @@
48
48
  text = editor.getText()
49
49
  return unless text
50
50
  lineEndings = getLineEndings(text)
51
- chompedText =
52
51
  textMatrix = lineSplit(text, lineEndings).map (line) -> line.split('\t')
53
52
  newTextMatrix = transposeMatrix(textMatrix)
54
53
  newText = newTextMatrix.map((x) -> x.join('\t')).join(lineEndings) +