简单几行代码实现WordPress支持plantuml

由于目前 PHP 操作 DOM 生成 HTMl 还没找到好办法,因此,我只是在内容末尾添加并生成 plantuml。

代码实现

代码如下:

// plantuml相关函数
//function appendHTML(DOMNode $parent, $source) {
//  $tmpDoc = new DOMDocument();
//  $tmpDoc->loadHTML($source);
//  foreach ($tmpDoc->getElementsByTagName('body')->item(0)->childNodes as $node) {
//      $node = $parent->ownerDocument->importNode($node, true);
//      $parent->appendChild($node);
//  }
//}

function encodep($text) {
    $data = utf8_encode($text);
    $compressed = gzdeflate($data, 9);
    return encode64($compressed);
}

function encode6bit($b) {
    if ($b < 10) {
        return chr(48 + $b);
    }
    $b -= 10;
    if ($b < 26) {
        return chr(65 + $b);
    }
    $b -= 26;
    if ($b < 26) {
        return chr(97 + $b);
    }
    $b -= 26;
    if ($b == 0) {
        return '-';
    }
    if ($b == 1) {
        return '_';
    }
    return '?';
}

function append3bytes($b1, $b2, $b3) {
    $c1 = $b1 >> 2;
    $c2 = (($b1 & 0x3) << 4) | ($b2 >> 4);
    $c3 = (($b2 & 0xF) << 2) | ($b3 >> 6);
    $c4 = $b3 & 0x3F;
    $r = "";
    $r .= encode6bit($c1 & 0x3F);
    $r .= encode6bit($c2 & 0x3F);
    $r .= encode6bit($c3 & 0x3F);
    $r .= encode6bit($c4 & 0x3F);
    return $r;
}

function encode64($c) {
    $str = "";
    $len = strlen($c);
    for ($i = 0; $i < $len; $i+=3) {
        if ($i+2==$len) {
            $str .= append3bytes(ord(substr($c, $i, 1)), ord(substr($c, $i+1, 1)), 0);
        } else if ($i+1==$len) {
            $str .= append3bytes(ord(substr($c, $i, 1)), 0, 0);
        } else {
            $str .= append3bytes(ord(substr($c, $i, 1)), ord(substr($c, $i+1, 1)),
                ord(substr($c, $i+2, 1)));
        }
    }
    return $str;
}

// plantuml
add_filter( 'the_content', function ( $content ) {
    // print_r('<pre><code>' . base64_encode($content) . '</code></pre>');

    $dom = new DOMDocument;
    $dom->loadHTML( $content );
    $xpath = new DOMXPath( $dom );

    $uml_str = "";
    $idx     = 0;

    foreach ( $xpath->query( "//code[@class='plantuml']" ) as $section ) {
        $base64_uml= "SoWkIImgAStDuNBEIImkDZ1KiAdHrLM0S8oWWiOAMd0n4wYOgK8-NCmCAcQkeAS75RA02bagm5GP6d0vfEQb0Aq20000";

        // search for sub nodes inside each element
        $base64_uml = encodep($section->nodeValue);
        // var_dump( $section->nodeValue );

        $plantuml_img = "http://www.plantuml.com/plantuml/png/" . $base64_uml;
        $current_uml  = '<p>' . $idx . '.<a href="' . $plantuml_img . '" target="_blank"><img src="' . $plantuml_img . '" /></a></p>';
        $uml_str      = $uml_str . $current_uml;
        $idx ++;
    }

    if($uml_str != ""){
        $uml_str = '' . $uml_str;
    }

    return $content . $uml_str;
} );

查看效果

/mybatis-s-annotation-achieves-complex-mapping-development-z1l39xe.html

@startuml

!include https://unpkg.com/plantuml-style-c4@latest/core.puml
' uncomment the following line and comment the first to use locally
'!include core.puml

left to right direction

class sys_role {
   rolename: varchar(255)
   roleDesc: varchar(255)
   id: int(11)
}
class sys_user_role {
   userid: int(11)
   roleid: int(11)
}
class user {
   username: varchar(50)
   password: varchar(50)
   birthday: varchar(50)
   id: int(11)
}

sys_user_role  -[#595959,plain]-^  sys_role      : "roleid:id"
sys_user_role  -[#595959,plain]-^  user          : "userid:id"
@enduml

这里是正文中的plantuml图表

0.图片[1]-简单几行代码实现WordPress支持plantuml-浅海拾贝

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容