Water Sunlight

軽量プログラミングの文法 - JavaScript/Python

ユーザ用ツール

サイト用ツール


sakura-macro

差分

このページの2つのバージョン間の差分を表示します。

この比較画面にリンクする

両方とも前のリビジョン 前のリビジョン
次のリビジョン
前のリビジョン
sakura-macro [2021/12/20 13:16]
tanaka [chop.js]
sakura-macro [2022/02/01 10:31] (現在)
tanaka [visible_pack.js]
行 38: 行 38:
 // ----------------------------------------------- // -----------------------------------------------
 // 1行の最大文字数を指定して改行を入れる // 1行の最大文字数を指定して改行を入れる
-// 0x0Dが含まれる時は0x0Fに変換する(確認メッセージ有)+// ファイル名に.chopを付けて保存する(改行コードは入力する) 
 +// 0x0Dが含まれる時は確認メッセージ表示 
 +// [はい]:0x0D を 0x0F に変換する 
 +// [いいえ]: 何もしない 
 +// ※ 0x0D:'-'  0x0C:'+'  0x0F:' '
 // ----------------------------------------------- // -----------------------------------------------
 main(); main();
行 78: 行 82:
  // ペースト  // ペースト
  Editor.Paste(0);  Editor.Paste(0);
 +
 + // 改行コード
 + var code = parseInt(Editor.InputBox('[0]変換なし | [1]CRLF | [2]LF | [3]CR を入力して下さい。', 0));
 + if(isNaN(code)){
 + Editor.WarnMsg('改行コードの入力が無いので、ファイルを保存しません。');
 + return;
 + }
  
  // 名前を指定して保存  // 名前を指定して保存
  var fileName = Editor.GetFilename() + '.chop';  var fileName = Editor.GetFilename() + '.chop';
- Editor.FileSaveAs(fileName);+ Editor.FileSaveAs(fileName, 0, code);
 } }
 </sxh> </sxh>
行 186: 行 197:
 ===== xsort.js ===== ===== xsort.js =====
 <sxh javascript;title:xsort.js> <sxh javascript;title:xsort.js>
