2017年2月1日水曜日

htaのscript内部で複数行文字列を扱う

ブラウザによってはECMAScript6の恩恵を受けてシンプルな書き方をすることもできますが、HTAでは今のところ利用できないので、以下の方法をよく利用してます。




ソース
<html>
<title>com</title>
<style type="text/css">
.max{width:100%;height:100%;}
</style>
<body>
<table class=max>
<tr><td><textarea id=ta0 wrap=off class=max></textarea></td></tr>
<tr><td><textarea id=ta1 wrap=off class=max></textarea></td></tr>
<tr><td><textarea id=ta2 wrap=off class=max></textarea></td></tr>
</table>
</body>
<script>
resizeTo(500,500)
fun = function(){/*
<div>
複数行の
文字列を
書きたい
</div>
*/}
ta0.value = fun
インデント調整=function(){
var reg=/(\n[ \t]+)[^ \t]*$/, g='g', n='\n'
return function(str){ str+=''; return str.match(reg) ? str.replace(new RegExp(RegExp.$1,g), n) : str }
}()
ta1.value = インデント調整(fun)
com=function(){
var reg0=/\/\*([^\v]*[^\r\n \t])[\r\n \t]*\*\//, reg1=/^[\r\n]*/g, L0=''
return function(fun){ return インデント調整((fun+'').match(reg0)[1]).replace(reg1,L0) }
}()
ta2.value = com(fun)
</script>
</html>


実行画面



改行をエスケープする、という方法もあり、そちらも見た目がわりとシンプルな感じで好きですが、全ての行末に「\」を入れるのは面倒、かも…?

str = 'あああ\
あいうえお\
いいい'
confirm(str.replace(new RegExp(String.fromCharCode(9),'g'), '\n'))

HTAでHTML5の機能を利用する時のように、モードを変更すればスクリプトエンジンも動作モードが変わるらしいです。

私は新しいモードに適用されるデザインルールに対応できていないので、それさえクリアできれば移行したいんですが…従来のデザインルールで実現できるインターフェースを再現しようと努力するより、新しいデザインルールで実現できるインターフェースを基準にプログラムを設計できるようになる方がラクな気がしますが、いざ試してみるとどうしても従来の手法が使いたくなってしまいます。。

1 件のコメント:

  1. エスケープによる複数行文字列の扱いについてはgoogleのガイドラインでは禁止されている(いた?)らしいですがECMAScript5で標準化されたらしく、最終的には使用しても良い状況?
    http://qiita.com/koshihikari/items/f6a90d8a19bda831d879

    返信削除