2016-05-19 5 views
0

CamelCase Jekyllフィルタを作成しようとしています。CamelCase Jekyll Filter

{{ page.title | camelcase }} # Page Title

が、私は何かがあるかもしれません:

{{ 'Page Title' | camelcase }} # pageTitle

...ではなく、ページ変数で使用する場合:文字列をフィルタリングする際

=begin 
    # Custom to camelcase function 
    # Usage: 
    # 'string'.camelize 
    # 'string'.camelize(:lower) 
=end 
class String 
    def camelize(*separators) 
    case separators.first 
    when Symbol, TrueClass, FalseClass, NilClass 
     first_letter = separators.shift 
    end 

    separators = ['_', '\s'] if separators.empty? 

    str = self.dup 

    separators.each do |s| 
     str = str.gsub(/(?:#{s}+)([a-z])/){ $1.upcase } 
    end 

    case first_letter 
    when :upper, true 
     str = str.gsub(/(\A|\s)([a-z])/){ $1 + $2.upcase } 
    when :lower, false 
     str = str.gsub(/(\A|\s)([A-Z])/){ $1 + $2.downcase } 
    end 

    str 
    end 
end 

=begin 
    Jekyll filter to convert string to camelcase 
    Usage: 
    {% 'string' | camelcase %} 
=end 
module Jekyll 
    module CamelCase 
    def camelcase(input) 
     input.camelize(:lower) 
    end 
    end 
end 
Liquid::Template.register_filter(Jekyll::CamelCase) 

それは成功しています行方不明ですか? 誰かがジキルのインストールを自分で試してみることができますか?

それは非常に重要ではありませんが、数時間私を悩ませています。

ありがとうございました。問題は、これら3行だった=)

+0

をここで、両方のは、 ' "ページタイトル"=> "ページタイトル"'生成します。 Jekyll 3.0.x、3.1.x、ruby 2.1.8、2.3.0 –

+0

これはcamelize関数に何か問題があることを意味しますか? – evolutionxbox

+0

はい、そうだと思います。 –

答えて

0

:私は、文字列Hello Worldを供給するとき、それが大文字が続いているよう

# mainly this one 
str = str.gsub(/(?:#{s}+)([a-z])/){ $1.upcase } 

# but also these two as well 
str = str.gsub(/(\A|\s)([a-z])/){ $1 + $2.upcase } 
str = str.gsub(/(\A|\s)([A-Z])/){ $1 + $2.downcase } 

、正規表現は、スペースと一致しませんでした。例えば。​​3210は' W'と一致しません。 代わりに、「短縮形単語文字」(\w)が使用されました。

以下のコードは動作します:

=begin 
# Custom to camelcase function 
# Usage: 
# 'string'.camelize 
# 'string'.camelize(:lower) 
=end 
class String 
    def camelize(*separators) 
    case separators.first 
    when Symbol, TrueClass, FalseClass, NilClass 
     first_letter = separators.shift 
    end 

    separators = ['_', '\s'] if separators.empty? 

    str = self.dup 

    separators.each do |s| 
     str = str.gsub(/(?:#{s}+)([\w])/){ $1.upcase } 
    end 

    case first_letter 
    when :upper, true 
     str = str.gsub(/(\A|\s)([\w])/){ $1 + $2.upcase } 
    when :lower, false 
     str = str.gsub(/(\A|\s)([\w])/){ $1 + $2.downcase } 
    end 

    str 
    end 
end 

puts('Hello World'.camelize())  # HelloWorld 
puts('Hello World'.camelize(:lower)) # helloWorld 
puts('Hello World'.camelize(:upper)) # HelloWorld 
puts('hello world'.camelize())  # HelloWorld 
puts('hello world'.camelize(:lower)) # helloWorld 
puts('hello world'.camelize(:upper)) # HelloWorld