Fix Newline to Space

February 23, 2014

更新:由于jekyll的更新,post_filter已经被移除,因此修改方式已经无效。

之前,RandomK说我的blog有bug,其实在他说之前我就已经知道了,只是当时比较晚,所以没有修,今天周末将其解决之。

原因

我使用的是redcarpet作为markdown的转换器,jekyll将多行的段落转换成html之后在浏览 器中显示会很奇怪,在原始的markdown中的某一行最后一个字与下一行的第一个字之间存 在一个空格,作为使用单词的外国淫来说没什么问题,可是作为大天朝子民是无法忍受的。

space
文字之间存在空格

解决方案一 段落写为一行

我只能说这种行为好痛苦。

解决方案二 在markdown转换为html前处理一下

由于无法忍受第一种解决方案,只能在markdown转换为html之前进行一些预处理了。在网 上搜索一番后发现果然不止我一人遇到此问题,并且找到了一个解决方案。 不过该解决方案有一定的局限性,第一,没有处理汉英和英汉这两种情况,第二,没有处 理摘要。

为了解决以上两个问题,必须做出一些更改。

首先,作为一个非octopress用户,果断得去github上将octopress的post_filters plugins得到, 然后,从解决 Markdown 转 HTML 中文换行变空格的问题将代码拷贝并保存 到存放plugins的目录。然后就可以开始修改了。

修改1:

class String
  han = '\p{Han}|[,。?;:‘’“”、!……()]'
  @@hh = /(#{han}) *\n *(#{han})/m
  @@he = /(#{han}) *\n *(\p{Alpha})/m
  @@eh = /(\p{Alpha}) *\n *(#{han})/m
  def join_chinese!
    gsub!(@@hh, '\1\2')
    gsub!(@@he, '\1\2')
    gsub!(@@eh, '\1\2')
    self
  end
end

经过修改后,blog就能够正常显示了。

space no-space
第一阶段成果

修改2: 虽然blog中的问题解决了,但是摘要部分并没有的到解决。

wrong-excerpt
摘要中显示错误
由于在pre_render中添加post.excerpt.join_chinese!会导致jekyll创建html时失败, 因此采用添加一个filter供Liquid使用,从而解决解决此问题。

将一下代码加入Jekyll模块中

  module TemplateJoinChineseFilter
    def join_chinese(input)
      input.join_chinese!
    end
  end

然后将Liquid::Template.register_filter(Jekyll::TemplateJoinChineseFilter)添加到最后一行。 最后,只需要在使用摘要的时候使用{{ page.excerpt | join_chinese }}替代{{ page.excerpt }}即可。

wrong-excerpt excerpt
摘要中空格也不存在了

The End

问题基本得到了解决,不过还有几点需要注意:

  1. markdown中标题与正文之间需要一行空白行(我不习惯)。
  2. 标点符号和数字没有处理,因此有些地方是不适合换行然后通过插件解决的。
  3. 应该还存在这一些bug。

Reference

  1. 解决 Markdown 转 HTML 中文换行变空格的问题
  2. post_filter

2016找工作记1 - 一次面试的反思

2016找工作记1,一次面试的反思 Continue reading

Golang Reflect 101

Published on June 20, 2014

Bit Getter and Setter

Published on March 09, 2014