다음 명령은 내가 원하는 출력을 제공합니다.
$ sed '/^<template.*>/,/<\/template>/!d;//d' src/components/**/*.vue | html2jade
HTML을 포함하는 모든 템플릿을 해당 퍼그에 해당하는 것으로 처리하기 때문입니다.
이 모든 파일에서 원래 발견된 html을 현재 처리된 출력으로 바꾸는 것이 가능합니까? 템플릿 태그 외부에는 그대로 두어야 하는 몇 가지 다른 항목, 즉 some script
및 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:])
- 표시된 줄의 템플릿 코드를 무시하는 것 같아서 내 코드는 이를 처리하지 않고 전체 줄 일치를 수행합니다.
- 잘못된 값이 오류는 열기 및 닫기 템플릿 태그의 순서가 올바르지 않은 경우 발생합니다.
- 파일을 찾을 수 없음 오류다음과 같은 경우에 발생합니다..vue파일 또는 하위 프로세스 명령을 찾을 수 없습니다.
- ChildProcess.CalledProcessError하위 프로세스가 0을 반환하지 않으면 이 예외가 발생합니다.
- 유니코드 디코딩 오류이 오류는 하위 프로세스가 UTF-8이 아닌 문자를 출력하는 경우 발생합니다.
- 오류가 발생하면 파일은 터치되지 않습니다.
- 전체 파일 출력은 RAM에 버퍼링됩니다.