1

私はウェブサイトのフロントエンドコードを開発しています。これを一部の開発者に引き渡して、バックエンドと統合してもらいます。このサイトは .NET で作成されますが、私は静的 HTML ファイル (および少しの JavaScript) を使用してフロント エンド コードを開発しています。

ヘッダー、フッター、およびその他のいくつかの要素はすべてのページで同じであるため、私の開発環境ではサーバー サイド インクルードを使用しています。ただし、開発者にコードを渡すたびに、コピーして貼り付けて、各 SSI を実際の HTML に手動で置き換える必要があります。これは退屈になり始めています。

これを行うために bash スクリプトを作成しようとしましたが、bash の知識が非常に限られているため、惨めに失敗しました (どこから始めればよいかわかりません)。

私が達成しようとしたのは:

  • プロジェクト内のすべての HTML ファイルをループする
  • <!--#include file="myfile.html"-->インクルード ( )を探します
  • 見つかった場合は、インクルードで指定されたファイルの HTML でインクルードを置き換えます。
  • インクルードがなくなるまでこれを続け、次のファイルに進みます

これを行うことができるスクリプトを知っている人はいますか、またはこれを自分で達成するための正しい方向に私を向けることができますか? 自分の Mac で実行できるのであれば、どの言語でもかまいません。

ありがとう。

編集

<!--#include file="myfile.html"-->のすべてのインスタンスが独自の行にあると想定しても安全です。

4

2 に答える 2

1

仕様はすべての詳細を網羅しているわけではないため、次の仮定があります。

  1. <!--#include file="myfile.html"-->ラインは独自のままです。他のキャラクターは削除されます。
  2. インクルード ファイルには、追加のインクルードは含まれません。
  3. プロジェクト ディレクトリでは、サブディレクトリをチェックする必要はありません。

この場合、このようなものが仕事をすることができます。それはにあります:

#!/usr/bin/bash

search=${1:-./}

replace() {
  while read -r x; do
    if [[ "$x" =~ \<!--#include\ file=\"([^\.]+.html)\"--\> ]]; then
      cat "${BASH_REMATCH[1]}";
    else
      echo "$x"
    fi
  done <"$1"
}

while read f; do
  replace "$f" > tmp_$$.tmp && mv tmp_$$.tmp "$f"
done < <(find $search  -maxdepth 1 -name '*.html')

*.html指定されたディレクトリ内のすべてのファイルを (再帰的にではなく)読み取ります。引数が指定されていない場合、現在のディレクトリがチェックされます。行ごとに関数を呼び出しreplaceます。Replaceインクルード行を検索します。見つかった場合は、ファイルの内容を stdout に出力します。そうでない場合は、元の行が表示されます。

ファイルを考えてみましょう:

cat >master.html <<XXX
<html>
<!--#include file="myfile.html"-->
</html>
XXX

cat >myfile.html <<XXX
<title>
My file
</title>
XXX

結果:

$ cat master.html
<html>
<title>
My file
</title>
</html>
$ cat myfile.html
<title>
My file
</title>

これが役立つことを願っています...

于 2013-08-22T13:02:56.007 に答える
0

開発マシンで、ブラウザーを使用して Web ページを表示し、「結果」を適切なファイル名で出力ディレクトリに保存します。

したがって、さまざまな time/last-mod ディレクティブを実行し、適切な場所に fileA.inc と fileB.inc をインクルードした mainfile.html がある場合、結果の表示 (および保存可能な HTML ファイル) は 4 つまたは 5 つのコンポーネントすべてで構成されます。

=dn

于 2014-03-16T02:29:36.303 に答える