// // CommandLine Help レンダラ // const electron = window.require('electron'); //const electron = require('electron'); const remote = electron.remote; const shell = electron.shell; //const clipboard = electron.clipboard; // clipboard.writeText() でクリップボードに文字列が入る const data = require("./data"); const Generator = require('re_expand'); var g; // ExpandHelp generator // 実行時に取得する各種環境値 var param_files = '___'; var param_branches = remote.app.branches(); var param_params = 'param1|param2'; var param_numbers = '1|2|3'; const glossary = require("./glossary"); // 各種定義をいれておく for(var e in glossary){ s = `param_${e} = '${glossary[e]}'`; eval(s); // これが良くない! glossaryに「delete」なんてのが定義されてると "delete = 'abc'" みたいなのをevalしてしまう! } var commands = []; var commandind = 0; var selected = 0; var g; function generator(patterns){ g = new Generator(); param_files = remote.app.files(patterns).join('|'); // レンダラプロセスではコマンド起動できないようなのでメインプロセスを利用してファイルリストを取得 param_params = get_params(patterns); param_numbers = get_numbers(patterns); var lines = []; for(var def of data.defs){ m = def.match(/^\s*\$\s*(.*)\s*$/); if(m){ lines.push(m[1]); } m = def.match(/^\s*\%\s*(.*)\s*$/); if(m){ var cmd = m[1]; for(var line of lines){ var desc = line.replace(/\s*{(\d+)}\s*$/,''); desc = ("\`"+desc+"\`").replace(/#{/g,'${param_'); console.log(desc) cmd = cmd.replace(/#{\$(\d+)}/g,"DOLLAR$1").replace(/DOLLAR/g,'$'); g.add(`${eval(desc)}`,cmd); } } } return g; } function sel(e){ selected = Number($(e.target).attr('id').match(/(\d+)$/)[1]); show_selected(); $("html,body").animate({scrollTop:$(`#entry${selected}`).offset().top - 100}); $('#query').focus(); } function get_params(patterns){ var a = new Set; for(var pattern of patterns){ var m; if(m = pattern.match(/^'(.*)'$/)){ a.add(m[1]); } if(m = pattern.match(/^"(.*)"$/)){ a.add(m[1]); } if(m = pattern.match(/^\[(.*)\]$/)){ a.add(m[1]); } } a = Array.from(a); if(a.length == 0){ a = ['param']; } return a.join('|'); } function get_numbers(patterns){ var a = new Set; for(var pattern of patterns){ if(pattern.match(/^\d+$/)){ a.add(pattern); } } a = Array.from(a); if(a.length == 0){ a = ['1']; } return a.join('|'); } function addentry(a, cmd){ // 候補を整形してリストに追加 console.log(cmd); var num = cmd.match(/\s*{(\d+)}$/,"$1")[1]; // 説明ページの番号を取得 cmd = cmd.replace(/\s*{(\d+)}$/,""); if(commands.indexOf(cmd) >= 0) return; commands[commandind] = cmd; var entry = $('
')
.on('click',sel)
.attr('id',`code${commandind}`)
.text(cmd)
.appendTo(entry);
if(commandind == selected){
entry.css('background-color','#ccc');
title.css('background-color','#ccc');
}
else {
entry.css('background-color','#fff');
title.css('background-color','#fff');
}
commandind += 1;
}
var key_timeout = null;
var control = false;
function show_selected(){
for(var i=0; i 0){
selected -= 1;
show_selected();
$("html,body").animate({scrollTop:$(`#entry${selected}`).offset().top - 100});
}
}
});
//$('#query').on('keyup', function(e){
$('body').on('keyup', function(e){
if(e.keyCode == 17){
control = false;
}
else if(!control && e.keyCode != 40 && e.keyCode != 38){
$('#candidates').empty();
commandind = 0;
commands = [];
selected = 0;
show_selected();
// インクリメンタルにファイル名やパラメタも計算してマッチング
// したいところだがそれだとすごく遅い
clearTimeout(key_timeout);
setTimeout(function(){
var qstr = $('#query').val();
g = generator(qstr.split(/\s+/));
var pstr = qstr.replace(/'/g,'').replace(/"/g,'');
g.filter(` ${pstr} `, addentry, 0);
},500);
}
});
var arg = remote.app.argv()[1]
if(arg.match(/^git/)){
// var qstr = arg.replace(/^git\s*/,'');
qstr = qstr.replace(/(\d)([^\d])/g,"$1 $2") // 10分 => 10 分
$('#query').val(qstr);
g = generator(qstr.split(/\s+/));
var pstr = qstr.replace(/'/g,'').replace(/"/g,'');
g.filter(` ${pstr} `, addentry, 0);
}
else {
var qstr = arg
$('#query').val(qstr);
g = generator(qstr.split(/\s+/));
var pstr = qstr.replace(/'/g,'').replace(/"/g,'');
g.filter(` ${pstr} `, addentry, 0);
// g = generator([]);
// g.filter(' ', addentry, 0);
}
$('#query').focus();
}
$(function() {
init();
});