概要
JavaScriptで文字列の特定箇所だけ置換するようなことが簡単にできないかと考えています。どのような方法が一番簡潔で、わかりやすく、また、パフォーマンス的にも優れていながら、安全にできるでしょうか?
言ってみればJavaScriptのテンプレート文字列のように使える物です。
JavaScript
1const template = 'http://example.jp/${path}/${code}'; 2const map = new Map([['path', 'hoge'], ['code', 123]]);
とあったとき、
JavaScript
1let evalStr = ''; 2map.forEach((v, k) => evalStr += `const ${k} = "${v}";`); 3evalStr += `\`${template}\``; 4const result = eval(evalStr); 5console.log(result);
各種条件
ある程度の妥協は仕方が無いとしても、満たして欲しい条件です。
####テンプレート文字列
- プログラミングに詳しくない管理者が設定ファイル等で設定することを想定しています。JavaScriptのテンプレート文字列にこだわりはありませんが、書き方のルールが簡単でわかりやすい物でなければなりません。
- 想定される最終的な文字列は、URI、ファイル・ディレクトリパス(WinおよびMacでの)、ファイル共有パス(URI形式かUNC)で、一行程度です。また、空白及びASCII文字以外も可能でなければなりません。
- 任意の文字列を設定できるように、エスケープできることは必須です。WinでのパスやUNCは"//サーバ名/パス"や"C:/Windows/System32/"でも認識するようにするため、""を使ってエスケープでもかまいません。
####マップ
- MapでもObjectでもかまいません。
- キーは文字列を想定しています。
- キーは英数字で固定です。ただし、記号"_"は使いたいです。
- 値はユーザーが入力した任意の文字列を扱います。空白及びASCII文字以外も可能でなければなりません。(".."禁止やURLエスケープ処理等のサニタイジング処理はマップに入れる前に行うため、そこは気にしなくて良いです)
####その他
- キーについて大文字小文字無視が選択できると嬉しいです。
- テンプレート自体に間違いがある場合は、エラーや
null
を返すなど、わかるようにしてほしいです。 - npmパッケージ化されていて、@typesパッケージがあればさらに嬉しいです。
- できればnode-gypによるリビルド無しで動作して欲しいです。
###検討事項
eval
はセキュリティ上からNGになりました。String.prototype.replace
ですと、正規表現の後読みが使えないため、先頭に""を付けるだけのエスケープ処理をどうすれば良いのかわからなくなります。また、キー名が間違っているなどの処理が検知できません。キー一つ一つ順番に適用となるため、単純な実装では、置き変えた後の値を細工することでおかしな動作になる可能性があります。- 本格的なテンプレートエンジンの採用も考えましたが、HTMLを想定している場合が多く、機能も多すぎて、管理者が設定を間違ったときのフォローが難しいのでは無いかと考えています。本当に簡易な物で十分なのですが、それだと何が良いのか、調べてもよくわからなかったです。
###動作環境
動作環境は最新のElectronを使用します。Mainプロセス側で動作させる予定です。OSはWinとMac両対応です。
コーディングはTypeScriptで行っています。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/12/30 02:13