2016-04-18 15 views
1

ファイルに両方の種類の複数のリストと他のHTMLコードが含まれている可能性がある場合は、Perlスクリプトを使用してHTML注文リストと順序付けられていないリストをkramdownに変換できますか?HTML注文リストと順序付けられていないリストをkramdownに変換する

$content =~ s!<\/ol>!!gis; 
$content =~ s!<ol>!!gis; 
$content =~ s!<\/li>!!gis; 
$content =~ s!<li>!1. !gis; 

か一つだけ順不同リストなし他のリストがある場合、これは仕事ができる:

唯一の順序付けられたリストなし他のリストがある場合は、次のようなものは、仕事ができる、意図を説明するために:

$content =~ s!<\/ol>!!gis; 
$content =~ s!<ol>!!gis; 
$content =~ s!<\/li>!!gis; 
$content =~ s!<li>!- !gis; 

それは例えば、HTML文書内の各リストを見つけ、そして、リストの種類を決定し、適切にそれを変換し、それを返すサブルーチンに渡すことは可能ですか?

+0

http://search.cpan.org/~petek/HTML-Tree-3.23/lib/HTML/TreeBuilder.pmをご覧ください。 – xxfelixxx

答えて

0

通常、HTMLを解析するために正規表現を使用しないでください。代わりに、あなたはMojo::DOMのようなHTMLパーサを使用する必要があります。

use strict; 
use warnings 'all'; 

use Mojo::DOM; 

# Add the appropriate kramdown list marker to a Mojo::DOM node representing a 
# single <li>, depending on whether it's in an <ol> or <ul> 
sub add_list_marker { 
    my ($node, $i) = @_; 

    my $marker = $node->parent->tag eq 'ol' ? "$i. " : '- '; 
    $node->prepend_content($marker); 
} 

# Convert a Mojo::DOM node representing an <ol> or <ul> to the corresponding 
# kramdown 
sub list_to_kramdown { 
    my ($node) = @_; 

    my $items = $node->children('li')->each(\&add_list_marker); 
    my $text = $items->map('text')->join("\n"); 

    $node->replace("\n$text\n"); 
} 

my $html = do { 
    local $/; 
    <DATA> 
}; 

my $dom = Mojo::DOM->new($html); 
$dom->find('ol, ul')->each(\&list_to_kramdown); 
print $dom->to_string; 

__DATA__ 
<h1>Leave surrounding HTML</h1> 
<div id="including_enclosing_tags"> 
    <ol> 
    <li>foo</li> 
    <li>bar</li><li>baz</li> 
    <li>qux</li> 
    </ol> 
    <ul> 
    <li class="fruit">apple</li> 
    <li>pear</li> 
    <li>banana</li> 
    <li>pine 
     apple</li> 
    </ul> 
</div> 

出力:上

  • 複数<li>の要素を:

    <h1>Leave surrounding HTML</h1> 
    <div id="including_enclosing_tags"> 
    
    1. foo 
    2. bar 
    3. baz 
    4. qux 
    
    
    - apple 
    - pear 
    - banana 
    - pine apple 
    
    </div> 
    

    それは簡単に扱うことができるので、これは正規表現よりも優れています同じ行

  • <li>複数の行にまたがる要素
  • 属性
2

それはHTMLを解析し、kramdownドキュメントを放出することができるので、自分自身をkramdown用いることであろう最も簡単な方法を持つ要素。

kramdownバイナリではkramdown -i html -o kramdown INPUT.HTMLを使用してください。

関連する問題