首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CamelCase Jekyll滤波器

CamelCase Jekyll滤波器
EN

Stack Overflow用户
提问于 2016-05-19 14:20:06
回答 1查看 370关注 0票数 0

我正在尝试做一个CamelCase Jekyll过滤器。

代码语言:javascript
复制
=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)

当筛选字符串时,它是成功的:

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

在页变量上使用时,不使用...but:

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

有什么东西我错过了吗?有人可以试试这个在那里自己安装Jekyll吗?

这不太重要,但它已经困扰我好几个小时了。

谢谢大家。=)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-05-23 08:51:10

问题在于这三条线:

代码语言:javascript
复制
# 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 }

当我提供字符串Hello World时,正则表达式与空格不匹配,因为它后面跟着大写字母。\s[a-z]' W'不匹配。因此,使用“速记字字符”(\w)代替。

以下代码起作用:

代码语言:javascript
复制
=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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37326071

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档