twemoji 2.2.2 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7bfc436e640e850f7fdc7824e7826b16f56edf66
4
- data.tar.gz: 11b979a61a808f37fa9de4da1e2f60cf99ac4cd5
3
+ metadata.gz: ca77ba3081ece95f9a99dd12cea08feb0d46dd52
4
+ data.tar.gz: f9062643a1cd0b4c95ecc7a7049f15c940b3de18
5
5
  SHA512:
6
- metadata.gz: 913f9e546e2c208bbdd97de077cd321d07d77e0df4f3734b1d730efbdf54a9afc1060a3ca74f614c422524c53bf4f5dfb3ee5e56552274a2b054702e017a3a91
7
- data.tar.gz: 3c59d86cbbd347618a05c5f450a224ef9ce6c6e7f60f8de811d78cb872c4c20d94f28fe21d989f7a454e397094e590a89f3dac216d5ab5351f6c456363d09b57
6
+ metadata.gz: a7ee8617d645cae1cc5af9e2a7e623c3acd2e770e6162ddcb82c91fa7f38da08831aeab500441d6960a9751d3a90e72ea61b90a02705e6057b2d4335d7e20b17
7
+ data.tar.gz: fbc093472b082ba45a89fc3cd6fc9a5562c4ece473ed4fb74b6ff1ff0bce21d77dbffb7597ce54e2ebf0e30fff77f50927bc502fb4094b968bf57b5b934cbcae
@@ -1,13 +1,17 @@
1
1
  language: ruby
2
- sudo: false
3
2
  bundler_args: "--retry=3 --jobs=3"
3
+ cache: bundler
4
+ sudo: false
4
5
  rvm:
5
- - 2.0
6
- - 2.1
6
+ - 2.3.1
7
+ - 2.3.0
7
8
  - 2.2
9
+ - 2.1
10
+ - 2.0
8
11
  - ruby-head
9
12
  matrix:
10
13
  allow_failures:
14
+ - rvm: 2.0
11
15
  - rvm: ruby-head
12
16
  fast_finish: true
13
17
  notifications:
@@ -2,9 +2,40 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
- ## 2.2.2 - 2016.06.09
5
+ ## 3.0.0 - 2016.06.08
6
6
 
