
作成者が md ファイルを検証するために使用する Markdown バリデーターがあり、その検査の 1 つは、md ファイルで無効な Liquid タグを検証する Liquid タグの検証です。私の要件は、中かっこが正しく使用され、正しく終了したことを確認する検証を追加することです。たとえば、作成者が5つの{sで開いた場合は、5つの閉じる}も必要です。しかし、我々はまた、この検証からコードブロックを除外する必要があります。コードブロック内の括弧は検証しないでください。コードブロックは、スペース4つのインデント、バックティック3つ、またはバックティック1つです。
bracecountopen=$(grep -o -i '{' $file | wc -l);
bracecountclose=$(grep -o -i '}' $file | wc -l);
if [ "$bracecountopen" != "$bracecountclose" ]; then
throw error
fi
コードブロックを除外するために使用されます。
var+=$(grep '^\ \ \ \ [^>]' $file);
while IFS= read -n1 char; do
if [[ "$char" == "\`" ]]; then
if [ $flag = 1 ]; then
flag=0;
continue
fi
flag=1;
fi
if [ $flag = 1 ]; then
# var+=$char;
echo ""
fi
done <$file
codebraceopen=$(echo "$var" | grep -o -i '{' | wc -l)
codebraceclose=$(echo "$var" | grep -o -i '}' | wc -l)
let "bracecountopen=bracecountopen - codebraceopen"
let "bracecountclose=bracecountclose - codebraceclose"
これは正しいアプローチですか?これを達成するためのより良いロジックはありますか?ここでの問題は、一部の作成者がバックティックでコードブロックを開始する前にタブまたは4つのスペースを追加して内容が「var」に2回表示され、バックティック検証だけでなく4つのスペースについても計算されることです。この問題をどのように解決しますか?
答え1
これは完全な答えではありませんが、開いている中awk
括弧({}
)の数を計算するために使用できるコードは次のとおりです。
codebraceopen=$(echo "$var" | awk '{n+=gsub("\{","",$0)} END {print n}' )
codebraceclose=$(echo "$var" | awk '{n+=gsub("\}","",$0)} END {print n}')
これは同様の構文を正しく処理するのに役立ちます}}} {{{
(コメントで述べたように)。
同じ手法を使用して、バックティック、バックスラッシュなどを計算できます。