-TODO+// ----------------------------------------------- 
 +// 複数キーのソート 
 +// [入力方法]{開始位置}:{文字長},{開始位置}:{文字長},asc desc 
 +// ----------------------------------------------- 
 + 
 +main(); 
 + 
 +function main() { 
 + 
 + // キー 
 + var input = Editor.InputBox('{開始位置}:{文字長},{開始位置}:{文字長},asc desc'); 
 + if(!input) return; 
 + 
 + var keys = []; 
 + var inputWords = input.split(','); 
 + var orderWords = inputWords[inputWords.length-1].split(' '); 
 + if(inputWords.length - 1 == orderWords.length) { 
 + for(var i=0; i<inputWords.length-1; i++){ 
 + 
 + var words = inputWords[i].split(':'); 
 + if(words.length == 2){ 
 + var pos = 0; 
 + var len = 0; 
 + var order = ''; 
 +  
 + pos = parseInt(words[0]); 
 + len = parseInt(words[1]); 
 + order = orderWords[i]; 
 + 
 + var obj = new Key(pos, len, order); 
 + keys.push(obj); 
 +
 +
 + } else { 
 + Editor.ErrorMsg('キーの数とソート順の数があっていません。'); 
 + return; 
 +
 + 
 + // 行 
 + var items = []; 
 + for(var i=1; i<=Editor.GetLineCount(0); i++){ 
 + var line = GetLineStr(i); 
 + 
 + var itemKeys = []; 
 + for(var j=0; j<keys.length; j++){ 
 + itemKeys[j] = line.substr(keys[j].pos-1, keys[j].len); 
 +
 + 
 + var objItem = new Item(i, itemKeys); 
 + items.push(objItem); 
 +
 + 
 + // ソート 
 + items.sort(function(a, b) { 
 + 
 + for(var i=0; i<a.key.length; i++){ 
 +  
 + if(a.key[i] !== b.key[i]) { 
 + if (a.key[i] < b.key[i]) { 
 + return (keys[i].order.toUpperCase() == 'DESC') ? 1 : -1; 
 +
 + if (a.key[i] > b.key[i]) { 
 + return (keys[i].order.toUpperCase() == 'DESC') ? -1 : 1; 
 +
 +
 +
 +  
 + return 0; 
 + }); 
 + 
 + var sortTxt = ''; 
 + for(var i=0; i<items.length; i++){ 
 + sortTxt += GetLineStr(items[i].lineNo); 
 +
 +  
 + // 上書き 
 + Editor.SelectAll(); 
 + Editor.InsText(sortTxt); 
 +
 + 
 +function Key(pos, len, order) { 
 + this.pos = pos; 
 + this.len = len; 
 + this.order = order; 
 +
 + 
 +function Item(lineNo, key) { 
 + this.lineNo = lineNo; 
 + this.key = key; 
 +}
 </sxh> </sxh>
  
行 473: 行 573:
  Editor.SetClipboard(0, arr.join(''));  Editor.SetClipboard(0, arr.join(''));
  Editor.MessageBox('クリップボードにコピーしました');  Editor.MessageBox('クリップボードにコピーしました');
- } else { 
- // コメント無し 
- Editor.MessageBox('コメント行はありません'); 
  }  }
 } }
行 483: 行 580:
 ===== cb_pic.js ===== ===== cb_pic.js =====
 <sxh javascript;title:cb_pic.js> <sxh javascript;title:cb_pic.js>
-TODO+// ----------------------------------------------- 
 +// pic句のバイト数を集計 
 +// PICTURE文字列がN, CR, DBはサポートしていません。 
 +// REDEFINES と OCCURS は未サポートです。 
 +//  ・出現した時は警告を出します。 
 +//  ・出てきた数を数えて警告に表示します。 
 +// ----------------------------------------------- 
 +  
 +var fileName = null; 
 +var occursNumber = 0; 
 +var redefinesNumber = 0; 
 + 
 +main(); 
 +  
 +function main() { 
 + var isSelected = Editor.IsTextSelected(); 
 + if(isSelected == 1) { 
 + 
 + // 行選択しているか 
 + var txt = Editor.GetSelectedString(0); 
 + var lines = txt.match(/^\d{6}[\s\S]*(\n|\r\n|\r)$/); 
 + if(!lines){ 
 + Editor.MessageBox('行を選択して下さい'); 
 + return; 
 +
 + }else{ 
 + Editor.MessageBox('行を選択して下さい'); 
 + return; 
 +
 + 
 + var lineFrom = Editor.GetSelectLineFrom();      // 選択開始行 
 + var lineTo = Editor.GetSelectLineTo();          // 選択終了行 
 + 
 + var picArr = []; 
 + var note = ''; 
 + for(var i=lineFrom; i<lineTo; i++){ 
 + 
 + // 行取得 
 + var txt = Editor.GetLineStr(i); 
 + 
 + // コメント行 
 + var arr = txt.match(/\d{6}(\*|\/)/); 
 + if(arr){ 
 + note = getNote(txt); 
 + continue; 
 +
 + 
 + // PicObj取得 
 + var pic = getPic(txt, note); 
 + if(!pic) continue; 
 + 
 + // バイト数計算 
 + var byte = getByte(pic.type, pic.option); 
 + if(byte == 0) { 
 + return; 
 +
 + 
 + pic.byte = byte; 
 + 
 + // 位置計算 
 + if(picArr.length > 0) { 
 + pic.position = getPosition(picArr[picArr.length - 1].byte, picArr[picArr.length - 1].position); 
 + } else { 
 + pic.position = 1; 
 +
 + 
 + // 配列に入れる 
 + picArr.push(pic); 
 +  
 + note = ''; 
 +
 + 
 + // 出力 
 + output(picArr); 
 + 
 + // REDEFINEとOCCURSの数 
 + if(occursNumber > 0 || redefinesNumber > 0) { 
 + var msg = ''; 
 + 
 + if(occursNumber > 0) { 
 + msg += 'OCCURS が ' + occursNumber + ' 箇所あります。'; 
 +
 + if(redefinesNumber > 0) { 
 + if(msg) msg += '\n'; 
 + msg += 'REDEFINES が ' + redefinesNumber + ' 箇所あります。'; 
 +
 + Editor.MessageBox(msg); 
 +
 +
 +  
 +function Pic(no, name, type, option, byte, position, note) { 
 + this.no = no; 
 + this.name = name; 
 + this.type = type; 
 + this.option = option; 
 + this.byte = byte; 
 + this.position = position; 
 + this.note = note; 
 +
 + 
 +/** 
 + * コメント行の備考を取得 
 + */ 
 +function getNote(line) { 
 +  
 + var note = ''; 
 + var words = line.split(';'); 
 + if(words.length == 2) { 
 + var wds = words[1].split(/\s/); 
 + if(wds.length == 2) { 
 + note = wds[1]; 
 +
 +
 + 
 + return note; 
 +
 + 
 +/** 
 + * 1行をPicにいれて返す 
 + */ 
 +function getPic(line, note) { 
 + 
 + var pic = null; 
 + 
 + // インラインコメント削除 
 + var commentIndex = line.indexOf(';'); 
 + if(commentIndex > 0) line = line.substring(0, commentIndex); 
 + 
 + commentIndex = line.indexOf('*>'); 
 + if(commentIndex > 0) line = line.substring(0, commentIndex); 
 + 
 + var found = line.match(/\s\d{2}\s.+/); 
 + if(found){ 
 + 
 + // スペースで区切る 
 + var words = found[0].split(/\s/); 
 + 
 + // 最後のピリオド削除 
 + words[words.length-1] = words[words.length-1].replace(/.$/, ''); 
 + 
 + // 最初の変数名をファイル名とする 
 + if(!fileName) { 
 + if(words && words.length >= 1) fileName = words[1]; 
 +
 + 
 + // PICは何番目か取得 
 + var picPos = 0; 
 + for(var index in words){ 
 + if(words[index] == 'PIC' || words[index] == 'PICTURE'){ 
 + picPos = Number(index); 
 +
 +
 + 
 + // オプション(レベル、変数名以外) 
 + var option = []; 
 + var j = 0; 
 + for(var i=2; i<words.length; i++){ 
 + option[j++] = words[i]; 
 +  
 + if(words[i].toUpperCase() == 'REDEFINES'){ 
 + redefinesNumber++; 
 +
 + 
 + if(words[i].toUpperCase() == 'OCCURS'){ 
 + occursNumber++; 
 +
 +
 + 
 + if(picPos > 1) { 
 + pic = new Pic(words[0], words[1], words[picPos+1], option, 0, 0, note); 
 +
 +
 + return pic; 
 +
 + 
 +/** 
 + * 型からバイト数計算 
 + */ 
 +function getByte(type, option){ 
 + 
 + var byte = 0; 
 + 
 + var state = 0;          // 状態 
 + var beforeType = '';    // 型 
 + var byteStr = '';       // バイト数(文字列) 
 +  
 + for(var i=0; i<type.length; i++){ 
 + 
 + // 1文字取得 
 + var char = type.charAt(i); 
 + 
 + switch(char){ 
 + case 'A': 
 + case 'X': 
 + case '/': 
 + case 'Z': 
 + case ',': 
 + case '.': 
 + case '*': 
 + case '+': 
 + case '-': 
 + beforeType = char; 
 + byte += 1; 
 + break; 
 + 
 + case 'N': 
 + Editor.WarnMsg('PIC文字[N]はサポートしていません。'); 
 + return 0; 
 + 
 + case 'D': 
 + case 'C': 
 + beforeType = char; 
 + break; 
 + 
 + case 'R': 
 + if(beforeType == 'C'){ 
 + Editor.WarnMsg('PIC文字[CR]はサポートしていません。'); 
 + return 0; 
 +
 + break; 
 + 
 + case 'B': 
 + if(beforeType == 'D'){ 
 + Editor.WarnMsg('PIC文字[DB]はサポートしていません。'); 
 + return 0; 
 + } else { 
 + beforeType = char; 
 + byte += 1; 
 +
 + break; 
 + 
 + case '0': 
 + case '9': 
 + if(state ==1){ 
 + byteStr += char; 
 + } else { 
 + beforeType = char; 
 + byte += 1; 
 +
 + break; 
 + 
 + case '(': 
 + if(beforeType){ 
 + state = 1; 
 +
 + break; 
 + 
 + case ')': 
 + if(state == 1){ 
 + 
 + byte += Number(byteStr) - 1; 
 + 
 + state = 0; 
 + beforeType = ''; 
 + byteStr = ''; 
 +
 + break; 
 + 
 + case '1': 
 + case '2': 
 + case '3': 
 + case '4': 
 + case '5': 
 + case '6': 
 + case '7': 
 + case '8': 
 + if(state == 1) { 
 + byteStr += char; 
 +
 + break; 
 +
 +  
 +
 + 
 + // PACKED-DECIMAL or COMP-3 or COMPUTATIONAL-3 
 + if(isOptions(option, 'PACKED-DECIMAL') || isOptions(option, 'COMP-3' || isOptions(option, 'COMPUTATIONAL-3')) { 
 + byte = Math.floor(byte / 2 + 1); 
 +
 + 
 + // BINARY or COMP or COMPUTATIONAL 
 + if(isOptions(option, 'BINARY') || isOptions(option, 'COMP' || isOptions(option, 'COMPUTATIONAL')) { 
 + if(1<=byte && byte<=4) { 
 + byte = 2; 
 + } else if(5<=byte && byte<=9) { 
 + byte = 4; 
 + } else if(10<=byte && byte<=18) { 
 + byte = 8; 
 +
 +
 + 
 + return byte; 
 +
 +  
 +/** 
 + * 位置計算 
 + * @param beforeByte 1つ前のバイト数 
 + * @param beforePos  1つ前の位置 
 + */ 
 +function getPosition(beforeByte, beforePos){ 
 +  
 +    return beforePos + beforeByte; 
 +  
 +
 +  
 +/** 
 + * オプション中に指定文字列があるか 
 + * @param  array option 
 + * @param  string str 
 + * @return true/false 
 + */ 
 +function isOptions(option, str) { 
 + 
 + var flg = false; 
 + for(var index in option) { 
 + if(option[index].toUpperCase() == str){ 
 + flg = true; 
 + break; 
 +
 +
 + return flg; 
 +
 +  
 +/** 
 + * 出力 
 + */ 
 +function output(picArr){ 
 + 
 + // ファイルに保存かクリップボードに保存かキャンセル 
 + var result = Editor.MessageBox('ファイル出力の場合は[はい]をクリップボードの場合は[いいえ]を押して下さい。',3); 
 + if(result == 6){ 
 + 
 + // 全選択 
 + Editor.SelectAll(); 
 + 
 + // 上書き 
 + Editor.InsText(changeText(picArr)); 
 + 
 + // 名前を指定して保存(開いているファイルのパス) 
 + Editor.FileSaveAs(fileName); 
 + 
 + }else if(result == 7){ 
 + 
 + // クリップボードにコピー 
 + Editor.SetClipboard(0, changeText(picArr)); 
 + Editor.MessageBox('クリップボードにコピーしました'); 
 + 
 +
 +
 + 
 +/** 
 + * オプション 
 + */ 
 +function getOption(option) { 
 + 
 + for(var index in option) { 
 + if(option[index]=='PACKED-DECIMAL' || option[index]=='COMP-3' || option[index]=='COMPUTATIONAL-3' 
 + || option[index]=='BINARY' || option[index]=='COMP'  || option[index]=='COMPUTATIONAL'){ 
 + return option[index]; 
 +
 +
 + return ''; 
 +
 + 
 +/** 
 + * Pic配列を文字列に変換 
 + */ 
 +function changeText(picArr) { 
 + var txt = ""; 
 +  
 + for(var i=0; i<picArr.length; i++){ 
 + txt += picArr[i].no 
 + txt += '\t'; 
 + txt += picArr[i].name; 
 + txt += '\t'; 
 + txt += picArr[i].type; 
 + var option = getOption(picArr[i].option) 
 + if(option){ 
 + txt += ' ' + getOption(picArr[i].option); 
 +
 + txt += '\t'; 
 + txt += picArr[i].byte; 
 + txt += '\t'; 
 + txt += picArr[i].position; 
 + txt += '\t'; 
 + txt += picArr[i].note; 
 + txt += '\r\n'; 
 +
 + 
 + return txt; 
 +}
 </sxh> </sxh>
  
 \\ \\
 +
sakura-macro.1639973817.txt.gz · 最終更新: 2021/12/20 13:16 by tanaka