Text::Xatena - Text-to-HTML converter with Xatena syntax.
use Text::Xatena; my $thx = Text::Xatena->new; $thx->format($string); # with some aggressive functions my $thx = Text::Xatena->new( inline => Text::Xatena::Inline::Aggressive->new(cache => Cache::MemoryCache->new) ); $thx->format($string);
Customizing inline formatting rule
Text::Xatena->new( inline => MyInline->new )->format($string); package MyInline; use strict; use warnings; use Text::Xatena::Inline::Base -Base; match qr{\@([a-z0-9]+)} => sub { my ($self, $twitter_id) = @_; sprintf('<a href="http://twitter.com/%s">@%s</a>', $twitter_id, $twitter_id, ); }; 1;
Text::Xatena is a text-to-html converter.
Text::Xatena is comfortably to writing usual diary and blog, especially for programmers, writers treating long text.
Xatena syntax is similar to Hatena syntax (implemented as Text::Hatena), but is independent from Hatena services and has more expandability.
Most block level syntax notations are supported and more compatibility with Hatena::Diary than Text::Hatena 0.20.
And don't support rare syntax or what isn't to be done of syntax formatter. (for example, linking keywords)
Basically, Xatena convert single line breaks to <br/> and double line breaks to <p> element except "Stop P" syntax.
<br/
<p
fooo bar baz
is converted to following:
<p>fooo<br/>bar</p> <p>baz</p>
>> quoted text foobar <<
<blockquote> <p>quoted text</p> <p>foobar</p> </blockquote>
>http://example.com/> foobar <<
<blockquote cite="http://example.com/"> <p>quote</p> <cite><a href="http://example.com/">http://example.com/</a></cite> </blockquote>
>| pre <a href="">formatted</a> |<
<pre> pre <a href="">formatted</a> </pre>
>|| super pre <a> ||<
<pre> super pre <a> </pre>
>|perl| use Text::Xatena; ||<
<pre class="code lang-perl"> use Text::Xatena; </pre>
Stop insert p or br.
><blockquote> <p> hogehoge br </p> </blockquote><
<blockquote> <p> hogehoge br </p> </blockquote><
><ins>< foobar ></ins><
is convert with auto inserting p to
<ins> <p>foobar</p> </ins>
Create structured sections by * following heading.
* head1 foobar ** head2 *** head3
<div class="section"> <h3>head1</h3> <p>foobar</p> <div class="section"> <h4>head2</h4> <div class="section"> <h5>head3</h5> </div> </div> </div>
- ul - ul -- ul -- ul --- ul - ul
<ul> <li>ul</li> <li>ul</li> <li> <ul> <li>ul</li> <li>ul</li> <li> <ul> <li>ul</li> </ul> </li> </ul> </li> <li>ul</li> </ul>
+ ol + ol ++ ol ++ ol +++ ol + ol
<ol> <li>ol</li> <li>ol</li> <li> <ol> <li>ol</li> <li>ol</li> <li> <ol> <li>ol</li> </ol> </li> </ol> </li> <li>ol</li> </ol>
- ul - ul -+ ol -+ ol -+ ol - ul
:definition:description :definition:description
<dl> <dt>definition</dt> <dd>description</dd> <dt>definition</dt> <dd>description</dd> </dl>
This is incompatible syntax with Hatena::Diary
:definition: :: description :definition: :: description
|*foo|*bar|*baz| |test|test|test| |test|test|test|
<table> <tr> <th>foo</th> <th>bar</th> <th>baz</th> </tr> <tr> <td>test</td> <td>test</td> <td>test</td> </tr> <tr> <td>test</td> <td>test</td> <td>test</td> </tr> </table>
http://example.com/ ftp://example.com/ mailto:cho45@lowreal.net [http://example.com/] # using Xatena::Inline::Aggressive [http://example.com/] [http://example.com/:title] # auto retrieving from url [http://example.com/:title=Foobar] [http://example.com/:barcode] # show qrcode with google chart API
[]http://example.com/[]
Perl((most famous light weight language))
is converted to
Perl<a href="#fn1">*1</a>
and footnote object is available in inline object, so you will do expand it like following:
my $thx = Text::Xatena->new; my $inline = Text::Xatena::Inline->new; $thx->inline($inline); my $formatted = $thx->format('aaa((foobar)) bbb((barbaz))'); my $out = ''; $out .= '<div class="body">'; $out .= $formatted; $out .= '</div>'; $out .= '<div class="notes">'; for my $footnote (@{ $inline->footnotes }) { $out .= sprintf('<div class="footnote" id="#fn%d">*%d: %s</div>', $footnote->{number}, $footnote->{number}, $footnote->{note}, ); } $out .= '</div>';
Some default behaviors of Xatena syntax are different from Hatena::Diary syntax.
Big differences:
<hn
<div class="section"
But Xatena supports Hatena::Diary compatible mode, you can change the behavior with a option.
my $thx = Text::Xatena->new(hatena_compatible => 1);
If you want to customize HTML, you can specify templates in Text::Xatena#new. This is interpreted as Text::MicroTemplate.
You should reuse Text::Xatena object for performance.
my $thx = Text::Xatena->new( templates => { 'Section' => q[ <section class="level-{{= $level }}"> <h1>{{= $title }}</h1> {{= $content }} </section> ], } );
cho45 <cho45@lowreal.net>
Text::Hatena
http://hatenadiary.g.hatena.ne.jp/keyword/%E3%81%AF%E3%81%A6%E3%81%AA%E8%A8%98%E6%B3%95%E4%B8%80%E8%A6%A7>
This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
To install Text::Xatena, copy and paste the appropriate command in to your terminal.
cpanm
cpanm Text::Xatena
CPAN shell
perl -MCPAN -e shell install Text::Xatena
For more information on module installation, please visit the detailed CPAN module installation guide.