次のコマンドは私が望む出力を提供します。
$ sed '/^<template.*>/,/<\/template>/!d;//d' src/components/**/*.vue | html2jade
HTMLを含むすべてのテンプレートをそのパグに対応するものとして扱うためです。
これらすべてのファイルで元々見つかったhtmlを現在処理された出力に置き換えることは可能ですか?テンプレートタグの外側には、そのままにする必要がある他のいくつかの項目、つまりsomescript
とstyle
タグがあります。
答え1
私はあなたがこれを行うことができないと思いますsed
。これは可能なはずawk
ですが難しいです。
python3
より適切に見えます。
import re
import subprocess
from io import StringIO
from traceback import format_exception_only
PROCESS_COMMAND = ("html2jade",)
TEMPLATE_OPEN_REGEX = re.compile(r"^<template.*>$")
TEMPLATE_CLOSE_REGEX = re.compile(r"^</template>$")
def replace_templates(file_path) :
out_buffer = StringIO()
template_buffer = StringIO()
with open(file_path, "r") as file :
lines_gen = enumerate(file, 1)
for (lineno, line) in lines_gen :
out_buffer.write(line)
if (TEMPLATE_OPEN_REGEX.match(line)) :
for (lineno, line) in lines_gen :
if (TEMPLATE_OPEN_REGEX.match(line)) :
raise ValueError("nested opening tag on line {:d}".format(lineno))
elif (TEMPLATE_CLOSE_REGEX.match(line)) :
break
template_buffer.write(line)
else :
raise ValueError("tag never closed")
proc = subprocess.run(
PROCESS_COMMAND,
input=template_buffer.getvalue(),
stdout=subprocess.PIPE,
stderr=subprocess.DEVNULL,
encoding="UTF-8",
check=True)
out_buffer.write(proc.stdout)
out_buffer.write(line)
template_buffer.seek(0)
template_buffer.truncate()
elif (TEMPLATE_CLOSE_REGEX.match(line)) :
raise ValueError("closing tag encountered on line {:d}, before opening tag".format(lineno))
with open(file_path, "w") as file :
file.write(out_buffer.getvalue())
def main(args) :
for a in args :
try :
replace_templates(a)
except Exception as ex :
print("generation failed for file {!r} ({:s})".format(
a,
format_exception_only(type(ex), ex)[-1].rstrip()))
else :
print("file {!r} written".format(a))
if (__name__ == "__main__") :
from sys import argv
main(argv[1:])
- 表示された行のテンプレートコードを無視しているようで、私のコードはそれを処理せずに完全な行一致を実行します。
- 無効な値このエラーは、Open and Close テンプレートタグの順序が正しくない場合に発生します。
- ファイルが見つかりませんエラー次の場合に発生します。.vueファイルまたはサブプロセスコマンドが見つかりません。
- ChildProcess.CalledProcessError子プロセスが0を返さない場合、この例外がスローされます。
- Unicode デコードエラーこのエラーは、子プロセスがUTF-8以外の文字を出力する場合に発生します。
- エラーが発生した場合、ファイルはタッチされません。
- フルファイル出力はRAMにバッファされます。