PS: 进后台及时关掉评论脚本。终于消停。
]]> ]]>简单研究了下,老VC一样解决。。
]]> 解决办法。 资源24
的XML
文件加入以下代码:
xml <application
xmlns="urn:schemas-microsoft-com:asm.v3">
<windowsSettings>
<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
</windowsSettings>
</application>
重新编译,问题解决。
]]>老机器,Mate20 机器。 不是首发机器,申请了内测。 很快通过。 2.4G的软件包,说大不大,说小不小。
完成后眼前一亮,完美的保留了原来的操作习惯。居然感觉比原来的系统快了?
简单测试了几下,上滑卡片好评,文件夹显示成缩略图好评。
分析了逻辑关系, 华为通过方舟编译器做中间层,(即时)编译安卓APP 获得比原生安卓更好的运行效率。
下了开源代码,简单的分析了框架,貌似框架(至少是目前)比原生安卓的框架要好,至少管理弹窗方面。 微内核不同于安卓的宏内核,只有部分程序可以工作的底层,这思路对于权限管理好太多。
嗯,超级终端也好评。试了试一碰传多屏互动,和原来似乎没有区别。。
畅连功能貌似可以传文件了,和同事测试下,2.2G的电影 5分传完,这走的同一个wifi。 比微信和企业微信好多了(一是慢,二是由容量限制)。
PS: 老了,不参与口水战,但是至于啥啥啥套壳论建议可以忽视了,谷歌的法务从来不是食草动物。。 对于末端用户,好用,足矣。
期待发展,期待生态完善,借用安卓生态是个好的创意,但是不应该作为长期目标。
附图片几张:
话说,记得自己生日的永远是父母。
借2年没有发博的博客悄悄给自己祝贺一下。
人在冀中,出差3月有余。
这注定是个孤独的生日。
另外。今日收到20周年的大学同学相册,只是家人代收。 也算生日礼物?
最近有点上火,口腔溃疡,啥都吃不了。
Over.
]]>这配置,普通文秘办公胜任,画图狗嘛,至少8G RAM +SSD。就别指望这个了。
今年双11,京东貌似力度挺大。每天可以领红包到11号(每天三次),红包可以累计使用。
据说有人可以领66元,但是我每次都是2毛。哈哈。
]]>话说,前两天在淘宝上看到十多块还包邮三张的自贴画,心动,购买之。 回来后是三张仿国画的自粘画,质量马马虎虎。见下图。 想了想,用它给家里的配电箱美化一下吧。。
耗时2天空闲时间。。
流水如下:
1. 第一日:先白色自喷漆翻新配电箱。。营造相框的感觉。。没有拍照,因为太乱了,也没有想到拍照。等待油漆自然晾干
2. 第二日: 裁一块自贴画的下半身,山水的那张(太大,只需要1半),拆掉锁具,开始执行贴膜技术。。。。
3. 开洞,装回锁具。
===
结果,家里又多了 2.5 张 自贴画。。
数周前,3dg12 那里终于有货了。入手,改造。 目标: 蓝牙,2.4G无线双模,锂电池充电,小红点正常能用。。。 记录如下。
到此应该算结束了。 但是指示灯看不见。。准备引出, 下面是大神主板的指示灯,测量了一下,既不共阴,也不共阳。。。呃。。。
找块洞洞板,焊接0603 LED,话说,0603 真小,忽略掉我的渣渣焊工,能用就好。。
合体。 最后,指示灯卡在了C壳和D壳的缝隙中。。。 我的 C壳有变形。 请忽略。。
另外,找了一段旧的手机充电线,引出充电口。没有拍照,也就这样了。懒啊。
最后,补上模块购买记录, 主板(含电池) 70 + 转接口 15 + 接收器(可选,不配的话只能蓝牙,选这个可以2.4G无线) 25 元。
-EOF-
]]>近两年没有写BLOG了。 生活的重心貌似随着年龄渐渐偏移到其他地方。 但是,Blog 依然挂再网上,也依然续费保存。
前天,某好友发邮件问:你的blog换地址了? 我一脸懵圈。。。
上百度,去掉 Easun.org 直接用 "- Easun's Personal Portal,Talk about Movable Type,Perl in China,Softwares and Journals" 标题来搜,首页的第一个第二个均为李鬼。 打开一看,界面一模一样。 抓图: 甚至,某个网站(kcpon)因为还备案了,有公司背景,堂而皇之的进入了"企查查"? 打开抓图(只抓了一个):
== 真的是哭笑不得。 小破博客也要克隆? 发出来,看这篇文章会不会也会同步到盗版上去?
]]>从 1.0 升级到 1.1 ,一直是白屏,啥都不显示。。 研究了一下,暂时改名config.inc.php,执行 install.cgi ,这下,错误提示出来了:
codePHP Parse error: syntax error, unexpected '[', expecting ')' in /www/html/install.php on line 242
嗯。明白了。 系统的 php 版本太低。。。 一定要大于 5.4 ... 升级 php 版本到5.5。 重启服务器,改回config.inc.php。成功进后台,升级成功。
]]>eval
可以捕获异常。 至少我是这样用的: 用来尝试运行一些操作,要是出错了也不会退出。
比如我经常用 Image::Info
来判断一个图像文件是否真的是图像,但是服务器上是否有 Image::Info
是个问题。 简单概念代码如下:
code eval("use Image::Info qw(image_info);");
if ($@ eq "")
{
my $info = image_info("$tmpfilename");
if ($info->{error} eq "Unrecognized file format"){
$esB::base->error("该文件不是合法的图片文件。");
}
}
由于 eval
的存在, 如果系统没有 Image::Info
,那么简单的跳过判断,并不影响程序的继续执行。。
直到有一天, 我决定用 $SIG{__DIE__}
来自定义程序的的出错信息。 一样,概念代码如下
code $SIG{__DIE__} = \&esb_die;
sub esb_die {
my $error = shift;
$error =~ s!$ENV{'DOCUMENT_ROOT'}!/{you_root_dir}/!i;
my ($msg, $path) = split " at ",$error;
print "Content-type: text/html\n\n";
print qq~
<html>
<head><title>Easun CGI Error</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" >
</head>
<body >
<font size='6' color='#333366'>Easun CGI Error</font>
<hr size='1' color='#000000' noshade>
<font size='3' color='#00000'>
很抱歉,程式因为以下错误而异常退出:
<br><br><b>$msg</b><br><br>错误大概发生在: <font color='#000099'>$path</font><br><br>
<font size='3' color='#990000'><b>请注意,为了保证您的安全,您的程序的真实路径已经被程式自动过滤。</b></font>
</font>
</body></html> ~;
exit();
}
该操作也达到预期目的。
但是,当这两者同时运行时,$SIG{__DIE__}
居然捕获到了 eval
内的 $@
。当系统没有找到Image::Info
时候,程序不再默默跳过继续执行。而是直接跳出到自定义错误页面。
信息如下
很抱歉,程式因为以下错误而异常退出: Can't locate Image/Info.pm in @INC (you may need to install the Image::Info module) (@INC contains: ./config ./ShareLib ./ D:/usr/site/lib D:/usr/lib .) 错误大概发生在: (eval 10) line 1.
如何协调这两者,是个问题。。。
记录下来,作为备忘。
]]>终于下决心,切换到了Vultr 的 美国 New Jersey 服务器。
也许能稳定一点。
]]>记录下来,以免忘记,其中 editer
的 ID 为 document.FORM.inpost
代码如下:
]]> code/* - esBObj.editer = 编辑器,UBB支持 + 简单 ajax 上传 By 路杨 - */
var editer = esBObj.editer || function(w, d) {
var canFormat = 0;
var config ={
ubb: true, /*使用UBB还是HTML*/
is_binOK:false,
em_no: 26,
ua_no: 37
};
var b ={
checkFormat : function(){
if (canFormat) return;
if (document.selection || (typeof(document.createElement("textarea")["setSelectionRange"]) != "undefined"))
canFormat = 1;
},
getSelected : function getSelected () {
var e= document.FORM.inpost;
if (document.selection) {
e.focus();
var range = document.selection.createRange();
return range.text;
} else {
var length = e.textLength;
var start = e.selectionStart;
var end = e.selectionEnd;
if (end == 1 || end == 2 && length != undefined) end = length;
return e.value.substring(start, end);
}
},
setSelection : function (v) {
var e= document.FORM.inpost;
if (document.selection) {
e.focus();
var range = document.selection.createRange();
range.text = v;
} else {
var length = e.textLength;
var start = e.selectionStart;
var end = e.selectionEnd;
if (end == 1 || end == 2 && length != undefined) end = length;
e.value = e.value.substring(0, start) + v + e.value.substr(end, length);
e.selectionStart = start + v.length;
e.selectionEnd = start + v.length;
}
e.focus();
},
formatStr: function(v){
if (!canFormat) return;
var str = b.getSelected();
if (str) {
if( config.ubb ) b.setSelection('[' + v + ']' + str + '[/' + v + ']');
else b.setSelection('<' + v + '>' + str + '</' + v + '>');
}
return false;
}
};
var e ={
init:function(){
b.checkFormat();
e.bin_actions();
}
,bin_actions : function(){
if ( config.is_binOK) return;
$("body").on("click","a.formatting-icons, span.formatting-icons", e.ubb)
.on("click","a.upload-bar, span.upload-bar", e.insertUpfile)
.on("click","a.bt.smilie,img.bt.smilie,span.bt.smilie", e.emot)
.on("click","a.addquote,img.addquote,span.addquote", e.addquote)
.on("click","input#upload", e.do_upload)
.on("click","a.del-upload,span.del-upload", e.del_upload)
.on("click","a.load-upload,span.load-upload", e.load_upload)
;
config.is_binOK =true;
}, /*END _init*/
del_upload : function() { /*删除所有未发布的上传文件*/
if ( confirm('确定删除所有未被发布的附件临时文件么?') )
{
$("#imgWait").show();
util.get_esb_jsonp("delup", 'delup_out', { 'js' : 1 } );
}
},
delup_out: function(data) {
$("#imgWait").hide();
if (data.status == "true") {
$("#showupfile").html("");
alert("你已经上传的,但还尚未发布的附件临时文件已经全部删除。");
}
else {alert("删除失败!");}
},
load_upload : function() { /*重新加载所有未发布的上传文件到列表*/
$("#imgWait").show();
util.get_esb_jsonp("load_oldupfile", 'loadupfileout', { 'js' : 1 } );
},
loadupfileout: function(data) {
$("#imgWait").hide();
if (data.status == "true") {
alert("你已经上传的,但还尚未发布的附件临时文件已经加载到当前页面。");
}
else {alert("加载失败!");}
},
do_upload : function() { /*上传文件处理*/
$("#imgWait").show();
var formData = new FormData();
formData.append("action", "doupfile");
formData.append("addme", document.getElementById("file1").files[0]);
$.ajax({
url: w.esBConfig.cgi_url +'upfile2.cgi',
//url: "xs.html",
type: "POST",
data: formData,
/**
*必须false才会自动加上正确的Content-Type
*/
contentType: false,
/**
* 必须false才会避开jQuery对 formdata 的默认处理
* XMLHttpRequest会对 formdata 进行正确的处理
*/
processData: false,
dataType : 'json',
success: function (data) {
console.log(data);
if (data.status == "true") {
/* alert("上传成功!"); */
e.addit2span(data);
e.insertUpfile(data.path,'once');
}
if (data.status == "error") {
alert(data.msg);
}
$("#imgWait").hide();
$("#file1").replaceWith($("#file1").val('').clone(true));
},
error: function () {
alert("上传失败!");
$("#imgWait").hide();
}
});
},
addit2span : function (data)
{
var $Once = '';
if (data.once != "true" ) data.once="false" ;
var addit2span =
'<div id="' + data.id +'" data-name="'+ data.path+'">附件: ' +data.name
+ '[<span class="upload-bar link" data-name="'+ data.path+'" data-type ="' +data.type + '" data-once="' + data.once + '">再次插入帖子</span>]</div>';
var $el=$("#showupfile").find("div#"+data.id);
if (!$el.length)$(addit2span).appendTo($("#showupfile"));
},
ubb:function () {
var type= $(this).attr("data-ubb");
if ( ! type ) return;
if (type == 'link') return e.insertLink(0);
if (type == 'email') return e.insertLink(1);
if (type == 'decode') return e.Decode();
return b.formatStr(type);
},
insertLink:function ( isMail) {
if (!canFormat) return;
var str = b.getSelected();
var link = '';
if (!isMail) {
if (str.match(/^https?:/)) {
link = str;
} else if (str.match(/^(\w+\.)+\w{2,5}\/?/)) {
link = 'http://' + str;
} else if (str.match(/ /)) {
link = 'http://';
} else {
link = 'http://' + str;
}
} else {
if (str.match(/@/)) {
link = str;
}
}
var my_link = prompt(isMail ? '输入 Email 地址:' : '输入 URL: ', link);
if (my_link != null) {
if (str == '') str = my_link;
if (isMail) my_link = 'mailto:' + my_link;
if( config.ubb ) b.setSelection( '[url="' + my_link + '"]' + str + '[/url]');
else b.setSelection( '<a href="' + my_link + '">' + str + '</a>');
}
return false;
},
Decode: function () {
if (!canFormat) return;
var str = b.getSelected();
if (!str) return;
str = str.replace(new RegExp("&","g"), "&");
str = str.replace(new RegExp("<","g"), "<");
str = str.replace(new RegExp(">","g"), ">");
str = str.replace(new RegExp('"',"g"), """);
/* str = str.replace(new RegExp(' ',"g"), " "); */
b.setSelection(str);
return false;
},
emot:function () {
if (!canFormat) return;
var group= $(this).attr("data-group") || 'em';
var id= $(this).attr("data-emot");
if ( ! id ) return;
/* var str = getSelected(e); */
b.setSelection(' :'+ group + id + ': ');
return false;
},
/***重新插入上传文件的代码**********************/
insertUpfile : function (name,once) {
if (!canFormat) return;
if( typeof(name) != 'string') name = $(this).attr("data-name");
if(!name) return;
if( typeof(once) != 'string') once = $(this).attr("data-once"); /*data-once="true" */
if (once =='once') { once ='true';}
var str = ' [UploadFile=';
if (once =='true') str = ' [UploadOnce=';
b.setSelection(str + name + '] ');
return false;
},
NewUbbico : function(span) {
if (!span) span='ubb_span';
var el = $('#'+span);
if (el.length == 0) return false;
el.html( e.getUbbicoHTML() );
},
getUbbicoHTML: function () {
util.Load_css("https://static.easunlee.cn/css/formatting-icons.css");
var str ='';
str = '<span class="formatting-icons bold" title="粗体" data-ubb="b" ></span>';
str += '<span class="formatting-icons italic" title="斜体" data-ubb="i" ></span>';
str += '<span class="formatting-icons underline" title="下划线" data-ubb="u"></span>';
str += '<span class="formatting-icons link" title="插入链接" data-ubb="link" ></span>';
str += '<span class="formatting-icons email" title="插入 Email 链接" data-ubb="email" ></span>';
str += '<span class="formatting-icons quote" title="引用" data-ubb="quote"></span>';
str += '<span class="formatting-icons decode" title="HTML编码" data-ubb="decode"></span>';
return str;
},
NewEmot :function (span) {
if (!span) span='emot_span';
var el = $('#'+span);
if (el.length == 0) return false;
el.html( e.getEmotHTML() );
},
getEmotHTML : function () {
var str ='';
var i=1;
var name =1;
for ( i=1;i<( config.em_no +1) ;i++)
{
name = (i>=10) ?i :'0'+i ;
str += '<img class="bt smilie" src="'+esBConfig.static_url+'emot/em' +name +'.gif" data-emot="'+ name+'" data-group="em" />';
}
for ( i=1;i<( config.ua_no +1); i++)
{
name = (i>=10) ?i :'0'+i ;
str += '<img class="bt smilie" src="'+esBConfig.static_url+'emot/ua' +name +'.gif" data-emot="'+ name+'" data-group="ua" />';
}
return str;
},
addquote : function(no)
{
if (!canFormat) return;
if( typeof(no) != 'number') no = $(this).attr("data-no");
if ( typeof(no) != 'number' ) return;
var membername = $("#membername"+no).text();
var postdate = $("#postdate"+no).text();
var post = $("#post"+no).html();
var regx = /^\<blockquote\>.*\<\/blockquote\>/;
post = post.replace(regx, "");
var $tmp = $('<span></span>');
$tmp.html(post);
$tmp.find("script").remove();
post =$tmp.text();
post = $.trim(post);
var mysub=function(str,n){
var r=/[^\x00-\xff]/g;
if(str.replace(r,"aa").length<=n){return str;}
var m=Math.floor(n/2);
for(var i=m;i<str.length;i++){
if(str.substr(0,i).replace(r,"aa").length>=n){ return str.substr(0,i)+"\n..."; }
}
return str;
}
/* post =post.substring(0, 200); */
post =mysub(post, 200);
post = $.trim(post);
var text = "[quote][b]下面引用由[u]" + membername + "[/u]在 [i]" + postdate + "[/i] 发表的内容:[/b]\n" + post + "\n[/quote]\n";
b.setSelection(text);
}
};
window.esBObj.editer =e;
return e;
}(window, document);
]]>
因为在吊顶中,需要先拆部分吊顶,钻进去一看, 哇塞。。。。 吊顶内好恐怖的接线。。。
而且, 浴霸是用铁丝挂上去的。没有骨架,晕晕。。当时只顾得拆,没有照太多照片,只有这张,可以明显看出来凌乱。
]]> 这个是拆下来的全图,全金属结构。明显电容鼓包。。。当时以为知道故障原因了。铭牌
拆下来的电容:
网购电容,耗时2天,结果新电容后,发现依然不转,估计电机挂了。。。 于是2天后继续拆。。。。
因为太脏,没有怎么全照片,照片大致如下: 风道(上面是照明灯,已经拆下):
风道背面~~ 好脏
去除风道后准备拆浴霸灯和风机的背面照片:
拆下来的扇叶(已经清洗过了,原来奇脏无比)
继续,正面图,拆掉风道、扇叶和所有的灯具:
拆下来的旧风机:
铭牌:
风机不转,考虑似乎是*温度保险*烧了,想拆开看看,先拆掉螺丝~~~
But 。。。。。 怎么也打不开,上下两篇好像是焊在一起似的。。。。
不亏是品牌电机(乐丰)。 so 。。。。 放弃继续拆电机。。。
决定购买新风机,直接替换。
判断风机正反转,根据扇叶:
我们知道应该是 "顺时针" 转动, 但是查铭牌,居然发现淘宝上和这个铭牌一模一样的原厂机都是 逆时针 ? 晕死。。。
原厂风机价值88,算了,买不起。找个替代的把,找到这个, 话说,可以接线不同正反转? 下单。。。 继续两天,到货:
下面是新风机,明显和旧的比较起来,质量有差距。。。。
新旧风机对比:
新风机铭牌:
测试新机,注意接线
测试结果: 正常。
就这样, 新风机还算卖的比较好的滚珠铜机, 价值45元,而非滚珠的才30元。
========
到此, 维修结束,接下来是重新组装重新上吊顶。。。 任务准备放在周末。
感概:
这次自己维修,亏了。。 因为同样的新机器在 JD 才 199.。还不如换一个新的。。。
而本次成本 10+2 (电容+运费) + 45 (电机) + 15 (上次换面板) + 暖灯 (39) = 111 . 自己花的时间还没有计算在内。
sendmail
发邮件的。另外 sendmail
发的邮件通常是被一些邮箱当作 spam
处理的。
所以, 我的 MT
是通过设定 stmp
服务器和用户名、密码认证登陆到 mail.qq.com
发送邮件。 简单配置如下:
config # in mt-config.cgi
EmailAddressMain UserName@QQ.com
MailTransfer smtp
SMTPServer smtp.qq.com
SMTPUser UserName
SMTPPassword MyPassword
SMTPAuth ssl
这个配置可以正常工作。。。
]]> 但是,一段时间后查看日志,发现mt-starman.log
总在不停的增大中,下载下来,发现每次发邮件总会警告:
quote *******************************************************************
Using the default of SSL_verify_mode of SSL_VERIFY_NONE for client
is deprecated! Please set SSL_verify_mode to SSL_VERIFY_PEER
together with SSL_ca_file|SSL_ca_path for verification.
If you really don't want to verify the certificate and keep the
connection open to Man-In-The-Middle attacks please set
SSL_verify_mode explicitly to SSL_VERIFY_NONE in your application.
*******************************************************************
at lib/MT/Mail.pm line 237.
呃,定位发现是Net::SMTP::SSL
模块问题。。。 这个模块太老了。。。。。
搜索了一圈,这个问题很普遍,而且解决办法都五花八门, 但是似乎都是不是很好的解决办法。。。
因为我用的是 MT
的老版本,那么我查查 MT6.x
系列是如何解决的?
查看 MT6.x 的 Mail.pm
(地址: https://github.com/movabletype/movabletype/blob/master/lib/MT/Mail.pm)
我倒~~ MT6.x 居然直接停用了 Net::SMTP::SSL
模块,改用了 Net::SMTPS
模块。 这个并不是我想要的结果。
继续搜索,终于定位到下面两个链接:
豁然大悟,理由如下:
Net::SMTP itself can do the necessary SSL and STARTTLS bits just fine since version 1.28, and Net::SMTP::SSL is now deprecated. Since 1.28 isn't that old yet, keep the old code in place and use it when necessary.
简单的说就是:
Net::SMTP::SSL 模块废弃了。 这个模块是 Net::SMTP 模块的扩展, 现在的 Net::SMTP 模块(版本大于1.28)自行即可处理 SSL 连接。。
那么解决办法很简单了。。。
打开 Mail.pm
,定位 Net::SMTP::SSL
,直接改成 Net::SMTP
,并保证其有参数 SSL => 1
即可。
代码片段如下:
perlelsif ($ssl) {
### By EasunLee Net::SMTP can do ssl well itself ,Net::SMTP::SSL is obsolete, use only when necessary,
$smtp = Net::SMTP->new(
$host,
Port=> $port,
Timeout => 60,
Hello => $localhost,
SSL => 1,
( $MT::DebugMode ? ( Debug => 1 ) : () ),
)
or return $class->error(
MT->translate(
'Error connecting to SMTP server [_1]:[_2]',
$host, $port
)
);
}
详细修改请参考 GitHub。
保存,重启 mt-starman
。 测试发邮件,一切正常,也没有了警告。。
Markdown
写Blog。 代码高亮
后,处理代码显示是个问题。
检查了 MT 自带的 Markdown
解析插件 ( plugins/Markdown/Markdown.pl
) , 原来是 John Gruber 2004 写的第一版。
My God , so oooold。。。
John Gruber 这个原代码写的很经典, 但是究竟很老了。。
]]> 而且现在 Cpan 上有现成的模块Text::Markdown
可以使用。 干脆改写吧。。。
另外,改写的插件还是丢到 plugins/Easun
目录吧,方便升级。 直接删除 plugins/Markdown/
目录, 在plugins/Easun
下新建立 Markdown_md.pl
文件,全文如下:
Perl #
# Markdown -- A text-to-HTML conversion tool for web writers
#
# Copyright (c) 2004 John Gruber
# <http://daringfireball.net/projects/markdown/>
# Modify 2017 By EasunLee<https://easun.org>
# <https://github.com/easunlee/MT-copy/blob/master/plugins/Easun/Markdown_md.pl>
#
package MT::Plugin::Easun::Markdown;
use strict;
use warnings;
use vars qw($MYNAME $VERSION $DEBUG $Useproxy );
$VERSION = "1.03e";
#### Movable Type plug-in interface #####################################
use MT::Plugin;
my $plugin = new MT::Plugin(
{ name=> "Markdown_Modify",
author_name => "John Gruber",
author_link => "http://daringfireball.net/",
plugin_link => "http://daringfireball.net/projects/markdown/",
version => $VERSION,
description =>
'<MT_TRANS phrase="A plain-text-to-HTML formatting plugin.">',
doc_link => 'http://daringfireball.net/projects/markdown/',
registry => {
tags => {
block => {
MarkdownOptions => sub {
my $ctx = shift;
my $args= shift;
my $builder = $ctx->stash('builder');
my $tokens = $ctx->stash('tokens');
if ( defined( $args->{'output'} ) ) {
$ctx->stash( 'markdown_output',
lc $args->{'output'} );
}
defined( my $str = $builder->build( $ctx, $tokens ) )
or return $ctx->error( $builder->errstr );
$str;# return value
},
},
},
text_filters => {
'markdown' => {
label => 'Markdown_Modify',
docs => 'http://daringfireball.net/projects/markdown/',
code => sub {
my $text = shift;
my $ctx = shift;
my $raw = 0;
if ( defined $ctx ) {
my $output = $ctx->stash('markdown_output');
if ( defined $output && $output =~ m/^html/i ) {
#$g_empty_element_suffix = ">";
$ctx->stash( 'markdown_output', '' );
}
elsif ( defined $output && $output eq 'raw' ) {
$raw = 1;
$ctx->stash( 'markdown_output', '' );
}
else {
$raw= 0;
# $g_empty_element_suffix = " />";
}
}
$text = $raw ? $text : &_easunCode( $text );
$text;
},
},
},
},
}
);
MT->add_plugin($plugin);
sub _easunCode {
my $text = shift;
&_DoCodeBlocks_github(\$text);
require Text::Markdown;
my $m = Text::Markdown->new;
$text = $m->markdown($text);
$text =~ s{<pre><code>```(.*?)\n}{<pre><b class=\"name\">$1<\/b><code class=\"language-$1\">}g;
$text =~ s/<pre><code>/<pre><b class=\"name\">code<\/b><code class=\"code\">/g;
return $text;
}
#
# GitHub style Code
#
sub _DoCodeBlocks_github {
my $text = shift;
$$text =~ s{\r\n}{\n}g;# DOS to Unix
$$text =~ s{\r}{\n}g; # Mac to Unix
#$$text =~ s{(\n\n|\A)(```\w+)\n}{$1\t$2\n}g;
$$text =~ s{
(?:\n\n|\A)
```(\w+)\n
( # $2 = the code block -- one or more lines, starting with a space/tab
.*?
)
\n```
(?:\n|\Z)
}{
my $codeType = $1;
my $codeblock = $2;
my $result; # return value
$codeblock =~ s/\A\n+//; # trim leading newlines
$codeblock =~ s/\s+\z//; # trim trailing whitespace
$codeblock =~ s/\n/\n\t/g;
$result = "\n\n\t```" .$codeType ."\n\t" . $codeblock . "\n\n";
$result;
}segmx;
}
1;
更详细的插件信息可以见 GitHub 地址: https://github.com/easunlee/MT-copy/blob/master/plugins/Easun/Markdown_md.pl
当然,不要忘记安装 Text::Markdown
模块。
Bashcpanm Text::Markdown
保存,重启 mt-starman, 到此新的 Markdown 解析器替换完成。
]]>