7
- - Backport [051f5a5](https://github.com/jollygoodcode/twemoji/commit/051f5a57c40f24d8d5caa65b462a9bee01545412) (find by multiple unicodes fix)
7
+ ### Features
8
+
9
+ - Add support to twemoji.js V2
10
+ - Add `Twemoji.svg` (not loaded by default), looks like:
11
+
12
+ ```ruby
13
+ {
14
+ ...
15
+ ":heart_eyes:" => "https://twemoji.maxcdn.com/2/svg/1f60d.svg",
16
+ ...
17
+ }
18
+ ```
19
+
20
+ - Add `Twemoji.png` (not loaded by default), looks like:
21
+
22
+ ```ruby
23
+ {
24
+ ...
25
+ ":heart_eyes:" => "https://twemoji.maxcdn.com/2/72x72/1f60d.png",
26
+ ...
27
+ }
28
+ ```
29
+
30
+ ### Breaking Changes
31
+
32
+ - Require Ruby 2.0+
33
+ - `Twemoji::CODES` changes to `Twemoji.codes`
34
+ - `Twemoji::ICODES` changes to `Twemoji.invert_codes`
35
+ - `asset_root` config default value changed to `https://twemoji.maxcdn.com/2`
36
+ - `file_ext` config default value changed to `svg`, available values are `"svg"` and `"png"`
37
+ - PNG now only has one size `72x72`
38
+ - Remove `Twemoji.to_json` method
8
39
 
9
40
  ## 2.2.1 - 2016.06.07
10
41
 
data/Gemfile CHANGED
@@ -1,4 +1,4 @@
1
- source 'https://rubygems.org'
1
+ source "https://rubygems.org"
2
2
 
3
3
  # Specify your gem's dependencies in twemoji.gemspec
4
4
  gemspec
data/README.md CHANGED
@@ -14,6 +14,11 @@ This RubyGem `twemoji` is a minimum implementation of Twitter Emoji in Ruby so t
14
14
 
15
15
  __Note:__ This gem might not implement all the features available in the JavaScript implementation.
16
16
 
17
+ ## Twemoji Gem and twemoji.js versions
18
+
19
+ - Twemoji Gem 3.x supports twemoji.js V2 (1661 emojis)
20
+ - Twemoji Gem 2.x supports twemoji.js V1 (874 emojis)
21
+
17
22
  ## Installation
18
23
 
19
24
  Add this line to your application's Gemfile:
@@ -30,14 +35,6 @@ Or install it yourself as:
30
35
 
31
36
  $ gem install twemoji
32
37
 
33
- ### Ruby 1.9.3 Support
34
-
35
- @bramswenson has put in effort to support Ruby 1.9.3, please use [his forked branch](https://github.com/bramswenson/twemoji/tree/ruby-1.9.3):
36
-
37
- ```ruby
38
- gem "twemoji", github: "bramswenson/twemoji", branch: "ruby-1.9.3"
39
- ```
40
-
41
38
  ## Integration
42
39
 
43
40
  - [Integration with `HTML::Pipeline`](https://github.com/jollygoodcode/twemoji/wiki/Integrate-with-HTML%3A%3APipeline)
@@ -57,13 +54,13 @@ end
57
54
  In your ERb view:
58
55
 
59
56
  ```erb
60
- <%= emojify "I like chocolate :heart_eyes:!", image_size: "36x36" %>
57
+ <%= emojify "I like chocolate :heart_eyes:!" %>
61
58
  ```
62
59
 
63
60
  will render
64
61
 
65
62
  ```
66
- I like chocolate <img class="emoji" draggable="false" title=":heart_eyes:" alt="😍" src="https://twemoji.maxcdn.com/36x36/1f60d.png">!
63
+ I like chocolate <img class="emoji" draggable="false" title=":heart_eyes:" alt="😍" src="https://twemoji.maxcdn.com/2/72x72/1f60d.png">!
67
64
  ```
68
65
 
69
66
  More options could be passed in, please see [Twemoji.parse options](https://github.com/jollygoodcode/twemoji#twemojiparse-options) for more details.
@@ -123,38 +120,29 @@ More options could be passed in, please see [Twemoji.parse options](https://gith
123
120
 
124
121
  ```ruby
125
122
  > Twemoji.parse "I like chocolate :heart_eyes:!"
126
- => "I like chocolate <img class='emoji' draggable='false' title=':heart_eyes:' alt='😍' src='https://twemoji.maxcdn.com/16x16/1f60d.png'>!"
123
+ => 'I like chocolate <img draggable="false" title=":heart_eyes:" alt="😍" src="https://twemoji.maxcdn.com/2/svg/1f60d.svg" class="emoji">!'
127
124
  ```
128
125
 
129
126
  ##### `Twemoji.parse` options
130
127
 
131
128
  ##### `asset_root`
132
129
 
133
- Default assets root url. Defaults to `https://twemoji.maxcdn.com/`:
130
+ Default assets root url. Defaults to `https://twemoji.maxcdn.com/2/`:
134
131
 
135
132
  ```ruby
136
- > Twemoji.parse 'I like chocolate :heart_eyes:!', asset_root: "foocdn.com"
137
- => "I like chocolate <img class='emoji' draggable='false' title=':heart_eyes:' alt='😍' src='foocdn.com/16x16/1f60d.png'>!"
133
+ > Twemoji.parse "I like chocolate :heart_eyes:!", asset_root: "foocdn.com"
134
+ => 'I like chocolate <img draggable="false" title=":heart_eyes:" alt="😍" src="foocdn.com/svg/1f60d.svg" class="emoji">!'
138
135
  ```
139
136
 
140
137
  ##### `file_ext`
141
138
 
142
- Default assets file extensions. Defaults to `.png`.
139
+ Default assets file extensions. Defaults to `svg`.
143
140
 
144
- ```ruby
145
- > Twemoji.parse 'I like chocolate :heart_eyes:!', file_ext: ".svg"
146
- => "I like chocolate <img class='emoji' draggable='false' title=':heart_eyes:' alt='😍' src='https://twemoji.maxcdn.com/svg/1f60d.svg'>!"
147
- ```
148
-
149
- ##### `image_size`
150
-
151
- Default assets/folder size. Defaults to `"16x16"`.
152
-
153
- Sizes available via Twitter CDN: `16`, `36`, `72`.
141
+ Can change to `"png"`:
154
142
 
155
143
  ```ruby
156
- > Twemoji.parse 'I like chocolate :heart_eyes:!', image_size: "72x72"
157
- => "I like chocolate <img class='emoji' draggable='false' title=':heart_eyes:' alt='😍' src='https://twemoji.maxcdn.com/72x72/1f60d.png'>!"
144
+ > Twemoji.parse 'I like chocolate :heart_eyes:!', file_ext: "png"
145
+ => 'I like chocolate <img draggable="false" title=":heart_eyes:" alt="😍" src="https://twemoji.maxcdn.com/2/72x72/1f60d.png" class="emoji">!'
158
146
  ```
159
147
 
160
148
  ##### `class_name`
@@ -162,8 +150,8 @@ Sizes available via Twitter CDN: `16`, `36`, `72`.
162
150
  Default image CSS class name. Defaults to `"emoji"`.
163
151
 
164
152
  ```ruby
165
- > Twemoji.parse 'I like chocolate :heart_eyes:!', class_name: "superemoji"
166
- => "I like chocolate <img class='superemoji' draggable='false' title=':heart_eyes:' alt='😍' src='https://twemoji.maxcdn.com/16x16/1f60d.png'>!"
153
+ > Twemoji.parse "I like chocolate :heart_eyes:!", class_name: "superemoji"
154
+ => 'I like chocolate <img draggable="false" title=":heart_eyes:" alt="😍" src="https://twemoji.maxcdn.com/2/svg/1f60d.svg" class="superemoji">!'
167
155
  ```
168
156
 
169
157
  ##### `img_attrs`
@@ -171,8 +159,8 @@ Default image CSS class name. Defaults to `"emoji"`.
171
159
  List of image attributes for the `img` tag. Optional.
172
160
 
173
161
  ```ruby
174
- > Twemoji.parse("I like chocolate :heart_eyes:!", class_name: 'twemoji', img_attrs: { style: "height: 1.3em;" })
175
- => "I like chocolate <img class='twemoji' draggable='false' title=':heart_eyes:' alt='😍' style='height: 1.3em;' src='https://twemoji.maxcdn.com/16x16/1f60d.png'>!"
162
+ > Twemoji.parse "I like chocolate :heart_eyes:!", class_name: "twemoji", img_attrs: { style: "height: 1.3em;" }
163
+ => 'I like chocolate <img draggable="false" title=":heart_eyes:" alt="😍" src="https://twemoji.maxcdn.com/2/svg/1f60d.svg" class="twemoji" style="height: 1.3em;">!'
176
164
  ```
177
165
 
178
166
  attribute value can apply proc-like object, remove `:` from title attribute:
@@ -180,58 +168,100 @@ attribute value can apply proc-like object, remove `:` from title attribute:
180
168
  ```ruby
181
169
  > no_colons = ->(name) { name.gsub(":", "") }
182
170
 
183
- > Twemoji.parse("I like chocolate :heart_eyes:!", class_name: 'twemoji', img_attrs: { title: no_colons })
184
- => "I like chocolate <img class='twemoji' draggable='false' title='heart_eyes' alt='😍' src='https://twemoji.maxcdn.com/16x16/1f60d.png'>!"
171
+ > Twemoji.parse "I like chocolate :heart_eyes:!", class_name: "twemoji", img_attrs: { title: no_colons }
172
+ => 'I like chocolate <img draggable="false" title="heart_eyes" alt="😍" src="https://twemoji.maxcdn.com/2/svg/1f60d.svg" class="twemoji">!'
185
173
  ```
186
174
 
187
175
  #### `Twemoji.emoji_pattern`
188
176
 
189
177
  ```ruby
190
178
  > Twemoji.emoji_pattern
191
- => /(:smile:|:laughing:| ... |:womens:|:x:|:zero:)/
179
+ => /(:mahjong:|:black_joker:| ... |:registered_sign:|:shibuya:)/
192
180
  ```
193
181
 
194
- #### `Twemoji.to_json`
182
+ #### JSON for your front-end
195
183
 
196
- Returns emoji json, example of output:
184
+ We prepare two constants: [Twemoji::PNG](lib/twemoji/png.rb) and [Twemoji::SVG](lib/twemoji/svg.rb) (**not loaded by default**), you need to require them to use:
197
185
 
198
- ```json
199
- {
200
- ...
201
- ":heart_eyes:": "https://twemoji.maxcdn.com/svg/1f60d.svg"
202
- ...
203
- }
186
+ ```ruby
187
+ require "twemoji/png" # If you want to use Twemoji::PNG
188
+ require "twemoji/svg" # If you want to use Twemoji::SVG
204
189
  ```
205
190
 
206
- Support `svg` or `png`, `png` can specify size from `16x16`, `36x36` or `72x72`.
191
+ Or require at `Gemfile`:
207
192
 
208
193
  ```ruby
209
- > Twemoji.to_json(file_ext: "svg")
194
+ # Require the one you need, require Twemoji::PNG
195
+ gem "twemoji", require: "twemoji/png"
196
+
197
+ # Or Twemoji::SVG
198
+ gem "twemoji", require: "twemoji/svg"
199
+
200
+ # Or both
201
+ gem "twemoji", require: ["twemoji/png", "twemoji/svg"]
202
+ ```
210
203
 
211
- > Twemoji.to_json(file_ext: "png", image_size: "16x16")
204
+ Then you can do `to_json` to feed your front-end.
212
205
 
213
- > Twemoji.to_json(file_ext: "png", image_size: "36x36")
206
+ You can also make custom format by leverage `Twemoji.codes`:
214
207
 
215
- > Twemoji.to_json(file_ext: "png", image_size: "72x72")
208
+ ```html+erb
209
+ # emojis.json.erb
210
+ <%= Twemoji.codes.collect do |code, _|
211
+ Hash(
212
+ value: code,
213
+ html: content_tag(:span, Twemoji.parse(code).html_safe + " #{code}" )
214
+ )
215
+ end.to_json.html_safe %>
216
216
  ```
217
217
 
218
218
  ## Configuration
219
219
 
220
- `Twemoji.parse` options can be given in configure block:
220
+ `Twemoji.parse` options can be given in configure block, default values are:
221
221
 
222
222
  ```ruby
223
223
  Twemoji.configure do |config|
224
- config.asset_root = "https://twemoji.awesomecdn.com/"
225
- config.file_ext = ".svg"
226
- config.image_size = nil # only png need to set size
227
- config.class_name = "twemoji"
228
- config.img_attrs = { style: "height: 1.3em;" }
224
+ config.asset_root = "https://twemoji.maxcdn.com/2"
225
+ config.file_ext = "svg"
226
+ config.class_name = "emoji"
227
+ config.img_attrs = {}
229
228
  end
230
229
  ```
231
230
 
231
+ Specify additional img attributes like so:
232
+
233
+ ```ruby
234
+ config.img_attrs = { style: "height: 1.3em;" }
235
+ ```
236
+
237
+ ## Tips (from twitter/twemoji)
238
+
239
+ ### Inline Styles
240
+
241
+ If you'd like to size the emoji according to the surrounding text, you can add the following CSS to your stylesheet:
242
+
243
+ ```css
244
+ img.emoji {
245
+ height: 1em;
246
+ width: 1em;
247
+ margin: 0 .05em 0 .1em;
248
+ vertical-align: -0.1em;
249
+ }
250
+ ```
251
+
252
+ This will make sure emoji derive their width and height from the font-size of the text they're shown with. It also adds just a little bit of space before and after each emoji, and pulls them upwards a little bit for better optical alignment.
253
+
254
+ ### UTF-8 Character Set
255
+
256
+ To properly support emoji, the document character must be set to UTF-8. This can done by including the following meta tag in the document <head>
257
+
258
+ ```html
259
+ <meta charset="utf-8">
260
+ ```
261
+
232
262
  ## Attribution Requirements
233
263
 
234
- Please follow the [Attribution Requirements](https://github.com/twitter/twemoji#attribution-requirements) as stated on the official Twemoji (JS) repo.
264
+ **IMPORTANT:** Please follow the [Attribution Requirements](https://github.com/twitter/twemoji#attribution-requirements) as stated on the official Twemoji (JS) repo.
235
265
 
236
266
  ## Contributing
237
267
 
@@ -241,6 +271,8 @@ Please see the [CONTRIBUTING.md](/CONTRIBUTING.md) file.
241
271
 
242
272
  A huge THANK YOU to all our [contributors](https://github.com/jollygoodcode/twemoji/graphs/contributors)! :heart:
243
273
 
274
+ The emoji keywords are from [jollygoodcode/emoji-keywords](https://github.com/jollygoodcode/emoji-keywords).
275
+
244
276
  ## License
245
277
 
246
278
  Please see the [LICENSE.md](/LICENSE.md) file.
data/Rakefile CHANGED
@@ -4,7 +4,7 @@ require "rake/testtask"
4
4
 
5
5
  Rake::TestTask.new do |t|
6
6
  t.libs << "test"
7
- t.test_files = FileList['test/**/*_test.rb']
7
+ t.test_files = FileList["test/**/*_test.rb"]
8
8
  t.verbose = true
9
9
  end
10
10
 
@@ -1,8 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "nokogiri"
2
4
  require "json"
3
5
  require "twemoji/version"
4
6
  require "twemoji/map"
5
- require "twemoji/json"
6
7
  require "twemoji/configuration"
7
8
 
8
9
  # Twemoji is a Ruby implementation, parses your text, replace emoji text
@@ -12,7 +13,7 @@ module Twemoji
12
13
  #
13
14
  # @example Usage
14
15
  # Twemoji.find_by(text: ":heart_eyes:") # => "1f60d"
15
- # Twemoji.find_by(code: ":1f60d:") # => ":heart_eyes:"
16
+ # Twemoji.find_by(code: "1f60d") # => ":heart_eyes:"
16
17
  # Twemoji.find_by(unicode: "😍") # => ":heart_eyes:"
17
18
  # Twemoji.find_by(unicode: "\u{1f60d}") # => ":heart_eyes:"
18
19
  #
@@ -45,7 +46,7 @@ module Twemoji
45
46
  # @param text [String] Text to find emoji code.
46
47
  # @return [String] Emoji Code.
47
48
  def self.find_by_text(text)
48
- CODES[must_str(text)]
49
+ codes[must_str(text)]
49
50
  end
50
51
 
51
52
  # Find emoji text by emoji code.
@@ -57,7 +58,7 @@ module Twemoji
57
58
  # @param code [String] Emoji code to find text.
58
59
  # @return [String] Emoji Text.
59
60
  def self.find_by_code(code)
60
- ICODES[must_str(code)]
61
+ invert_codes[must_str(code)]
61
62
  end
62
63
 
63
64
  # Find emoji text by raw emoji unicode.
@@ -69,7 +70,7 @@ module Twemoji
69
70
  # @param raw [String] Emoji raw unicode to find text.
70
71
  # @return [String] Emoji Text.
71
72
  def self.find_by_unicode(raw)
72
- ICODES[must_str(raw.split("").map { |r| "%4.4x" % r.ord }.join("-"))]
73
+ invert_codes[raw.split("").map { |r| "%4.4x" % r.ord }.join("-")]
73
74
  end
74
75
 
75
76
  # Render raw emoji unicode from emoji text or emoji code.
@@ -92,26 +93,24 @@ module Twemoji
92
93
  #
93
94
  # @example Usage
94
95
  # Twemoji.parse("I like chocolate :heart_eyes:!")
95
- # => "I like chocolate <img class='emoji' draggable='false' title=':heart_eyes:' alt='😍' src='https://twemoji.maxcdn.com/16x16/1f60d.png'>!"
96
+ # => 'I like chocolate <img draggable="false" title=":heart_eyes:" alt="😍" src="https://twemoji.maxcdn.com/2/svg/1f60d.svg" class="emoji">!'
96
97
  #
97
98
  # @param text [String] Source text to parse.
98
99
  #
99
100
  # @option options [String] (optional) asset_root Asset root url to serve emoji.
100
101
  # @option options [String] (optional) file_ext File extension.
101
- # @option options [String] (optional) image_size Emoji image's size 16, 36, 72 applicable if specify .png.
102
- # @option options [String] (optional) img_attrs Emoji image's img tag attributes.
102
+ # @option options [String] (optional) class_name Emoji image's tag class attribute.
103
+ # @option options [String] (optional) img_attrs Emoji image's img tag attributes.
103
104
  #
104
105
  # @return [String] Original text with all occurrences of emoji text
105
106
  # replaced by emoji image according to given options.
106
107
  def self.parse(text, asset_root: Twemoji.configuration.asset_root,
107
108
  file_ext: Twemoji.configuration.file_ext,
108
- image_size: Twemoji.configuration.image_size,
109
109
  class_name: Twemoji.configuration.class_name,
110
110
  img_attrs: Twemoji.configuration.img_attrs)
111
111
 
112
112
  options[:asset_root] = asset_root
113
113
  options[:file_ext] = file_ext
114
- options[:image_size] = image_size
115
114
  options[:img_attrs] = { class: class_name }.merge! img_attrs
116
115
 
117
116
  if text.is_a?(Nokogiri::HTML::DocumentFragment)
@@ -125,36 +124,7 @@ module Twemoji
125
124
  #
126
125
  # @return [RegExp] A Regular expression consists of all emojis text.
127
126
  def self.emoji_pattern
128
- @emoji_pattern ||= /(#{CODES.keys.map { |name| Regexp.quote(name) }.join("|") })/
129
- end
130
-
131
- # Return Twemoji json string, unicode => twemoji CDN url
132
- #
133
- # @example Output
134
- # {
135
- # ":heart_eyes:": "https://twemoji.maxcdn.com/svg/1f60d.svg"
136
- # }
137
- #
138
- # option [String] (optional) :file_ext - image extension: svg or png
139
- # option [String] (optional) :image_size - if file_ext is png, can choose size of png from
140
- # "16x16", "32x32", "72x72"
141
- # @return [String] Twemoji json string
142
- def self.to_json(file_ext: "png", image_size: "16x16")
143
- output = if file_ext == "svg"
144
- Twemoji::SVG
145
- elsif file_ext == "png"
146
- case image_size
147
- when "16x16" then Twemoji::PNG_16x16
148
- when "36x36" then Twemoji::PNG_36x36
149
- when "72x72" then Twemoji::PNG_72x72
150
- else
151
- fail %(Unsupported png image size: `#{image_size}', supported: "16x16", "36x36", "72x72".)
152
- end
153
- else
154
- fail %(Unsupported file extension: `#{file_ext}', supported: "png" and "svg".)
155
- end
156
-
157
- output.to_json
127
+ @emoji_pattern ||= /(#{codes.keys.map { |name| Regexp.quote(name) }.join("|") })/
158
128
  end
159
129
 
160
130
  private
@@ -194,7 +164,7 @@ module Twemoji
194
164
  # @return [Nokogiri::HTML::DocumentFragment] Parsed document.
195
165
  # @private
196
166
  def self.parse_document(doc)
197
- doc.xpath('.//text() | text()').each do |node|
167
+ doc.xpath(".//text() | text()").each do |node|
198
168
  content = node.to_html
199
169
  next if !content.include?(":")
200
170
  next if has_ancestor?(node, %w(pre code tt))
@@ -240,6 +210,9 @@ module Twemoji
240
210
  %(<img #{hash_to_html_attrs(img_attrs_hash)}>)
241
211
  end
242
212
 
213
+ PNG_IMAGE_SIZE = "72x72"
214
+ private_constant :PNG_IMAGE_SIZE
215
+
243
216
  # Returns emoji url by given name and options from `Twemoji.parse`.
244
217
  #
245
218
  # @param name [String] Emoji name to generate image url.
@@ -248,9 +221,9 @@ module Twemoji
248
221
  def self.emoji_url(name)
249
222
  code = find_by_text(name)
250
223
 
251
- if options[:file_ext] == ".png"
252
- File.join(options[:asset_root], options[:image_size], "#{code}.png")
253
- elsif options[:file_ext] == ".svg"
224
+ if options[:file_ext] == "png"
225
+ File.join(options[:asset_root], PNG_IMAGE_SIZE, "#{code}.png")
226
+ elsif options[:file_ext] == "svg"
254
227
  File.join(options[:asset_root], "svg", "#{code}.svg")
255
228
  else
256
229
  fail "Unsupported file extension: #{options[:file_ext]}"