jekyll在windows上使用和调试

Windows 上调试

解决中文文件名问题

修改ruby 库 URI::escape

  • 修改文件: ruby-2.1.7-x64-mingw32\lib\ruby\2.1.0\uri\common.rb
  • 修改: 在 escape 方法中 添加 us.encode!(“utf-8”)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    def escape(str, unsafe = @regexp[:UNSAFE])
      unless unsafe.kind_of?(Regexp)
        # perhaps unsafe is String object
        unsafe = Regexp.new("[#{Regexp.quote(unsafe)}]", false)
      end
      str.gsub(unsafe) do
        us = $&
        tmp = ''
        ### ### wi: fix chinese folder name becomes illegible in jekyll 2017-07-13
        us.encode!("utf-8")
        ### ###
        us.each_byte do |uc|
          tmp << sprintf('%%%02X', uc)
        end
        tmp
      end.force_encoding(Encoding::US_ASCII)
    end

webrick 中文支持

webrick\httpservlet\filehandler.rb 的 prevent_directory_traversal 函数中

1
2
3
4
5
6
7
  ### ### wi-start @ 2017-07-17 
  # wi : delete below
  #path = req.path_info.dup.force_encoding(Encoding.find("filesystem"))
  # wi : add this
  #      this cause illegible characters in path, files in chinese folder 404
  path = req.path_info.dup.force_encoding("utf-8").encode("gbk")
  ### ### wi-end @ 2017-07-17

Windows 上报错 “Missing dependency: RedCloth”

1
2
3
4
5
6
7
8
9
10
11
12
13
>bundle exec jekyll build
Configuration file: D:/documentation-theme-jekyll/_config.yml
            Source: D:/documentation-theme-jekyll
       Destination: D:/documentation-theme-jekyll/_site
 Incremental build: disabled. Enable with --incremental
      Generating...
You are missing a library required for Textile. Please run:
  $ [sudo] gem install RedCloth
  Conversion error: Jekyll::Converters::Textile encountered an error while converting 'hello.textile':
                    Missing dependency: RedCloth
             ERROR: YOUR SITE COULD NOT BE BUILT:
                    ------------------------------------
                    Missing dependency: RedCloth

解决方法

1
2
3
4
5
6
7
8
> bundle list RedCloth
D:\ruby-2.1.7-x64-mingw32\lib\ruby\gems\2.1.0\gems\RedCloth-4.3.2\ext

> cd D:\ruby-2.1.7-x64-mingw32\lib\ruby\gems\2.1.0\gems\RedCloth-4.3.2\ext

> mkdir 2.1

> xcopy /E redcloth_scan\* 2.1\

build 时,报错: Invalid GBK character

1
jekyll 3.5.1 | Error:  Liquid error (line 77): Invalid GBK character "\xE2" on line 108

scssfiy 时出问题,utf-8 的 scss 文件被误认为 GBK

原因

sass 处理 “@import” 时读取文件,使用 File.read 是该方法默认使用 Windows 中文环境的 GBK 编码。

改不了内建的 File.read ,就只能改 Sass 了,例如:

  • \sass-3.5.1\lib\sass\importers\filesystem.rb
  • Sass::Importers::_find
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
module Sass
  module Importers
    class Filesystem
      def _find(dir, name, options)
        full_filename, syntax = Sass::Util.destructure(find_real_file(dir, name, options))
        return unless full_filename && File.readable?(full_filename)

        # TODO: this preserves historical behavior, but it's possible
        # :filename should be either normalized to the native format
        # or consistently URI-format.
        full_filename = full_filename.tr("\\", "/") if Sass::Util.windows?

        options[:syntax] = syntax
        options[:filename] = full_filename
        options[:importer] = self
        ### ### 
        # wi 2017-07-26 : remove
        #Sass::Engine.new(File.read(full_filename), options)
        # wi 2017-07-26 : add
        Sass::Engine.new(File.read(full_filename, :encoding => "utf-8"), options)
        ### ###
      end
    end
  end
end
  • 报错信息
    1
    format_error: incompatible character encodings: UTF-8 and GBK (Encoding::CompatibilityError)
    
  • 解决方法
    ruby-2.3.3-x64-mingw32\lib\ruby\gems\2.3.0\gems\jekyll-3.3.1\lib\jekyll\liquid_renderer.rb

    1
    2
    3
    4
    5
    6
    7
    8
    def file(filename)
        # 解决 link tag 参数出现中文文件名时,报错:
        #   `format_error': incompatible character encodings: UTF-8 and GBK (Encoding::CompatibilityError)
        # 加入一句代码
        filename.encode!("utf-8")
          
        ...
    end
    
  • 问题描述
    drafts 草稿模式使用 liquid link tag 无法找到文件,这些文件放在 _posts 里面,无法在草稿模式找到。

  • 解决方法
    修改 link tag 的源码,只是警告提醒,而不中止编译。

    ruby-2.3.3-x64-mingw32\lib\ruby\gems\2.3.0\gems\jekyll-3.3.1\lib\jekyll\tags\link.rb

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
  def render(context)
    site = context.registers[:site]

    site.each_site_file do |item|
      return item.url if item.relative_path == @relative_path
      # This takes care of the case for static files that have a leading /
      return item.url if item.relative_path == "/#{@relative_path}"
    end

    # wi 2017-12-22
    # 找不到文档,只提醒,不报错而导致build中止。
    # 使用 drafts 的时候可能无法找到link的文档
    # 删除这一句
    #raise ArgumentError, <<eos
    # 添加这句话
    Jekyll.logger.warn "WARNING:", <<eos
    
Could not find document '#{@relative_path}' in tag '#{self.class.tag_name}'.

Make sure the document exists and the path is correct.
eos
  end

附录

找到当前 webrick 代码目录

1
2
3
shell> irb
irb> require "webrick/httpservlet"
irb> WEBrick::HTTPServlet::FileHandler.instance_method(:set_filename).source_location