在Ruby on Rails中用罗马数字,破折号,撇号等标题化

时间:2014-05-09 03:18:25

标签: ruby-on-rails ruby ruby-on-rails-4 activesupport

我只是想将大写的公司名称转换为专有名称。

公司名称可包括:

  1. 破折号
  2. 撇号
  3. 罗马数字
  4. 像LLC,LP,INC这样的文本应保持大写。
  5. 我以为我可以使用这样的首字母缩略词:

    ACRONYMS = %W( LP III IV VI VII VIII IX GI)
    ActiveSupport::Inflector.inflections(:en) do |inflect|
      ACRONYMS.each { |a| inflect.acronym(a) }
    end
    

    但是,转换不考虑分词,因此VIVII不起作用。例如," ADVISORS" .titleize的转换是" Ad VI Sors",因为VI成为一个整体词。

    Dashes被删除。

    似乎这个通用问题应该有一个通用的宝石,但我找不到。这个问题真的不常见吗?除了彻底破解当前的变形库之外,最好的解决方案是什么?

1 个答案:

答案 0 :(得分:3)

公司名称有点奇怪,因为很多时候它们都是Marks(如Service Mark),而不是专有名称。这意味着精确的大写可能实际上很重要,尝试标题可能不值得。

无论如何,这是一种可行的模式。构建令牌列表以“保留”,然后手动拆分字符串并标记非令牌部分。

# Make sure you put long strings before short (VII before VI)
word_tokens = %w{VII VI IX XI}
# Special characters need to be separate, since they never appear as "part" of another word
special_tokens = %w{-}
# Builds a regex like /(\bVII\b|\bVI\b|-|)/ that wraps "word tokens" in a word boundary check
token_regex = /(#{word_tokens.map{|t| /\b#{t}\b/}.join("|")}|#{special_tokens.join("|")})/
title = "ADVISORS-XI"
title.split(token_regex).map{|s| s =~ token_regex ? s : s.titleize}.join