2011-11-22 17 views
2

我用HTML代碼(沒有換行符 - 之前刪除)有一個變量(例如$ content)。如何在每個打開標記後添加TAB縮進來處理HTML代碼,並在每個結束標記後減少縮進級別?用Perl對HTML進行縮排

P.S.我不需要外部腳本或程序(比如整潔)。我需要用我自己的腳本來做這件事。

例如: 源內容:

<!DOCTYPE html><html><head><title>test</title></head> <body> <h1>hello!</h1><p>It works!</p></body></html> 

所需結果:

<!DOCTYPE html> 
<html> 
    <head> 
     <title>test</title> 
    </head> 
    <body> 
     <h1>hello!</h1> 
     <p>It works!</p> 
    </body> 
</html> 
+2

如果你不想使用現有的解析器/「整潔」呃,你需要自己做解析和樹輸出。你確定要這麼做嗎? – Mat

+0

也許:)我需要使用** tab **縮進來格式化HTML代碼的**部分**。我已經嘗試整齊,但它不能做到這一點 – VeroLom

回答

11
use HTML::HTML5::Parser qw(); 
use HTML::HTML5::Writer qw(); 
use XML::LibXML::PrettyPrint qw(); 

print HTML::HTML5::Writer->new(
    start_tags => 'force', 
    end_tags => 'force', 
)->document(
    XML::LibXML::PrettyPrint->new_for_html(
     indent_string => "\t" 
    )->pretty_print(
     HTML::HTML5::Parser->new->parse_string(
      '<!DOCTYPE html><html><head><title>test</title></head> <body> <h1>hello!</h1><p>It works!</p></body></html>' 
     ) 
    ) 
); 

<!DOCTYPE html><html> 
    <head> 
     <title>test</title> 
    </head> 
    <body> 
     <h1>hello!</h1> 
     <p>It works!</p> 
    </body> 
</html> 
+0

他似乎堅持要求縮進標籤。所以我認爲你需要'indent_string =>「\ t」'。 –

+0

編輯使其如此。 – daxim

1

manual pagetidy不會產生輸出CON tains選項卡。但是很簡單,後處理輸出來處理這個問題。

$ tidy -indent foo.html | perl -pe 's|^(+)|"\t" x ((length $1)/2)|e;' 

使用現有的工具必須比自己創造一個更好的解決方案。但是如果你堅持,那麼你至少應該使用預先編寫的解析器,比如Perl的HTML :: Parser。

我還應該指出,你對問題的說明似乎是不正確的。你說你想在每個開標籤後添加一個標籤。但是您的示例輸出不會爲<標題>,< h1>或& p>標記執行此操作。

0

您也可以嘗試Marpa::HTML參考其配套/演示實用程序html_fmt的來源,以瞭解如何針對文檔的特定部分進行操作。我沒有使用它,今天不能嘗試5.10的想要,但它看起來可能是一個很好的匹配。

相關問題