[Perl]Markdown 标题按级别转论坛缩进 (BBCode)

There's more than one way to do it!
https://metacpan.org http://perlmonks.org
回复
头像
523066680
Administrator
Administrator
帖子: 573
注册时间: 2016年07月19日 12:14
联系:

[Perl]Markdown 标题按级别转论坛缩进 (BBCode)

帖子 523066680 »

=info
Markdown Title 分级缩进,生成 BBCode
523066680@163.com / Code-By.Org
2017-05-12
=cut

use Encode;
use IO::Handle(1);
STDOUT->autoflush(1);

my @arr;
load("src.md", \@arr);

our @sizes = ( 100, 120, 140, 160, 180, 200 );
reset_sizes( \@sizes, \@arr ); #根据实际层级重设列表
format_title(\@arr); #转论坛格式

my $all = join("\n", @arr);
print encode('gbk', decode("utf8", $all));

sub format_title
{
my $arr = shift;
my $prev;
my $curv;
my $crlf;

for my $i ( 0 .. $#$arr )
{
$arr->[$i] =~s/(\r?\n)$//;
$crlf = $1;
if ( $arr->[$i]=~s/^(#+)// )
{
$curv = length($1);
$size = $sizes[$curv-1]; #下标从 0 开始
$arr->[$i] = "[size=$size][b]" .$arr->[$i] ."[/b][/size]";
$arr->[$i] .= "[list]";

if ( $prev )
{
if ( $curv <= $prev )
{
$arr->[$i] = "[/list]"x($prev - $curv + 1) .$arr->[$i];
}
elsif ( $curv > $prev ) { }
}

$prev = $curv;
}

# #遇到下一个标题时添加换行
# if ( $i < $#$arr
# and $arr->[$i+1]=~/^\#/
# and (not $arr->[$i] =~/^$/) )
# {
# $arr->[$i] .= $crlf;
# }
}

#缩进结束
$arr->[-1] .= '[/list]'x$prev if ( $prev > 0 );
}

sub reset_sizes
{
my ($sizes, $arr) = @_;
my $max = 0;
grep { /^(#+)/; $max = length($1) if (length($1) > $max) } @$arr;
@$sizes = reverse @{$sizes}[ 0 .. $max-1 ];
}

sub load
{
my ($f, $ref) = @_;
local $/=undef;
open READ,"<:", $f or warn "$!";
@$ref = <READ>;
close READ;
}
原文:
#T1
abc
##T20
abc
##T21
def
###T3
abc
abc
#T1
test
##T2
abc
#T1
abc
生成:
[size=140][b]T1[/b][/size][list]
abc
[size=120][b]T20[/b][/size][list]
abc
[/list][size=120][b]T21[/b][/size][list]
def
[size=100][b]T3[/b][/size][list]
abc
abc
[/list][/list][/list][size=140][b]T1[/b][/size][list]
test
[size=120][b]T2[/b][/size][list]
abc
[/list][/list][size=140][b]T1[/b][/size][list]
abc[/list][Finished in 0.1s]
效果:
T1
  • abc
    T20
    • abc
    T21
    • def
      T3
      • abc
        abc
T1
  • test
    T2
    • abc
T1
  • abc
[Finished in 0.1s]
回复

在线用户

正浏览此版面之用户: 没有注册用户 和 0 访客