[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[技术讨论] 代码高亮 以及 Markdown 风格转 BBCode

语法高亮按标题级别缩进

Perl 转换代码(然并卵)
配合 Highlight Code Converter : our $highlight = 'D:/Lib/highlight-3.36-x64/highlight.exe';
Markdown 稿件
转换效果:[连载]Perl 一句话代码示例 翻译+整理 - Chapter 2. 换行和间隔符

      1. =info
      2.     Markdown 部分格式转 BBCode + 代码块着色
      3.     523066680@163.com / Code-By.Org
      4.     2017-05
      5.     V2.0 更新循环方案
      6. =cut
      7. use strict;
      8. use Encode;
      9. use IO::Handle(1);
      10. STDOUT->autoflush(1);
      11. our $highlight = 'D:/Lib/highlight-3.36-x64/highlight.exe';
      12. my $file = encode('gbk', decode('utf8', "D:/Sync/Perl/教学翻译、整理/Perl One-Liners.md"));
      13. #my $file = encode('gbk', decode('utf8', "sample.md"));
      14. my @arr;
      15. load($file, \@arr);
      16. our @sizes = ( 2,3,4,5,6,7,8 );   #标题字体大小
      17. reset_sizes( \@sizes, \@arr );   #根据实际层级重设列表
      18. format_bbcode(\@arr);            #转论坛格式
      19. my $all = join("\n", @arr);
      20. our $table = '[list][table=60%, #f8f8f8][tr][td][font=consolas][size=2]';
      21. our $table_tail = '[/size][/font][/b][/td][/tr][/table][/list]';
      22. format_codeblock(\$all);
      23. format_inline(\$all);
      24. #bathome 的缩进不够明显,加倍
      25. $all=~s/(\[list\])/$1$1/g;
      26. $all=~s/(\[\/list\])/$1$1/g;
      27. # table 后面不需要再换行
      28. $all=~s{(\Q[/table]\E.*?\n)\n}{$1}sgi;
      29. print encode('gbk', decode("utf8", $all));
      30. sub format_bbcode
      31. {
      32.     my $arr = shift;
      33.     my $prev;
      34.     my $curv;
      35.     my $crlf;
      36.     my $size;
      37.     for my $i ( 0 .. $#$arr )
      38.     {
      39.         $arr->[$i] =~s/(\r?\n)$//;
      40.         $crlf = $1;
      41.         if ( $arr->[$i]=~s/^(#+)// )
      42.         {
      43.             $curv = length($1);
      44.             $size = $sizes[$curv-1]; #下标从 0 开始
      45.             $arr->[$i] = "[size=$size][b]" .$arr->[$i] ."[/b][/size]";
      46.             $arr->[$i] .= "[list]";
      47.             if ( $prev )
      48.             {
      49.                 if ( $curv <= $prev )
      50.                 {
      51.                     $arr->[$i] = "[/list]"x($prev - $curv + 1) .$arr->[$i];
      52.                 }
      53.                 elsif ( $curv > $prev ) { }
      54.             }
      55.             $prev = $curv;
      56.         }
      57.         #遇到下一个标题时添加换行
      58.         if ( $i < $#$arr
      59.             and $arr->[$i+1]=~/^\#/
      60.             and ($arr->[$i] ne "") )
      61.         {
      62.             $arr->[$i] .= "\n";
      63.         }
      64.         #单行代码和代码块前面补充空行
      65.         if ( ($i > 0)
      66.             and ($arr->[$i] =~/^\s*`/)
      67.             and ($arr->[$i-1] ne "")
      68.             and (not $arr->[$i-1]=~/\n$/)
      69.             and (not $arr->[$i-1]=~/\[list\]/)
      70.             )
      71.         {
      72.             $arr->[$i-1] .= "\n";
      73.         }
      74.         format_inline( \$arr->[$i] );
      75.         format_else(\$arr->[$i]);
      76.     }
      77.     #缩进结束
      78.     $arr->[-1] .= '[/list]'x$prev if ( $prev > 0 );
      79. }
      80. sub format_codeblock
      81. {
      82.     our $highlight;
      83.     my $all = shift;
      84.     my $bbcode;
      85.     while ($$all =~/```(\w+)?\r?\n(.*?)\r?\n```/s)
      86.     {
      87.         writeFile( "temp.txt", \$2 );
      88.         if (defined $1)
      89.         { `$highlight -K3 -S$1 -OBBCode --no-trailing-nl -ssourceforge ./temp.txt -o bbcode.txt`; }
      90.         else
      91.         { `$highlight -K3 -OBBCode --no-trailing-nl -ssourceforge ./temp.txt -o bbcode.txt`; }
      92.         read_slurp( "bbcode.txt", \$bbcode );
      93.         $bbcode = $table .'[font=consolas]' .$bbcode .'[/font]' .$table_tail;
      94.         $$all =~s/```(\w+)?\r?\n(.*?)```/$bbcode/s;
      95.     }
      96. }
      97. sub format_inline
      98. {
      99.     our $highlight;
      100.     my $line = shift;
      101.     my ($head, $tail ) = ('[font=consolas][b]', '[/b][/font]');
      102.     my $inline_code;
      103.     if ($$line=~/^\s*`[^"]+("|')(.+)("|')/)
      104.     {
      105.         writeFile( "temp.txt", \$2 );
      106.         `$highlight -K3 -Sperl -OBBCode --no-trailing-nl -ssourceforge ./temp.txt -o bbcode.txt`;
      107.         read_slurp( "bbcode.txt", \$inline_code );
      108.         $$line=~s/^\s*`([^"]+)("|')(.+)("|')(.*)`/$head$1$2${inline_code}$4$5${tail}/;
      109.     }
      110. }
      111. sub format_else
      112. {
      113.     my $line = shift;
      114.     #粗体
      115.     $$line=~s/\*{2}(.*?)\*{2}/\[b\]$1\[\/b\]/g;
      116.     #斜体
      117.     $$line=~s/\*(.*?)\*/\[i\]$1\[\/i\]/g;
      118.     #链接
      119.     $$line=~s/\[([^\]]+)\]\((.*?)\)/\[url=$2\]$1\[\/url\]/g;
      120. }
      121. sub reset_sizes
      122. {
      123.     my ($sizes, $arr) = @_;
      124.     my $max = 0;
      125.     grep { /^(#+)/; $max = length($1) if (length($1) > $max) } @$arr;
      126.     @$sizes = reverse @{$sizes}[ 0 .. $max-1 ];
      127. }
      128. sub writeFile
      129. {
      130.     my ($f, $ref) = @_;
      131.     open WRT, ">:raw", $f or warn "$!";
      132.     print WRT $$ref;
      133.     close WRT;
      134. }
      135. sub read_slurp
      136. {
      137.     my ($f, $ref) = @_;
      138.     local $/ = undef;
      139.     open READ,"<:raw:crlf", $f or warn "$!";
      140.     $$ref = <READ>;
      141.     close READ;
      142. }
      143. sub load
      144. {
      145.     my ($f, $ref) = @_;
      146.     open READ,"<:raw", $f or warn "$!";
      147.     @$ref = <READ>;
      148.     close READ;
      149. }
      复制代码

本帖最后由 CrLf 于 2017-5-9 10:58 编辑

为了能显示 tab 字符,之前已经把 code 部分改用 <pre> 标签了,所以高亮插件未必能用诶
当我没说

TOP

回复 2# CrLf


   其它网站也是用的pre的。应该是可以的。
去学去写去用才有进步。安装python3代码存为xx.py 双击运行或右键用IDLE打开按F5运行

TOP

我只需要支持markdown。
高亮可以没有。
去学去写去用才有进步。安装python3代码存为xx.py 双击运行或右键用IDLE打开按F5运行

TOP

本帖最后由 523066680 于 2017-5-9 22:52 编辑

发现 有个 perltidy工具可以直接将代码转换为语法高亮的HTML,再写个脚本转BBCODE,效果不错,但 perltidy 只适合 Perl:

use v5.5;
# & test <> " ?
sub binary
{
    my $n = shift;
    return $n if $n == 0 || $n == 1;
    my $k = int($n / 2);
    my $b = $n % 2;
    my $E = binary($k);
    return $E . $b;
}
print binary(5);
[Finished in 0.3s]

TOP

test

@echo off
echo Hollo,world
Pause >NUL

TOP

Highlight Code Converter 使用示例

本帖最后由 523066680 于 2017-5-12 10:55 编辑

部分参数
  1. -I, --include-style      在HTML文件中保留CSS样式表(不生成CSS文件)
  2. -k, --font=<font>        设置字体
  3. -K, --font-size=<num?>   设置字号
  4. -l, --line-numbers       带行号
  5. -m, --line-number-start=<cnt>   行号起始值
  6. -s, --style=<style>       指定字体
  7. -t, --replace-tabs=<num>  将 tab 替换为指定数量的空格
  8. -u, --encoding=<enc>      指定输入输出的编码类型
  9. --inline-css              将 css style 属性嵌入 <span> 标签,而不是独立列出
复制代码
示例:
  1. highlight -K2 -Sperl -OBBCode -ssourceforge ./temp.pl -o BBCode.txt
复制代码

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

my @order = func( 1 );
permute([qw/a b c d e f/], \@order);

sub func
{
    my $n = shift;
    my $div = 1;
    my @odo;
    while ( $n != 0 )
    {
        $mod = $n % $div;
        $n = int($n/$div);
        unshift @odo, $mod;
        $div++;
    }
    return @odo;
}

sub permute
{
    my ($ele, $ord) = @_;
    my $get;
    my @result;
   
    for my $idx ( @$ord )
    {
        $get = splice( @$ele, $idx, 1 );
        push @result, $get;
    }

    while ( @$ele )
    {
        push @result, shift @$ele;
    }

    print @result;
}

TOP

根据 title 级别生成不同层次的缩进(markdown 中的title)

根据 title 级别生成不同层次的缩进(markdown 中的title)
#T1
abc
##T20
abc
##T21
def
###T3
abc
abc
#T1
test
##T2
abc
#T1
abc



T1

      abc

      T20

          abc

      T21

          def

          T3

              abc
              abc

T1

      test

      T2

          abc

T1

      abc
[Finished in 0.1s]

[attach]10623[/attach]
[attach]10624[/attach]
1

评分人数

TOP

看不懂看不懂。再见。
去学去写去用才有进步。安装python3代码存为xx.py 双击运行或右键用IDLE打开按F5运行

TOP

回复 9# codegay


    Posting Topics That Nobody Else Can Read.

TOP

本帖最后由 老刘1号 于 2017-6-1 19:41 编辑

自己写了个小工具,效果不怎么样……
测试(蜜汁高亮):http://www.bathome.net/thread-43845-1-1.html
感觉应该限定单词边界……现在是直接关键字套标签.
BUG多多……

TOP

回复 11# 老刘1号


    应设置等宽字体
  1. [font=consolas][/font]
复制代码

TOP

回复 12# 523066680


    加上感觉怪怪的

TOP

返回列表