2016-05-19 12 views
0

Ich versuche einen CamelCase Jekyll Filter zu machen.CamelCase Jekyll Filter

=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) 

Es ist dann erfolgreich, wenn eine Zeichenfolge Filterung:

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

... aber nicht, wenn auf einer Seite Variable verwendet:

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

Könnte es etwas sein, ich vermisse ich? Könnte jemand das auf seiner eigenen Jekyll-Installation versuchen?

Es ist nicht sehr wichtig, aber es hat mich stundenlang abgehört.

Danke an alle. =)

+0

hier beide Produkte ' "Seitentitel"=> "Seitentitel"'. Jekyll 3.0.x, 3.1.x, Ruby 2.1.8, 2.3.0 –

+0

Bedeutet das, dass etwas mit der Camelize-Funktion nicht stimmt? – evolutionxbox

+0

Ja, ich denke schon. –

Antwort

0

Das Problem war, mit diesen drei Linien:

# 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 } 

Wenn ich die Zeichenfolge Hello World geliefert, die Regex den Raum nicht übereinstimmten, wie sie von einem Großbuchstaben folgt. Z.B. \s[a-z] stimmt nicht mit ' W' überein. So wurde stattdessen "Kurzschrift Wort" (\w) verwendet.

Der folgende Code funktioniert:

=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