tiny-safe-mod 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/stringex-2.8.6/Gemfile +51 -0
- data/stringex-2.8.6/MIT-LICENSE +20 -0
- data/stringex-2.8.6/README.md +162 -0
- data/stringex-2.8.6/Rakefile +57 -0
- data/stringex-2.8.6/VERSION +1 -0
- data/stringex-2.8.6/init.rb +3 -0
- data/stringex-2.8.6/lib/stringex/acts_as_url/adapter/active_record.rb +23 -0
- data/stringex-2.8.6/lib/stringex/acts_as_url/adapter/base.rb +240 -0
- data/stringex-2.8.6/lib/stringex/acts_as_url/adapter/data_mapper.rb +61 -0
- data/stringex-2.8.6/lib/stringex/acts_as_url/adapter/mongoid.rb +37 -0
- data/stringex-2.8.6/lib/stringex/acts_as_url/adapter.rb +26 -0
- data/stringex-2.8.6/lib/stringex/acts_as_url.rb +107 -0
- data/stringex-2.8.6/lib/stringex/configuration/acts_as_url.rb +50 -0
- data/stringex-2.8.6/lib/stringex/configuration/base.rb +58 -0
- data/stringex-2.8.6/lib/stringex/configuration/configurator.rb +25 -0
- data/stringex-2.8.6/lib/stringex/configuration/string_extensions.rb +20 -0
- data/stringex-2.8.6/lib/stringex/configuration.rb +4 -0
- data/stringex-2.8.6/lib/stringex/configuration_lite.rb +3 -0
- data/stringex-2.8.6/lib/stringex/core_ext.rb +10 -0
- data/stringex-2.8.6/lib/stringex/localization/backend/base.rb +13 -0
- data/stringex-2.8.6/lib/stringex/localization/backend/i18n.rb +86 -0
- data/stringex-2.8.6/lib/stringex/localization/backend/internal.rb +47 -0
- data/stringex-2.8.6/lib/stringex/localization/conversion_expressions.rb +154 -0
- data/stringex-2.8.6/lib/stringex/localization/converter.rb +129 -0
- data/stringex-2.8.6/lib/stringex/localization/default_conversions.rb +89 -0
- data/stringex-2.8.6/lib/stringex/localization.rb +112 -0
- data/stringex-2.8.6/lib/stringex/rails/railtie.rb +10 -0
- data/stringex-2.8.6/lib/stringex/string_extensions.rb +228 -0
- data/stringex-2.8.6/lib/stringex/unidecoder.rb +82 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x00.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x01.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x02.yml +256 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x03.yml +256 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x04.yml +256 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x05.yml +256 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x06.yml +256 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x07.yml +256 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x09.yml +256 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x0a.yml +256 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x0b.yml +256 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x0c.yml +256 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x0d.yml +256 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x0e.yml +256 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x0f.yml +256 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x10.yml +256 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x11.yml +256 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x12.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x13.yml +256 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x14.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x15.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x16.yml +256 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x17.yml +256 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x18.yml +256 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x1e.yml +256 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x1f.yml +256 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x20.yml +256 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x21.yml +256 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x22.yml +256 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x23.yml +256 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x24.yml +256 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x25.yml +256 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x26.yml +256 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x27.yml +256 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x28.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x2e.yml +256 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x2f.yml +256 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x30.yml +256 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x31.yml +256 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x32.yml +256 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x33.yml +256 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x4d.yml +256 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x4e.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x4f.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x50.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x51.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x52.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x53.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x54.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x55.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x56.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x57.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x58.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x59.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x5a.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x5b.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x5c.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x5d.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x5e.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x5f.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x60.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x61.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x62.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x63.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x64.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x65.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x66.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x67.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x68.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x69.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x6a.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x6b.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x6c.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x6d.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x6e.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x6f.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x70.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x71.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x72.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x73.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x74.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x75.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x76.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x77.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x78.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x79.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x7a.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x7b.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x7c.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x7d.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x7e.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x7f.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x80.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x81.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x82.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x83.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x84.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x85.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x86.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x87.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x88.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x89.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x8a.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x8b.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x8c.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x8d.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x8e.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x8f.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x90.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x91.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x92.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x93.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x94.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x95.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x96.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x97.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x98.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x99.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x9a.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x9b.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x9c.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x9d.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x9e.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/x9f.yml +256 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/xa0.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/xa1.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/xa2.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/xa3.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/xa4.yml +256 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/xac.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/xad.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/xae.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/xaf.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/xb0.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/xb1.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/xb2.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/xb3.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/xb4.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/xb5.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/xb6.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/xb7.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/xb8.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/xb9.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/xba.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/xbb.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/xbc.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/xbd.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/xbe.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/xbf.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/xc0.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/xc1.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/xc2.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/xc3.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/xc4.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/xc5.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/xc6.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/xc7.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/xc8.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/xc9.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/xca.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/xcb.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/xcc.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/xcd.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/xce.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/xcf.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/xd0.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/xd1.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/xd2.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/xd3.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/xd4.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/xd5.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/xd6.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/xd7.yml +256 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/xf9.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/xfa.yml +256 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/xfb.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/xfc.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/xfd.yml +256 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/xfe.yml +257 -0
- data/stringex-2.8.6/lib/stringex/unidecoder_data/xff.yml +257 -0
- data/stringex-2.8.6/lib/stringex/version.rb +8 -0
- data/stringex-2.8.6/lib/stringex.rb +17 -0
- data/stringex-2.8.6/lib/stringex_lite.rb +15 -0
- data/stringex-2.8.6/locales/da.yml +76 -0
- data/stringex-2.8.6/locales/de.yml +77 -0
- data/stringex-2.8.6/locales/en.yml +69 -0
- data/stringex-2.8.6/locales/fr.yml +72 -0
- data/stringex-2.8.6/locales/nb.yml +76 -0
- data/stringex-2.8.6/locales/nl.yml +69 -0
- data/stringex-2.8.6/locales/no.yml +76 -0
- data/stringex-2.8.6/locales/pl.yml +88 -0
- data/stringex-2.8.6/locales/pt-BR.yml +69 -0
- data/stringex-2.8.6/locales/ru.yml +69 -0
- data/stringex-2.8.6/locales/sv.yml +76 -0
- data/stringex-2.8.6/stringex.gemspec +290 -0
- data/stringex-2.8.6/test/performance/localization_performance_test.rb +24 -0
- data/stringex-2.8.6/test/test_helper.rb +2 -0
- data/stringex-2.8.6/test/unit/acts_as_url/adapter/activerecord.rb +71 -0
- data/stringex-2.8.6/test/unit/acts_as_url/adapter/datamapper.rb +83 -0
- data/stringex-2.8.6/test/unit/acts_as_url/adapter/mongoid.rb +82 -0
- data/stringex-2.8.6/test/unit/acts_as_url_configuration_test.rb +51 -0
- data/stringex-2.8.6/test/unit/acts_as_url_integration_test.rb +425 -0
- data/stringex-2.8.6/test/unit/localization/da_test.rb +118 -0
- data/stringex-2.8.6/test/unit/localization/de_test.rb +118 -0
- data/stringex-2.8.6/test/unit/localization/default_test.rb +115 -0
- data/stringex-2.8.6/test/unit/localization/en_test.rb +118 -0
- data/stringex-2.8.6/test/unit/localization/fr_test.rb +118 -0
- data/stringex-2.8.6/test/unit/localization/nl_test.rb +118 -0
- data/stringex-2.8.6/test/unit/localization/pl_test.rb +118 -0
- data/stringex-2.8.6/test/unit/localization/pt_br_test.rb +118 -0
- data/stringex-2.8.6/test/unit/localization/ru_test.rb +130 -0
- data/stringex-2.8.6/test/unit/localization/sv_test.rb +118 -0
- data/stringex-2.8.6/test/unit/localization_18n_failure_test.rb +40 -0
- data/stringex-2.8.6/test/unit/localization_test.rb +162 -0
- data/stringex-2.8.6/test/unit/string_extensions_configuration_test.rb +17 -0
- data/stringex-2.8.6/test/unit/string_extensions_test.rb +321 -0
- data/stringex-2.8.6/test/unit/unicode_point_suite/basic_greek_test.rb +113 -0
- data/stringex-2.8.6/test/unit/unicode_point_suite/basic_latin_test.rb +144 -0
- data/stringex-2.8.6/test/unit/unicode_point_suite/codepoint_test_helper.rb +32 -0
- data/stringex-2.8.6/test/unit/unidecoder/bad_localization.yml +1 -0
- data/stringex-2.8.6/test/unit/unidecoder/localization.yml +4 -0
- data/stringex-2.8.6/test/unit/unidecoder_test.rb +104 -0
- data/stringex-2.8.6/test/unit/version_test.rb +12 -0
- data/tiny-safe-mod.gemspec +11 -0
- metadata +293 -0
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
require "stringex/acts_as_url/adapter/base"
|
|
2
|
+
require "stringex/acts_as_url/adapter/active_record"
|
|
3
|
+
require "stringex/acts_as_url/adapter/data_mapper"
|
|
4
|
+
require "stringex/acts_as_url/adapter/mongoid"
|
|
5
|
+
|
|
6
|
+
module Stringex
|
|
7
|
+
module ActsAsUrl
|
|
8
|
+
module Adapter
|
|
9
|
+
def self.add_loaded_adapter(adapter)
|
|
10
|
+
@loaded_adapters << adapter
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def self.load_available
|
|
14
|
+
@loaded_adapters = []
|
|
15
|
+
constants.each do |name|
|
|
16
|
+
adapter = const_get(name)
|
|
17
|
+
adapter.load if adapter.loadable?
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def self.first_available
|
|
22
|
+
@loaded_adapters[0]
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
# encoding: UTF-8
|
|
2
|
+
require "stringex/acts_as_url/adapter"
|
|
3
|
+
|
|
4
|
+
module Stringex
|
|
5
|
+
module ActsAsUrl # :nodoc:
|
|
6
|
+
def self.configure(&block)
|
|
7
|
+
Stringex::Configuration::ActsAsUrl.configure(&block)
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def self.unconfigure!
|
|
11
|
+
Stringex::Configuration::ActsAsUrl.unconfigure!
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
module ActsAsUrlClassMethods # :doc:
|
|
15
|
+
# Creates a callback to automatically create an url-friendly representation
|
|
16
|
+
# of the <tt>attribute</tt> argument. Example:
|
|
17
|
+
#
|
|
18
|
+
# acts_as_url :title
|
|
19
|
+
#
|
|
20
|
+
# will use the string contents of the <tt>title</tt> attribute
|
|
21
|
+
# to create the permalink. <strong>Note:</strong> you can also use a non-database-backed
|
|
22
|
+
# method to supply the string contents for the permalink. Just use that method's name
|
|
23
|
+
# as the argument as you would an attribute.
|
|
24
|
+
#
|
|
25
|
+
# The default attribute <tt>acts_as_url</tt> uses to save the permalink is <tt>url</tt>
|
|
26
|
+
# but this can be changed in the options hash. Available options are:
|
|
27
|
+
#
|
|
28
|
+
# <tt>:adapter</tt>:: If specified, will indicate what ORM adapter to use. Default functionality
|
|
29
|
+
# is to use the first available adapter. This should work for most cases
|
|
30
|
+
# unless you are using multiple ORMs in a single project.
|
|
31
|
+
# <tt>:allow_slash</tt>:: If true, allows the generated url to contain slashes. Default is false[y].
|
|
32
|
+
# <tt>:allow_duplicates</tt>:: If true, allows duplicate urls instead of appending numbers to
|
|
33
|
+
# differentiate between urls. Default is false[y]. See note on <tt>:scope</tt>.
|
|
34
|
+
# <tt>:duplicate_count_separator</tt>:: String to use when forcing unique urls from non-unique strings.
|
|
35
|
+
# Default is "-".
|
|
36
|
+
# <tt>:duplicate_sequence</tt>:: Supply an enumerator to generate the values used to generate
|
|
37
|
+
# unique urls (when <tt>:allow_duplicates</tt> is false).
|
|
38
|
+
# By default, generates positive integers in sequence from 1.
|
|
39
|
+
# <strong>Note:</strong> The sequence is restarted for each record
|
|
40
|
+
# (by calling <tt>#rewind</tt>).
|
|
41
|
+
# <tt>:force_downcase</tt>:: If false, allows generated url to contain uppercased letters. Default is false.
|
|
42
|
+
# <tt>:exclude_list</tt>:: List of complete strings that should not be transformed by <tt>acts_as_url</tt>.
|
|
43
|
+
# Default is empty.
|
|
44
|
+
# <tt>:only_when_blank</tt>:: If true, the url generation will only happen when <tt>:url_attribute</tt> is
|
|
45
|
+
# blank. Default is false[y] (meaning url generation will happen always).
|
|
46
|
+
# <tt>:scope</tt>:: The name of model attribute to scope unique urls to. There is no default here.
|
|
47
|
+
# <strong>Note:</strong> this will automatically act as if <tt>:allow_duplicates</tt>
|
|
48
|
+
# is set to true.
|
|
49
|
+
# <tt>:sync_url</tt>:: If set to true, the url field will be updated when changes are made to the
|
|
50
|
+
# attribute it is based on. Default is false.
|
|
51
|
+
# <tt>:url_attribute</tt>:: The name of the attribute to use for storing the generated url string.
|
|
52
|
+
# Default is <tt>:url</tt>.
|
|
53
|
+
# <tt>:limit</tt>:: The maximum size a generated url should be. <strong>Note:</strong> this does not
|
|
54
|
+
# include the characters needed to enforce uniqueness on duplicate urls.
|
|
55
|
+
# Default is nil.
|
|
56
|
+
def acts_as_url(attribute, options = {})
|
|
57
|
+
class_eval do
|
|
58
|
+
class << self
|
|
59
|
+
attr_accessor :acts_as_url_configuration
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
define_method :acts_as_url_configuration do
|
|
63
|
+
klass = self.class
|
|
64
|
+
while klass.acts_as_url_configuration.nil?
|
|
65
|
+
klass = klass.superclass
|
|
66
|
+
end
|
|
67
|
+
klass.acts_as_url_configuration
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
options[:attribute_to_urlify] = attribute
|
|
72
|
+
self.acts_as_url_configuration = Stringex::Configuration::ActsAsUrl.new(options)
|
|
73
|
+
|
|
74
|
+
acts_as_url_configuration.adapter.create_callbacks! self
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
# Some ORMs function as mixins not base classes and need to have a hook to reinclude
|
|
79
|
+
# and re-extend ActsAsUrl methods
|
|
80
|
+
def included(base = nil, &block)
|
|
81
|
+
super
|
|
82
|
+
|
|
83
|
+
if base
|
|
84
|
+
base.send :include, Stringex::ActsAsUrl::ActsAsUrlInstanceMethods
|
|
85
|
+
base.send :extend, Stringex::ActsAsUrl::ActsAsUrlClassMethods
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
# Initialize the url fields for the records that need it. Designed for people who add
|
|
90
|
+
# <tt>acts_as_url</tt> support once there's already development/production data they'd
|
|
91
|
+
# like to keep around.
|
|
92
|
+
#
|
|
93
|
+
# Note: This method can get very expensive, very fast. If you're planning on using this
|
|
94
|
+
# on a large selection, you will get much better results writing your own version with
|
|
95
|
+
# using pagination.
|
|
96
|
+
def initialize_urls
|
|
97
|
+
acts_as_url_configuration.adapter.initialize_urls! self
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
module ActsAsUrlInstanceMethods
|
|
102
|
+
def ensure_unique_url
|
|
103
|
+
acts_as_url_configuration.adapter.ensure_unique_url! self
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
end
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
module Stringex
|
|
2
|
+
module Configuration
|
|
3
|
+
class ActsAsUrl < Base
|
|
4
|
+
def initialize(options = {})
|
|
5
|
+
if options[:scope]
|
|
6
|
+
options[:scope_for_url] = options.delete(:scope)
|
|
7
|
+
end
|
|
8
|
+
super
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def string_extensions_settings
|
|
12
|
+
[
|
|
13
|
+
:allow_slash,
|
|
14
|
+
:exclude,
|
|
15
|
+
:force_downcase,
|
|
16
|
+
:limit,
|
|
17
|
+
:replace_whitespace_with,
|
|
18
|
+
:truncate_words
|
|
19
|
+
].inject(Hash.new){|m, x| m[x] = settings.send(x); m}
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def self.settings
|
|
23
|
+
@settings
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
private
|
|
27
|
+
|
|
28
|
+
def default_settings
|
|
29
|
+
self.class.default_settings
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def self.default_settings
|
|
33
|
+
@default_settings ||= {
|
|
34
|
+
allow_duplicates: false,
|
|
35
|
+
callback_method: :before_validation,
|
|
36
|
+
duplicate_count_separator: "-",
|
|
37
|
+
enforce_uniqueness_on_sti_base_class: false,
|
|
38
|
+
only_when_blank: false,
|
|
39
|
+
scope_for_url: nil,
|
|
40
|
+
sync_url: false,
|
|
41
|
+
url_attribute: "url",
|
|
42
|
+
blacklist: %w[new],
|
|
43
|
+
blacklist_policy: lambda { |instance, url|
|
|
44
|
+
"#{url}-#{instance.class.to_s.downcase}"
|
|
45
|
+
}
|
|
46
|
+
}.merge(Stringex::Configuration::StringExtensions.new.default_settings)
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
module Stringex
|
|
2
|
+
module Configuration
|
|
3
|
+
class Base
|
|
4
|
+
attr_accessor :settings
|
|
5
|
+
|
|
6
|
+
def initialize(local_options = {})
|
|
7
|
+
current_settings = default_settings.merge(system_wide_customizations)
|
|
8
|
+
current_settings.merge! local_options
|
|
9
|
+
|
|
10
|
+
@settings = OpenStruct.new(current_settings)
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
# NOTE: This does not cache itself so that instance and class can be cached on the adapter
|
|
14
|
+
# without worrying about thread safety or race conditions
|
|
15
|
+
def adapter
|
|
16
|
+
adapter_name = settings.adapter || Stringex::ActsAsUrl::Adapter.first_available
|
|
17
|
+
case adapter_name
|
|
18
|
+
when Class
|
|
19
|
+
adapter_name.send :new, self
|
|
20
|
+
when :active_record
|
|
21
|
+
Stringex::ActsAsUrl::Adapter::ActiveRecord.new self
|
|
22
|
+
when :mongoid
|
|
23
|
+
Stringex::ActsAsUrl::Adapter::Mongoid.new self
|
|
24
|
+
else
|
|
25
|
+
raise ArgumentError, "#{adapter_name} is not a defined ActsAsUrl adapter. Please feel free to implement your own and submit it back upstream."
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def self.configure(&block)
|
|
30
|
+
configurator = Stringex::Configuration::Configurator.new(self)
|
|
31
|
+
yield configurator
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def self.system_wide_customizations
|
|
35
|
+
@system_wide_customizations ||= {}
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def self.unconfigure!
|
|
39
|
+
@system_wide_customizations = {}
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
private
|
|
43
|
+
|
|
44
|
+
def default_settings
|
|
45
|
+
raise ArgumentError, "You shouldn't have hit default_settings on Stringex::Configuration::Base. Check your code."
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def system_wide_customizations
|
|
49
|
+
self.class.system_wide_customizations
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def self.valid_configuration_details
|
|
53
|
+
default_settings.keys
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
module Stringex
|
|
2
|
+
module Configuration
|
|
3
|
+
class Configurator
|
|
4
|
+
attr_accessor :klass
|
|
5
|
+
|
|
6
|
+
def initialize(klass)
|
|
7
|
+
@klass = klass
|
|
8
|
+
|
|
9
|
+
self.klass.valid_configuration_details.each do |name|
|
|
10
|
+
define_instance_method_for_configuration_wrapper name
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def define_instance_method_for_configuration_wrapper(name)
|
|
15
|
+
name = name.respond_to?(:intern) ? name.intern : name
|
|
16
|
+
(class << self; self; end).instance_eval do
|
|
17
|
+
define_method("#{name}=") do |value|
|
|
18
|
+
customizations = klass.send(:system_wide_customizations)
|
|
19
|
+
customizations[name] = value
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
module Stringex
|
|
2
|
+
module Configuration
|
|
3
|
+
class StringExtensions < Base
|
|
4
|
+
def default_settings
|
|
5
|
+
self.class.default_settings
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def self.default_settings
|
|
9
|
+
@default_settings ||= {
|
|
10
|
+
allow_slash: false,
|
|
11
|
+
exclude: [],
|
|
12
|
+
force_downcase: true,
|
|
13
|
+
limit: nil,
|
|
14
|
+
replace_whitespace_with: "-",
|
|
15
|
+
truncate_words: true
|
|
16
|
+
}
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
Stringex = Module.new unless defined?(Stringex)
|
|
2
|
+
ensure_module_defined = ->(base, module_name){
|
|
3
|
+
base.const_set(module_name, Module.new) unless base.const_defined?(module_name)
|
|
4
|
+
}
|
|
5
|
+
ensure_module_defined[Stringex, :StringExtensions]
|
|
6
|
+
ensure_module_defined[Stringex::StringExtensions, :PublicInstanceMethods]
|
|
7
|
+
ensure_module_defined[Stringex::StringExtensions, :PublicClassMethods]
|
|
8
|
+
|
|
9
|
+
String.send :include, Stringex::StringExtensions::PublicInstanceMethods
|
|
10
|
+
String.send :extend, Stringex::StringExtensions::PublicClassMethods
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
module Stringex
|
|
2
|
+
module Localization
|
|
3
|
+
module Backend
|
|
4
|
+
class I18n < Base
|
|
5
|
+
LOAD_PATH_BASE = File.join(File.expand_path(File.dirname(__FILE__)), '..', '..', '..', '..', 'locales')
|
|
6
|
+
|
|
7
|
+
class << self
|
|
8
|
+
def reset!
|
|
9
|
+
super
|
|
10
|
+
@locale = nil
|
|
11
|
+
::I18n.reload! if defined?(::I18n) && ::I18n.respond_to?(:reload!)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def locale
|
|
15
|
+
@locale || ::I18n.locale
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def locale=(new_locale)
|
|
19
|
+
@locale = new_locale
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def default_locale
|
|
23
|
+
::I18n.default_locale
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def default_locale=(new_locale)
|
|
27
|
+
::I18n.default_locale = new_locale
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def with_locale(new_locale, &block)
|
|
31
|
+
::I18n.with_locale new_locale, &block
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def store_translations(locale, scope, data)
|
|
35
|
+
::I18n.backend.store_translations(locale, {stringex: {scope => data}})
|
|
36
|
+
reset_translations_cache
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def translations
|
|
40
|
+
# Set up hash like translations[:en][:transliterations]["é"]
|
|
41
|
+
@translations ||= Hash.new { |hsh, locale| hsh[locale] = Hash.new({}).merge(i18n_translations_for(locale)) }
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def initial_translation(scope, key, locale)
|
|
45
|
+
translations[locale][scope][key.to_sym]
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def load_translations(locale = nil)
|
|
49
|
+
locale ||= self.locale
|
|
50
|
+
::I18n.load_path |= Dir[File.join(LOAD_PATH_BASE, "#{locale}.yml")]
|
|
51
|
+
::I18n.backend.load_translations
|
|
52
|
+
reset_translations_cache
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def i18n_translations_for(locale)
|
|
56
|
+
ensure_locales_enforced_or_not
|
|
57
|
+
::I18n.translate("stringex", locale: locale, default: {})
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def reset_translations_cache
|
|
61
|
+
@translations = nil
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def ensure_locales_enforced_or_not
|
|
65
|
+
return unless ::I18n.respond_to?(:enforce_available_locales)
|
|
66
|
+
# Allow users to have set this to false manually but default to true
|
|
67
|
+
return unless ::I18n.enforce_available_locales == nil
|
|
68
|
+
::I18n.enforce_available_locales = ::I18n.available_locales != []
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
class I18nNotDefined < RuntimeError
|
|
74
|
+
def initialize
|
|
75
|
+
super 'Stringex cannot use I18n backend: I18n is not defined'
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
class I18nMissingTranslate < RuntimeError
|
|
80
|
+
def initialize
|
|
81
|
+
super 'Stringex cannot use I18n backend: I18n is defined but missing a translate method'
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
end
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
module Stringex
|
|
2
|
+
module Localization
|
|
3
|
+
module Backend
|
|
4
|
+
class Internal < Base
|
|
5
|
+
DEFAULT_LOCALE = :en
|
|
6
|
+
|
|
7
|
+
class << self
|
|
8
|
+
def locale
|
|
9
|
+
@locale || default_locale
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def locale=(new_locale)
|
|
13
|
+
@locale = new_locale.to_sym
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def default_locale
|
|
17
|
+
@default_locale || DEFAULT_LOCALE
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def default_locale=(new_locale)
|
|
21
|
+
@default_locale = @locale = new_locale.to_sym
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def with_locale(new_locale, &block)
|
|
25
|
+
original_locale = locale
|
|
26
|
+
self.locale = new_locale
|
|
27
|
+
yield
|
|
28
|
+
self.locale = original_locale
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def translations
|
|
32
|
+
# Set up hash like translations[:en][:transliterations]["é"]
|
|
33
|
+
@translations ||= Hash.new { |k, v| k[v] = Hash.new({}) }
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def store_translations(locale, scope, data)
|
|
37
|
+
self.translations[locale.to_sym][scope.to_sym] = Hash[data.map { |k, v| [k.to_sym, v] }] # Symbolize keys
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def initial_translation(scope, key, locale)
|
|
41
|
+
translations[locale][scope][key.to_sym]
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
# encoding: UTF-8
|
|
2
|
+
|
|
3
|
+
module Stringex
|
|
4
|
+
module Localization
|
|
5
|
+
module ConversionExpressions
|
|
6
|
+
ABBREVIATION = /(\s|\(|^)([[:alpha:]](\.[[:alpha:]])+(\.?)[[:alpha:]]*(\s|\)|$))/
|
|
7
|
+
|
|
8
|
+
ACCENTED_HTML_ENTITY = /&([A-Za-z])(grave|acute|circ|tilde|uml|ring|cedil|slash);/
|
|
9
|
+
|
|
10
|
+
APOSTROPHE = /(^|[[:alpha:]])'|`([[:alpha:]]|$)/
|
|
11
|
+
|
|
12
|
+
CHARACTERS = {
|
|
13
|
+
and: /\s*&\s*/,
|
|
14
|
+
at: /\s*@\s*/,
|
|
15
|
+
degrees: /\s*°\s*/,
|
|
16
|
+
divide: /\s*÷\s*/,
|
|
17
|
+
dot: /(\S|^)\.(\S)/,
|
|
18
|
+
ellipsis: /\s*\.{3,}\s*/,
|
|
19
|
+
equals: /\s*=\s*/,
|
|
20
|
+
number: /\s*#/,
|
|
21
|
+
percent: /\s*%\s*/,
|
|
22
|
+
plus: /\s*\+\s*/,
|
|
23
|
+
slash: /\s*(\\|\/|/)\s*/,
|
|
24
|
+
star: /\s*\*\s*/,
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
# Things that just get converted to spaces
|
|
28
|
+
CLEANUP_CHARACTERS = /[\.,:;(){}\[\]\?!\^'ʼ"`~_\|<>]/
|
|
29
|
+
CLEANUP_HTML_ENTITIES = /&[^;]+;/
|
|
30
|
+
|
|
31
|
+
CURRENCIES_SUPPORTED_SIMPLE = {
|
|
32
|
+
generic: /¤/,
|
|
33
|
+
dollars: /\$/,
|
|
34
|
+
euros: /€/,
|
|
35
|
+
pounds: /£/,
|
|
36
|
+
yen: /¥/,
|
|
37
|
+
reais: /R\$/
|
|
38
|
+
}
|
|
39
|
+
CURRENCIES_SUPPORTED_COMPLEX = {
|
|
40
|
+
dollars: :dollars_cents,
|
|
41
|
+
euros: :euros_cents,
|
|
42
|
+
pounds: :pounds_pence,
|
|
43
|
+
reais: :reais_cents
|
|
44
|
+
}
|
|
45
|
+
CURRENCIES_SUPPORTED = Regexp.new(CURRENCIES_SUPPORTED_SIMPLE.values.join('|'))
|
|
46
|
+
CURRENCIES_SIMPLE = CURRENCIES_SUPPORTED_SIMPLE.inject({}) do |hash, content|
|
|
47
|
+
key, expression = content
|
|
48
|
+
hash[key] = /(?:\s|^)#{expression}(\d*)(?:\s|$)/
|
|
49
|
+
hash
|
|
50
|
+
end
|
|
51
|
+
CURRENCIES_COMPLEX = CURRENCIES_SUPPORTED_SIMPLE.inject({}) do |hash, content|
|
|
52
|
+
key, expression = content
|
|
53
|
+
# Do we really need to not worry about complex currencies if there are none for the currency?
|
|
54
|
+
complex_key = CURRENCIES_SUPPORTED_COMPLEX[key]
|
|
55
|
+
if complex_key
|
|
56
|
+
hash[complex_key] = /(?:\s|^)#{expression}(\d+)\.(\d+)(?:\s|$)/
|
|
57
|
+
end
|
|
58
|
+
hash
|
|
59
|
+
end
|
|
60
|
+
CURRENCIES = CURRENCIES_SIMPLE.merge(CURRENCIES_COMPLEX)
|
|
61
|
+
|
|
62
|
+
HTML_ENTITIES = Proc.new(){
|
|
63
|
+
base = {
|
|
64
|
+
amp: %w{#38 amp},
|
|
65
|
+
cent: %w{#162 cent},
|
|
66
|
+
copy: %w{#169 copy},
|
|
67
|
+
deg: %w{#176 deg},
|
|
68
|
+
divide: %w{#247 divide},
|
|
69
|
+
double_quote: %w{#34 #822[012] quot ldquo rdquo dbquo},
|
|
70
|
+
ellipsis: %w{#8230 hellip},
|
|
71
|
+
en_dash: %w{#8211 ndash},
|
|
72
|
+
em_dash: %w{#8212 mdash},
|
|
73
|
+
frac14: %w{#188 frac14},
|
|
74
|
+
frac12: %w{#189 frac12},
|
|
75
|
+
frac34: %w{#190 frac34},
|
|
76
|
+
gt: %w{#62 gt},
|
|
77
|
+
lt: %w{#60 lt},
|
|
78
|
+
nbsp: %w{#160 nbsp},
|
|
79
|
+
pound: %w{#163 pound},
|
|
80
|
+
reg: %w{#174 reg},
|
|
81
|
+
single_quote: %w{#39 #821[678] apos lsquo rsquo sbquo},
|
|
82
|
+
times: %w{#215 times},
|
|
83
|
+
trade: %w{#8482 trade},
|
|
84
|
+
yen: %w{#165 yen},
|
|
85
|
+
}
|
|
86
|
+
base.inject({}) do |hash, content|
|
|
87
|
+
key, expression = content
|
|
88
|
+
hash[key] = /&(#{expression.join('|')});/
|
|
89
|
+
hash
|
|
90
|
+
end
|
|
91
|
+
}.call
|
|
92
|
+
|
|
93
|
+
HTML_TAG = Proc.new(){
|
|
94
|
+
name = /[\w:-]+/
|
|
95
|
+
value = /([A-Za-z0-9]+|('[^']*?'|"[^"]*?"))/
|
|
96
|
+
attr = /(#{name}(\s*=\s*#{value})?)/
|
|
97
|
+
/<[!\/?\[]?(#{name}|--)(\s+(#{attr}(\s+#{attr})*))?\s*([!\/?\]]+|--)?>/
|
|
98
|
+
}.call
|
|
99
|
+
|
|
100
|
+
SMART_PUNCTUATION = {
|
|
101
|
+
/(“|”|\302\223|\302\224|\303\222|\303\223)/ => '"',
|
|
102
|
+
/(‘|’|\302\221|\302\222|\303\225)/ => "'",
|
|
103
|
+
/…/ => "...",
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
UNREADABLE_CONTROL_CHARACTERS = /[[:cntrl:]]/
|
|
107
|
+
|
|
108
|
+
# Ordered by denominator then numerator of the value
|
|
109
|
+
VULGAR_FRACTIONS = {
|
|
110
|
+
half: /(½|½|½)/,
|
|
111
|
+
one_third: /(⅓|⅓)/,
|
|
112
|
+
two_thirds: /(⅔|⅔)/,
|
|
113
|
+
one_fourth: /(¼|¼|¼)/,
|
|
114
|
+
three_fourths: /(¾|¾|¾)/,
|
|
115
|
+
one_fifth: /(⅕|⅕)/,
|
|
116
|
+
two_fifths: /(⅖|⅖)/,
|
|
117
|
+
three_fifths: /(⅗|⅗)/,
|
|
118
|
+
four_fifths: /(⅘|⅘)/,
|
|
119
|
+
one_sixth: /(⅙|⅙)/,
|
|
120
|
+
five_sixths: /(⅚|⅚)/,
|
|
121
|
+
one_eighth: /(⅛|⅛)/,
|
|
122
|
+
three_eighths: /(⅜|⅜)/,
|
|
123
|
+
five_eighths: /(⅝|⅝)/,
|
|
124
|
+
seven_eighths: /(⅞|⅞)/,
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
WHITESPACE = /\s+/
|
|
128
|
+
|
|
129
|
+
class << self
|
|
130
|
+
%w{
|
|
131
|
+
abbreviation
|
|
132
|
+
accented_html_entity
|
|
133
|
+
apostrophe
|
|
134
|
+
characters
|
|
135
|
+
cleanup_characters
|
|
136
|
+
cleanup_html_entities
|
|
137
|
+
currencies
|
|
138
|
+
currencies_simple
|
|
139
|
+
currencies_complex
|
|
140
|
+
html_entities
|
|
141
|
+
html_tag
|
|
142
|
+
smart_punctuation
|
|
143
|
+
unreadable_control_characters
|
|
144
|
+
vulgar_fractions
|
|
145
|
+
whitespace
|
|
146
|
+
}.each do |conversion_type|
|
|
147
|
+
define_method conversion_type do
|
|
148
|
+
const_get conversion_type.upcase
|
|
149
|
+
end
|
|
150
|
+
end
|
|
151
|
+
end
|
|
152
|
+
end
|
|
153
|
+
end
|
|
154
|
+
end
|