简易文章手写格式及其PHP转换器
 
普通的段落用换行符分隔, 换行的时候自然分段.
 
"以双引号开头的内容表示blockquote, 双引号内可以换行,
这里仍然是blockquote, 结尾的此时结尾的双引号必须在行首
"
 
 
>以右尖括号开始的是列表项目
>这是第二项
>第三项
 
如果是图片的话有两种情况, 一种是在单独的一行给出文件名
 
picture.jpg
 
或者是给图片加一段说明
 
picturexx.jpg:这是说明,如果是IE或者FF就可看到
 
[中括号开始的是二级标题]
 
还可以插入源代码格式如下
 
code:cpp
#include <stdio.h>
 
int main () {
    printf("hello");
    return 0;
}
 code:end
 
注意code:end前面应该顶格, 不要留空格, 此处是为了防止递归解析而故意加的空格. 因为本段说明也是位于一个code段中, 而目前这个格式不支持嵌套.

那么转换之后会是下面的样子

===================================================

普通的段落用换行符分隔, 换行的时候自然分段.

以双引号开头的内容表示blockquote, 双引号内可以换行, 这里仍然是blockquote, 结尾的此时结尾的双引号必须在行首
  • 以右尖括号开始的是列表项目
  • 这是第二项
  • 第三项

如果是图片的话有两种情况, 一种是在单独的一行给出文件名

或者是给图片加一段说明

这是说明,如果是IE或者FF就可看到

中括号开始的是二级标题

还可以插入源代码格式如下

 
#include <stdio.h>
 
int main () {
    printf("hello");
    return 0;
}
 

注意code:end前面应该顶格, 不要留空格, 此处是为了防止递归解析而故意加的空格. 因为本段说明也是位于一个code段中, 而目前这个格式不支持嵌套.

===================================================

下面是用于转换的PHP代码, 主要用正则表达式实现, 因此还无法处理嵌套.

 
    function translate( $file ) {
        $output = '';
        while(  $this->getLine($file , $output) != 0) {
        }    
        return $output;
    }
 
    function getLine( &$file , &$output) {
 
        $ret = preg_match("/^[\\s\\S]*?\n/i" , $file, $matches  , PREG_OFFSET_CAPTURE);
        if ( $ret != 0 ) {
 
            $needdelete = $matches[0][0]; // default
            if ( preg_match("/^\".*/i", $matches[0][0] , $submatches ) ) {
                if ( preg_match("/(^\"([\\s\\S]*?)\"\r?\n)[\\s\\S]*/i" , $file , $submatches ) ) {
 
                    $output .= '<blockquote class="quote">' . "\n";
                    $output .= $submatches[2];
                    $output .= '</blockquote>' . "\n";
 
                    $needdelete =  $submatches[1];
                }
 
            } else if ( preg_match("/(^\[(.*?)\][\r]\n)/i", $matches[0][0] , $submatches ) ) {
 
                $output .= '<h3>';
                $output .= $submatches[2];
                $output .= '</h3>' . "\n";
 
                $needdelete = $submatches[1];
            } else if ( preg_match("/(^[\\s\\S]*?\.(png|jpg|jpeg|gif|rar|flv|mp3|wma|wmv|rmvb|zip|avi|mpg|mp4|mov|rmvb)):?([\\s\\S]*?)[\r][\n]/i", $matches[0][0] , $submatches ) ) {
 
                $output .= '<p><img src="/images/';
                $output .= $submatches[1];
                $output .= '" alt="';
                $output .= isset($submatches[3]) ? $submatches[3] : '';
                $output .= '"/></p>' . "\n";
            } else if (preg_match("/^>.*/i", $matches[0][0] , $submatches ) ) {
                $output .= '<ul>';
 
                while ( preg_match("/(^>([\\s\\S]*?)\n)[^\\s][\\s\\S]*/i" , $file , $submatches) ) {
 
                    $output .= "\n" . '<li>';
                    $output .= $submatches[2];
                    $output .= '</li>' . "\n";
 
                    $rip = $submatches[1];
                    $file = substr( $file,  strlen( $rip ) , strlen( $file ) - strlen( $rip ) );
 
                }
 
                $output .= '</ul>';                
                $needdelete = '';
 
            } else if ( preg_match("/^code:[a-z]*?[\\S\\s]*/i" , $matches[0][0] , $submatches)  ) {
 
                if ( preg_match("/(^code:([a-z]*?[\\s])([\\s\\S]*?)\ncode:end)[\\s\\S]*/i" , $file , $submatches) ) {
                    require_once('geshi.php');
 
                    $format = $submatches[2];
                    $code = $submatches[3];
                    $code = str_replace("\t" , "    " , $code);
                    $geshi = new GeSHi( $code , $format );
 
                    $output .= '<div class="codediv">';
                    $output .= $geshi->parse_code() ;
                    $output .= '</div>';
                    $needdelete = $submatches[1];
                }
            } else {
 
                if ( preg_match( "/^[\\S][\\S\\s]*/i", $matches[0][0] ) )
                    $output .= '<p>' . str_replace(array("\r", "\n") , '' , $matches[0][0] ). '</p>';
            }
 
            $file = substr( $file,  strlen( $needdelete ) , strlen( $file ) - strlen( $needdelete ) );
        }
        return $ret;
    }