Linux中國

一個轉換花引號的 gawk 腳本

我管理著一個個人網站,用手工編輯網站上的網頁。由於網站上的頁面並不多,這種方法對我很適合,可以讓我對網站代碼的細節一清二楚。

最近我升級了網站的設計樣式,我決定把所有的普通引號都轉換成「花引號」,即在列印材料中使用的那種引號:用 「」 來代替 ""。

手工修改所有的引號太耗時了,因此我決定將這個轉換所有 HTML 文件中引號的過程自動化。不過通過程序或腳本來實現該功能需要費點勁。這個腳本需要知道何時將普通引號轉換成花引號,並決定使用哪種引號(LCTT 譯註:左引號還是右引號,單引號還是雙引號)。

有多種方法可以轉換引號。Greg Pittman 寫過一個 Python 腳本 來修正文本中的花引號。而我自己使用 GNU awk (gawk) 來實現。

下載我的 awk 秘籍。免費下載

開始之前,我寫了一個簡單的 gawk 函數來評估單個字元。若該字元是一個引號,這該函數判斷是輸出普通引號還是花引號。函數查看前一個字元;若前一個字元是空格,則函數輸出左花引號。否則函數輸出右花引號。腳本對單引號的處理方式也一樣。

function smartquote (char, prevchar) {
        # print smart quotes depending on the previous character
        # otherwise just print the character as-is

        if (prevchar ~ /s/) {
                # prev char is a space
                if (char == "'") {
                        printf("‘");
                }
                else if (char == """) {
                        printf("“");
                }
                else {
                        printf("%c", char);
                }
        }
        else {
                # prev char is not a space
                if (char == "'") {
                        printf("’");
                }
                else if (char == """) {
                        printf("”");
                }
                else {
                        printf("%c", char);
                }
        }
}

這個 gawk 腳本的主體部分通過該函數處理 HTML 輸入文件的一個個字元。該腳本在 HTML 標籤內部逐字原樣輸出所有內容(比如,<html lang="en">)。在 HTML 標籤外,腳本使用 smartquote() 函數來輸出文本。smartquote() 函數來評估是輸出普通引號還是花引號。

function smartquote (char, prevchar) {
        ...
}

BEGIN {htmltag = 0}

{
        # for each line, scan one letter at a time:

        linelen = length($0);

        prev = "n";

        for (i = 1; i <= linelen; i++) {
                char = substr($0, i, 1);

                if (char == "<") {
                        htmltag = 1;
                }

                if (htmltag == 1) {
                        printf("%c", char);
                }
                else {
                        smartquote(char, prev);
                        prev = char;
                }

                if (char == ">") {
                        htmltag = 0;
                }
        }

        # add trailing newline at end of each line
        printf ("n");
}

下面是一個例子:

gawk -f quotes.awk test.html > test2.html

其輸入為:

<!DOCTYPE html>
<html lang="en">
<head>
  <title>Test page</title>
  <link rel="stylesheet" type="text/css" href="/test.css" />
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width" />
</head>
<body>
  <h1><a href="/"><img src="logo.png" alt="Website logo" /></a></h1>
  <p>"Hi there!"</p>
  <p>It&apos;s and its.</p>
</body>
</html>

其輸出為:

<!DOCTYPE html>
<html lang="en">
<head>
  <title>Test page</title>
  <link rel="stylesheet" type="text/css" href="/test.css" />
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width" />
</head>
<body>
  <h1><a href="/"><img src="logo.png" alt="Website logo" /></a></h1>
  <p>“Hi there!”</p>
  <p>It’s and its.</p>
</body>
</html>

via: https://opensource.com/article/18/8/gawk-script-convert-smart-quotes

作者:Jim Hall 選題:lujun9972 譯者:lujun9972 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的電子郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國