distorted-floor 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (61) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +661 -0
  3. data/README.md +32 -0
  4. data/bin/distorted-floor +16 -0
  5. data/bin/repl +14 -0
  6. data/bin/setup +8 -0
  7. data/font/1252/LICENSE/MoreLessPerfectDOSVGA437/img/Less_Perfect_DOS_VGA.png +0 -0
  8. data/font/1252/LICENSE/MoreLessPerfectDOSVGA437/img/More_Perfect_DOS_VGA.png +0 -0
  9. data/font/1252/LICENSE/MoreLessPerfectDOSVGA437/img/Perfect_DOS_VGA.png +0 -0
  10. data/font/1252/LICENSE/MoreLessPerfectDOSVGA437/less_more_perfect_dos_vga_437.html +52 -0
  11. data/font/1252/LICENSE/PerfectDOSVGA437/font-comment.php@file=perfect_dos_vga_437.html +5 -0
  12. data/font/1252/LessPerfectDOSVGA.ttf +0 -0
  13. data/font/1252/MorePerfectDOSVGA.ttf +0 -0
  14. data/font/1252/Perfect DOS VGA 437 Win.ttf +0 -0
  15. data/font/437/Perfect DOS VGA 437.ttf +0 -0
  16. data/font/437/dos437.txt +72 -0
  17. data/font/65001/Anonymous Pro B.ttf +0 -0
  18. data/font/65001/Anonymous Pro BI.ttf +0 -0
  19. data/font/65001/Anonymous Pro I.ttf +0 -0
  20. data/font/65001/Anonymous Pro.ttf +0 -0
  21. data/font/65001/LICENSE/AnonymousPro/FONTLOG.txt +45 -0
  22. data/font/65001/LICENSE/AnonymousPro/OFL-FAQ.txt +235 -0
  23. data/font/65001/LICENSE/AnonymousPro/OFL.txt +94 -0
  24. data/font/65001/LICENSE/AnonymousPro/README.txt +55 -0
  25. data/font/850/ProFont-Bold-01/LICENSE +22 -0
  26. data/font/850/ProFont-Bold-01/readme.txt +28 -0
  27. data/font/850/ProFontWindows-Bold.ttf +0 -0
  28. data/font/850/ProFontWindows.ttf +0 -0
  29. data/font/850/Profont/LICENSE +22 -0
  30. data/font/850/Profont/readme.txt +31 -0
  31. data/font/932/LICENSE/README-ttf.txt +213 -0
  32. data/font/932/mona.ttf +0 -0
  33. data/lib/distorted-floor/checking_you_out.rb +78 -0
  34. data/lib/distorted-floor/click_again.rb +406 -0
  35. data/lib/distorted-floor/element_of_media/change.rb +114 -0
  36. data/lib/distorted-floor/element_of_media/compound.rb +120 -0
  37. data/lib/distorted-floor/element_of_media.rb +2 -0
  38. data/lib/distorted-floor/error_code.rb +55 -0
  39. data/lib/distorted-floor/floor.rb +17 -0
  40. data/lib/distorted-floor/invoker.rb +100 -0
  41. data/lib/distorted-floor/media_molecule/font.rb +200 -0
  42. data/lib/distorted-floor/media_molecule/image.rb +33 -0
  43. data/lib/distorted-floor/media_molecule/pdf.rb +45 -0
  44. data/lib/distorted-floor/media_molecule/svg.rb +46 -0
  45. data/lib/distorted-floor/media_molecule/text.rb +247 -0
  46. data/lib/distorted-floor/media_molecule/video.rb +21 -0
  47. data/lib/distorted-floor/media_molecule.rb +58 -0
  48. data/lib/distorted-floor/modular_technology/gstreamer.rb +175 -0
  49. data/lib/distorted-floor/modular_technology/pango.rb +90 -0
  50. data/lib/distorted-floor/modular_technology/ttfunk.rb +48 -0
  51. data/lib/distorted-floor/modular_technology/vips/ffi.rb +66 -0
  52. data/lib/distorted-floor/modular_technology/vips/load.rb +174 -0
  53. data/lib/distorted-floor/modular_technology/vips/operatio$.rb +268 -0
  54. data/lib/distorted-floor/modular_technology/vips/save.rb +135 -0
  55. data/lib/distorted-floor/modular_technology/vips.rb +17 -0
  56. data/lib/distorted-floor/monkey_business/encoding.rb +374 -0
  57. data/lib/distorted-floor/monkey_business/hash.rb +18 -0
  58. data/lib/distorted-floor/monkey_business/set.rb +15 -0
  59. data/lib/distorted-floor/monkey_business/string.rb +6 -0
  60. data/lib/distorted-floor.rb +2 -0
  61. metadata +215 -0
@@ -0,0 +1,374 @@
1
+ require 'set'
2
+
3
+ ## Adds better support to Ruby's Encoding class for IBM/Microsoft-style numeric codepage IDs:
4
+ # - Adds a `:code_page` method on any instance of Encoding, returning the Integer codepage ID.
5
+ # - Adds a `:page_code` singleton method on :Encoding, returning the Encoding instance for any Integer codepage ID.
6
+ # - Patches Encoding::find() to add Integer and numeric-String find() support using :page_code.
7
+ # - Adds a `:code_page_orphans` singleton method on :Encoding, returning a Set of built-in Encodings that
8
+ # do not have a corresponding built-in `:CP<####>` name/constant.
9
+ # - Includes many additional numeric codepage IDs based on information
10
+ # from IANA, Unicode Consortium, OS vendors, and some of my own speculation.
11
+
12
+ ## This is similar in effect (but not in implementation) to the 'encoding-codepage' Gem:
13
+ # https://github.com/ConradIrwin/encoding-codepage
14
+ # My choice of method name `:code_page` was intentional to avoid conflict with this Gem's `:codepage`.
15
+
16
+
17
+ ## Notes-To-Self about Encoding (the class I'm patching) and encodings in general:
18
+
19
+ ## Unicode Normalization Forms
20
+ #
21
+ # - Canonical composed (NFC) and decomposed (NFD) forms.
22
+ # - Non-canonical composed (NFKC) and decomposed (NFKD) forms.
23
+ #
24
+ # "For example, form C uses the single Unicode code point "Ä" (U+00C4),
25
+ # while form D uses ("A" + "¨", that is U+0041 U+0308).
26
+ # These render identically, because "¨" (U+0308) is a combining character."
27
+ #
28
+ # http://www.unicode.org/faq/normalization.html
29
+ # http://www.unicode.org/reports/tr15/
30
+ # https://docs.microsoft.com/en-us/windows/win32/intl/using-unicode-normalization-to-represent-strings
31
+ # https://en.wikipedia.org/wiki/Precomposed_character
32
+ # https://en.wikipedia.org/wiki/Unicode_equivalence
33
+ #
34
+ # HFS+ is a notable outlier among filesystems by requiring decomposed form (actually 'UTF-8-Mac' variant).
35
+
36
+ ## Ruby includes a lot of the desired codepoint ID data built-in,
37
+ # but in the form of String alias names for Encoding instances,
38
+ # e.g. KOI8-R is also codepage 878:
39
+ #
40
+ # irb> Encoding::KOI8_R.names
41
+ # => ["KOI8-R", "CP878"]
42
+ #
43
+ # irb> Encoding::KOI8_R.names.any?{ |n| n =~ /^(CP|IBM|Windows[-_])(?<code_page>\d{3,}$)/ }
44
+ # => true
45
+ # irb> Regexp.last_match
46
+ # => #<MatchData "CP878" code_page:"878">
47
+ #
48
+ # My code defers to this built-in data where possible instead of doing
49
+ # a complete import of the Microsoft identifiers like the Gem.
50
+
51
+
52
+ ## Some encodings have both generic and vendor-prefixed names,
53
+ ## and some are canonically one or the other, e.g.:
54
+ #
55
+ # irb> Encoding::IBM437
56
+ # => #<Encoding:IBM437>
57
+ # irb> Encoding::CP437
58
+ # => #<Encoding:IBM437>
59
+ #
60
+ # irb> Encoding::IBM850
61
+ # => #<Encoding:CP850>
62
+ # irb> Encoding::CP850
63
+ # => #<Encoding:CP850>
64
+
65
+
66
+ class Encoding
67
+
68
+ # Define a Regexp to match and extract Ruby's built-in numeric codepage IDs
69
+ # from thir Encoding's names.
70
+ #
71
+ # Using IGNORECASE to handle the duplicate differing-capitalization constants,
72
+ # e.g. Encoding::WINDOWS_31J and Encoding::Windows_31J both exist and are equivalent.
73
+ #
74
+ # Worth mentioning since this file deals with Encoding,
75
+ # but the Regexp itself also has an internal Encoding that can be changed
76
+ # if I had any reason to (I don't):
77
+ # https://ruby-doc.org/core/Regexp.html#class-Regexp-label-Encoding
78
+ CODE_PAGE_ENCODING_NAME = Regexp.new('^(CP|IBM|Windows[-_])(?<code_page>\d{3,}$)', Regexp::IGNORECASE)
79
+
80
+ # Data sources:
81
+ # https://www.aivosto.com/articles/charsets-codepages.html
82
+ # https://developer.apple.com/documentation/coreservices/1400434-ms-dos_and_windows_text_encodings
83
+ # https://docs.microsoft.com/en-us/windows/win32/intl/code-page-identifiers
84
+ # https://en.wikipedia.org/wiki/CCSID
85
+ # https://github.com/SheetJS/js-codepage/blob/master/codepage.md
86
+ # https://i18nqa.com/debug/table-iso8859-1-vs-windows-1252.html
87
+ # https://www.gammon.com.au/unicode/
88
+ ADDITIONAL_ENCODING_CODE_PAGE_IDS = {
89
+
90
+ # Burgerland :911:
91
+ Encoding::US_ASCII => 20127,
92
+
93
+ # Unicode
94
+ Encoding::UTF_16LE => 1200,
95
+ Encoding::UTF_16BE => 1201,
96
+ Encoding::UTF_32LE => 12000,
97
+ Encoding::UTF_32BE => 12001,
98
+
99
+ ## 245
100
+ #
101
+ # Code Page 932 is Windows-31J, but I want to provide fallback mapping
102
+ # between 932 and Shift_JIS to handle detected-text or `encoding` arguments
103
+ # that return Shift_JIS since that naming is much much more well-known than 31J.
104
+ Encoding::SHIFT_JIS => 932,
105
+ # https://referencesource.microsoft.com/#mscorlib/system/text/eucjpencoding.cs
106
+ # https://www.redmine.org/issues/29442
107
+ # https://www.sljfaq.org/afaq/encodings.html
108
+ # https://uic.jp/charset/
109
+ # http://www.monyo.com/technical/samba/docs/Japanese-HOWTO-3.0.en.txt
110
+ Encoding::EUC_JP_MS => 20932,
111
+ Encoding::EUC_JP => 51932,
112
+ # Encoding:EUC-JIS-2004 dunno
113
+ #
114
+ # https://www.debian.org/doc/manuals/intro-i18n/ch-coding.en.html 3.2: Stateless and Stateful
115
+ # TL;DR: Stateful uses an escape sequence to switch charset;
116
+ # Stateless have all-unique codepoints.
117
+ # Normal ISO-2022-JP is stateful.
118
+ # "For example, in ISO 2022-JP, two bytes of 0x24 0x2c may mean a Japanese Hiragana character 'が'
119
+ # or two ASCII character of '$' and ',' according to the shift state."
120
+ # Encoding::STATELESS_ISO_2022_JP
121
+ #
122
+ # Mobile operator specific encodings that I have no numeric IDs for rn:
123
+ # Encoding:UTF8-DoCoMo
124
+ # Encoding:SJIS-DoCoMo
125
+ # Encoding:UTF8-KDDI
126
+ # Encoding:SJIS-KDDI
127
+ # Encoding:stateless-ISO-2022-JP-KDDI
128
+ # Encoding:UTF8-SoftBank
129
+ # Encoding:SJIS-SoftBank
130
+
131
+ ## CHY-NAH
132
+ #
133
+ # https://en.wikipedia.org/wiki/Code_page_903
134
+ Encoding::GB1988 => 903,
135
+ #
136
+ ## Hong Kong Supplementary Character Set
137
+ # The Windows version of this seems to be the built-in CP951:
138
+ # https://web.archive.org/web/20160402215421/https://blogs.msdn.microsoft.com/shawnste/2007/03/12/cp-951-hkscs/
139
+ # https://web.archive.org/web/20141129233053/http://www-01.ibm.com/software/globalization/ccsid/ccsid5471.html
140
+ Encoding::BIG5_HKSCS => 5417,
141
+ #
142
+ # The 936 postfix is a reference to the standard Windows Chinese encoding being CP936 / GBK.
143
+ # "GB2312 is the registered internet name for EUC-CN, which is its usual encoded form."
144
+ Encoding::GB2312 => 20936,
145
+ Encoding::GB12345 => 51936,
146
+ #Encoding:GB2312_HZ => 52936, # Doesn't exist in Ruby
147
+ Encoding::GB18030 => 54936,
148
+
149
+
150
+ ## Asia At Odd Hours
151
+ #
152
+ # I always wondered if the "Gravitational Pull of Pepsi" logo came from
153
+ # them wanting it to look less like the Korean flag.
154
+ # The traditional Korean Windows Code Page is CP949, available in Ruby
155
+ # but not under any other name aliases.
156
+ # IBM uses CP1363, not in Ruby.
157
+ Encoding::EUC_KR => 51949,
158
+ #
159
+ # ROC me now
160
+ Encoding::EUC_TW => 51950,
161
+ # Unicode 補完計畫 / Unicode-At-On is a Big5 variant once popular in Taiwan:
162
+ # https://lists.gnu.org/archive/html/bug-gnu-libiconv/2010-11/msg00007.html
163
+ # https://lists.w3.org/Archives/Public/public-html-ig-zh/2012Apr/0061.html
164
+ # Encoding::BIG5_UAO
165
+ #
166
+ # CP950 (available in Ruby) is the code page used on Windows under the name "big5',
167
+ # but I want to map the generic Big5 Encoding to 950 as well to handle
168
+ # detected and specified encodings by that name.
169
+ # "The major difference between Windows code page 950 and "common" (non-vendor-specific) Big5
170
+ # is the incorporation of a subset of the ETEN extensions to Big5 at 0xF9D6 through 0xF9FE
171
+ # (comprising the seven Chinese characters 碁, 銹, 裏, 墻, 恒, 粧, and 嫺,
172
+ # followed by 34 box drawing characters and block elements)."
173
+ Encoding::Big5 => 950,
174
+ #
175
+ # Encoding::TIS_620 is the base Thai 8-bit encoding standard that is apparently
176
+ # never actually used in the wild.
177
+ # ISO-8859-11 is identical to it with the sole exception "that ISO/IEC 8859-11
178
+ # allocates non-breaking space to code 0xA0, while TIS-620 leaves it undefined."
179
+ # "The Microsoft Windows code page 874 as well as the code page used in the
180
+ # Thai version of the Apple Macintosh, MacThai,
181
+ # are variants of TIS-620 — incompatible with each other, however."
182
+
183
+
184
+ # Eastern Yurp
185
+ #Encoding::KOI8_R => 20866,
186
+ Encoding::KOI8_U => 21866,
187
+
188
+ ## ISO/IEC 8859 (8-bit) encoding family
189
+ #
190
+ Encoding::ISO_8859_1 => 28591, # West European languages (Latin-1)
191
+ Encoding::ISO_8859_2 => 28592, # Central and East European languages (Latin-2)
192
+ Encoding::ISO_8859_3 => 28593, # Southeast European and miscellaneous languages (Latin-3)
193
+ Encoding::ISO_8859_4 => 28594, # Scandinavian/Baltic languages (Latin-4)
194
+ Encoding::ISO_8859_5 => 28595, # Latin/Cyrillic
195
+ Encoding::ISO_8859_6 => 28596, # Latin/Arabic
196
+ Encoding::ISO_8859_7 => 28597, # Latin/Greek
197
+ Encoding::ISO_8859_8 => 28598, # Latin/Hebrew
198
+ Encoding::ISO_8859_9 => 28599, # Latin-1 modification for Turkish (Latin-5)
199
+ #
200
+ # ISO-8859-10 covers Nordic languages better than ISO_8859_4.
201
+ # Wikipedia says this has been assigned in Windows as 28600 even though Microsoft's
202
+ # page doesn't list it now in 2020, but w/e.
203
+ # IBM assigned it as CP919.
204
+ Encoding::ISO_8859_10 => 28600, # Lappish/Nordic/Eskimo languages (Latin-6)
205
+ #
206
+ # Wikipedia says this is assigned, but same deal.
207
+ Encoding::ISO_8859_11 => 28601, # Latin/Thai
208
+ #
209
+ # Intended Celtic encoding abandoned in 1997 in favor of ISO_8859_14:
210
+ # Encoding::ISO_8859_12 => 28602,
211
+ #
212
+ Encoding::ISO_8859_13 => 28603, # Baltic Rim languages (Latin-7)
213
+ Encoding::ISO_8859_14 => 28604, # Celtic (Latin-8)
214
+ Encoding::ISO_8859_15 => 28605, # West European languages (Latin-9)
215
+ Encoding::ISO_8859_16 => 28606, # Romanian (Latin-10)
216
+
217
+ # Apple encodings
218
+ #
219
+ # UTF8_MAC is the encoding Mac OS X uses on HFS+ filesystems and is a variant of UTF-8-NFD.
220
+ # https://web.archive.org/web/20140812023313/http://developer.apple.com/library/ios/documentation/MacOSX/Conceptual/BPInternational/Articles/FileEncodings.html
221
+ # "Mac OS Extended (HFS+) uses canonically decomposed Unicode 3.2 in UTF-16 format,
222
+ # which consists of a sequence of 16-bit codes.
223
+ # (Characters in the ranges U2000-U2FFF, UF900-UFA6A, and U2F800-U2FA1D are not decomposed.)"
224
+ #
225
+ # There isn't a good Microsoft-style ID I can assign to it, so this is just FYI.
226
+
227
+ # Classic Mac encodings
228
+ #
229
+ # https://en.wikipedia.org/wiki/Category:Mac_OS_character_encodings
230
+ # http://mirror.informatimago.com/next/developer.apple.com/documentation/macos8/TextIntlSvcs/TextEncodingConversionManager/TEC1.5/TEC.1b.html
231
+ #
232
+ # MacRoman pre-OS-8.5 has the "Universal currency symbol" at 0xDB,
233
+ # while 8.5 and later replace it with the (then-new) Euro symbol:
234
+ # https://en.wikipedia.org/wiki/Currency_sign_(typography)
235
+ Encoding::MACROMAN => 10000,
236
+ #
237
+ # "Shift-JIS with JIS Roman modifications, extra 1-byte characters, 2-byte Apple extensions,
238
+ # and some vertical presentation forms in the range 0xEB40--0xEDFE ("ku plus 84")."
239
+ # Ruby also defines Encoding::MACJAPAN but it's the same Encoding.
240
+ Encoding::MACJAPANESE => 10001,
241
+ #
242
+ # The following encodings are not defined in Ruby's Encoding class,
243
+ # but I'm listing them here for completeness' sake.
244
+ # MACCHINESETRAD => 10002,
245
+ # MACKOREAN => 10003,
246
+ # MACARABIC => 10004,
247
+ # MACHEBREW => 10005,
248
+ # MACGREEK => 10006,
249
+ # MACCYRILLIC => 10007,
250
+ # MACHINESESIMP => 10008,
251
+ #
252
+ # Unlike MacJapan/MacJapanese, MacRomania is something different than MacRoman.
253
+ Encoding::MACROMANIA => 10010,
254
+ #
255
+ Encoding::MACUKRAINE => 10017,
256
+ Encoding::MACTHAI => 10021,
257
+ Encoding::MACCENTEURO => 10029,
258
+ Encoding::MACICELAND => 10079,
259
+ Encoding::MACTURKISH => 10081,
260
+ Encoding::MACCROATIAN => 10082,
261
+
262
+ } # ADDITIONAL_ENCODING_CODE_PAGE_IDS
263
+
264
+ # TODO: Mac OS Script Codes http://www.mods.com.au/budapi/mac_language_codes.htm
265
+
266
+ # Box-drawing characters for various Encodings, including single/double pipe characters,
267
+ # area-sharing characters, and basically anything that could/would be used for art direction
268
+ # in an NFO file or oldschool DOS-style interface: https://en.wikipedia.org/wiki/Box-drawing_character
269
+ #
270
+ # These will be used as the hints for our own supplementary String-encoding detection
271
+ # since ICU has a hard time differentiating e.g. IBM437/ISO8859 when rendering text files,
272
+ # so we can look for the presence of certain combinations of these characters to help guess.
273
+ OOBE = {
274
+ Encoding::IBM437 => (0xB3..0xDA), # 'murca
275
+ Encoding::CP850 => [
276
+ (0xB3..0xB4), # IBM437 equivalent for Europe. Replaces some box drawing characters
277
+ (0xB9..0xBC), # with additional printable letters with diacritic marks.
278
+ (0xBF..0xC5), # CP850 has the same printable letters as ISO-8859-1 but incompatibly.
279
+ (0xC8..0xCE), # ftp://ftp.software.ibm.com/software/globalization/gcoc/attachments/CP00850.pdf
280
+ (0xD9..0xDA), # ftp://ftp.software.ibm.com/software/globalization/gcoc/attachments/CP00850.txt
281
+ ].reduce(&:chain),
282
+ Encoding::UTF_8 => [
283
+ (0x2500..0x257F), # https://www.unicode.org/charts/PDF/U2500.pdf
284
+ (0x2580..0x259F), # https://www.unicode.org/charts/PDF/U2580.pdf
285
+ [
286
+ (0x1FB00..0x1FB3B), # Block mosaic terminal graphic characters
287
+ (0x1FB3C..0x1FB6F), # Smooth mosaic terminal graphic characters
288
+ (0x1FB70..0x1FB8B), # Block elements
289
+ (0x1FB3C..0x1FB94), # Rectangular shade characters
290
+ (0x1FB95..0x1FB99), # Fill characters
291
+ (0x1FB9A..0x1FB9B), # Smooth mosaic terminal graphic characters
292
+ (0x1FB9C..0x1FB9F), # Triangular shade characters
293
+ (0x1FBA0..0x1FBAE), # Character cell diagonals
294
+ (0x1FBAE..0x1FBAE), # Light solid line with stroke
295
+ # Skipping the rest of the Symbols for Legacy Computing block
296
+ # since it consists of terminal graphics, arrows, and segmented digits.
297
+ ].reduce(&:chain), # https://www.unicode.org/charts/PDF/U1FB00.pdf
298
+ ].reduce(&:chain),
299
+ }
300
+
301
+
302
+ # Example Strings for various Encodings, used for things such as font previews.
303
+ # These are more language-specific than Encoding-specific, but I don't have
304
+ # any better way to index them for now.
305
+ PANGRAMS = {
306
+ Encoding::ISO_8859_1 => [
307
+ ],
308
+ # Celtic languages, such as Irish, Manx, Scottish Gaelic, Welsh, Cornish, and Breton.
309
+ Encoding::ISO_8859_14 => [
310
+ 'Parciais fy jac codi baw hud llawn dŵr ger tŷ Mabon.', # Welsh
311
+ ],
312
+ Encoding::ISO_8859_15 => [
313
+ 'Buvez de ce whisky que le patron juge fameux.',
314
+ ],
315
+ }
316
+
317
+
318
+ # Returns a Hash of the built-in-orphan Encodings we now have codepage IDs for,
319
+ # e.g. {#<Encoding:US-ASCII>=>20127, #<Encoding:UTF-16BE>=>1201, #<Encoding:UTF-16LE>=>1200}
320
+ def self.adopted_encoding_code_page_ids
321
+ @@adopted_encoding_code_page_ids ||= self::code_page_orphans.select{ |e|
322
+ if self::ADDITIONAL_ENCODING_CODE_PAGE_IDS.has_key?(e)
323
+ # irb> Encoding.const_defined?('CP932')
324
+ # => true
325
+ not Encoding::const_defined?("CP#{self::ADDITIONAL_ENCODING_CODE_PAGE_IDS[e]}")
326
+ else
327
+ false
328
+ end
329
+ }.map{ |e|
330
+ [e, self::ADDITIONAL_ENCODING_CODE_PAGE_IDS[e]]
331
+ }.to_h
332
+ end
333
+
334
+ # Returns a Set of built-in Encodings whose :names /!\ DO NOT /!\ contain a usable
335
+ # numeric codepage ID, as matched by our Regexp.
336
+ def self.code_page_orphans
337
+ Encoding.list.select{ |c|
338
+ c.respond_to?(:names) ? (not c.names.any?{|n| CODE_PAGE_ENCODING_NAME.match(n)}) : false
339
+ }.to_set
340
+ end
341
+
342
+ # Returns the Encoding instance of any Integer codepage ID.
343
+ def self.page_code(code_page_id)
344
+ # Every canonically-Windows*/IBM*-named Encoding seems to also have a 'CP<whatever>' equivalent.
345
+ Encoding::find("CP#{code_page_id}") rescue nil
346
+ end
347
+
348
+ # Returns the Integer codepage ID of any Encoding instance.
349
+ def code_page
350
+ Encoding::adopted_encoding_code_page_ids.fetch(
351
+ self,
352
+ self.names.any?{ |n| CODE_PAGE_ENCODING_NAME.match(n) } ? Regexp.last_match['code_page'.freeze].to_i : nil
353
+ )
354
+ end
355
+
356
+ # Patch the Encoding::find() method to support taking Integer and numeric-String arguments
357
+ # in addition to the Symbol and canonical-String args it usually supports.
358
+ find_you_again = singleton_method(:find)
359
+ define_singleton_method(:find) do |code_page_id|
360
+ begin
361
+ if code_page_id.is_a?(Integer)
362
+ Encoding::page_code(code_page_id)
363
+ elsif code_page_id.to_s.to_i > 0 # Chain :to_s to support Symbols too
364
+ # String#to_i returns 0 for any non-entirely-numeric String
365
+ Encoding::page_code(code_page_id.to_i)
366
+ else
367
+ find_you_again.(code_page_id.to_s)
368
+ end
369
+ rescue RuntimeError => e
370
+ find_you_again.(code_page_id.to_s)
371
+ end
372
+ end
373
+
374
+ end
@@ -0,0 +1,18 @@
1
+ require 'set'
2
+
3
+ class Hash
4
+
5
+ # Complement Ruby::YAML behavior, where usage of Set syntax
6
+ # returns a Hash with all-nil values.
7
+ # Calling :to_set on a Hash with all-nil values should return
8
+ # a Set of the Hash's keys.
9
+ this_old_set = instance_method(:to_set)
10
+ define_method(:to_set) do
11
+ if self.values.all?{ |v| v.nil? }
12
+ self.keys.to_set
13
+ else
14
+ this_old_set.bind(self).()
15
+ end
16
+ end
17
+
18
+ end
@@ -0,0 +1,15 @@
1
+ require 'set'
2
+
3
+ # Override Set.to_hash to complement Ruby::YAML's Set implementation,
4
+ # where the YAML Set syntax returns a Hash with all-nil values,
5
+ # at least without some decorator sugar in the YAML itself:
6
+ # https://rhnh.net/2011/01/31/yaml-tutorial/
7
+ #
8
+ # Since Set is implemented using a Hash internally I think it makes
9
+ # more sense for Set.to_hash to return a Hash with all-nil values
10
+ # with keys matching the contents of the original Set.
11
+ class Set
12
+ def to_hash
13
+ Hash[self.map { |s| [s, nil] }]
14
+ end
15
+ end
@@ -0,0 +1,6 @@
1
+ class String
2
+ # https://stackoverflow.com/a/22586646
3
+ def map
4
+ size.times.with_object('') {|i,s| s << yield(self[i])}
5
+ end
6
+ end
@@ -0,0 +1,2 @@
1
+ #TODO: Genericize Ruby version-checking and use it here to require 2.7+
2
+ require 'distorted-floor/invoker'
metadata ADDED
@@ -0,0 +1,215 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: distorted-floor
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.7.0
5
+ platform: ruby
6
+ authors:
7
+ - okeeblow
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2022-01-22 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: checking-you-out
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 0.7.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 0.7.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: xross-the-xoul
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 0.7.0
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 0.7.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: ruby-vips
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '2.0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '2.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: svg_optimizer
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: 0.2.5
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: 0.2.5
69
+ - !ruby/object:Gem::Dependency
70
+ name: gstreamer
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '3.4'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '3.4'
83
+ - !ruby/object:Gem::Dependency
84
+ name: hexapdf
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '0.13'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '0.13'
97
+ - !ruby/object:Gem::Dependency
98
+ name: ffi-icu
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '0.3'
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '0.3'
111
+ - !ruby/object:Gem::Dependency
112
+ name: ttfunk
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '1.6'
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '1.6'
125
+ description: Ruby implementation of core file-format operations used by DistorteD-Jekyll.
126
+ email:
127
+ - root@cooltrainer.org
128
+ executables:
129
+ - distorted-floor
130
+ extensions: []
131
+ extra_rdoc_files: []
132
+ files:
133
+ - LICENSE
134
+ - README.md
135
+ - bin/distorted-floor
136
+ - bin/repl
137
+ - bin/setup
138
+ - font/1252/LICENSE/MoreLessPerfectDOSVGA437/img/Less_Perfect_DOS_VGA.png
139
+ - font/1252/LICENSE/MoreLessPerfectDOSVGA437/img/More_Perfect_DOS_VGA.png
140
+ - font/1252/LICENSE/MoreLessPerfectDOSVGA437/img/Perfect_DOS_VGA.png
141
+ - font/1252/LICENSE/MoreLessPerfectDOSVGA437/less_more_perfect_dos_vga_437.html
142
+ - font/1252/LICENSE/PerfectDOSVGA437/font-comment.php@file=perfect_dos_vga_437.html
143
+ - font/1252/LessPerfectDOSVGA.ttf
144
+ - font/1252/MorePerfectDOSVGA.ttf
145
+ - font/1252/Perfect DOS VGA 437 Win.ttf
146
+ - font/437/Perfect DOS VGA 437.ttf
147
+ - font/437/dos437.txt
148
+ - font/65001/Anonymous Pro B.ttf
149
+ - font/65001/Anonymous Pro BI.ttf
150
+ - font/65001/Anonymous Pro I.ttf
151
+ - font/65001/Anonymous Pro.ttf
152
+ - font/65001/LICENSE/AnonymousPro/FONTLOG.txt
153
+ - font/65001/LICENSE/AnonymousPro/OFL-FAQ.txt
154
+ - font/65001/LICENSE/AnonymousPro/OFL.txt
155
+ - font/65001/LICENSE/AnonymousPro/README.txt
156
+ - font/850/ProFont-Bold-01/LICENSE
157
+ - font/850/ProFont-Bold-01/readme.txt
158
+ - font/850/ProFontWindows-Bold.ttf
159
+ - font/850/ProFontWindows.ttf
160
+ - font/850/Profont/LICENSE
161
+ - font/850/Profont/readme.txt
162
+ - font/932/LICENSE/README-ttf.txt
163
+ - font/932/mona.ttf
164
+ - lib/distorted-floor.rb
165
+ - lib/distorted-floor/checking_you_out.rb
166
+ - lib/distorted-floor/click_again.rb
167
+ - lib/distorted-floor/element_of_media.rb
168
+ - lib/distorted-floor/element_of_media/change.rb
169
+ - lib/distorted-floor/element_of_media/compound.rb
170
+ - lib/distorted-floor/error_code.rb
171
+ - lib/distorted-floor/floor.rb
172
+ - lib/distorted-floor/invoker.rb
173
+ - lib/distorted-floor/media_molecule.rb
174
+ - lib/distorted-floor/media_molecule/font.rb
175
+ - lib/distorted-floor/media_molecule/image.rb
176
+ - lib/distorted-floor/media_molecule/pdf.rb
177
+ - lib/distorted-floor/media_molecule/svg.rb
178
+ - lib/distorted-floor/media_molecule/text.rb
179
+ - lib/distorted-floor/media_molecule/video.rb
180
+ - lib/distorted-floor/modular_technology/gstreamer.rb
181
+ - lib/distorted-floor/modular_technology/pango.rb
182
+ - lib/distorted-floor/modular_technology/ttfunk.rb
183
+ - lib/distorted-floor/modular_technology/vips.rb
184
+ - lib/distorted-floor/modular_technology/vips/ffi.rb
185
+ - lib/distorted-floor/modular_technology/vips/load.rb
186
+ - lib/distorted-floor/modular_technology/vips/operatio$.rb
187
+ - lib/distorted-floor/modular_technology/vips/save.rb
188
+ - lib/distorted-floor/monkey_business/encoding.rb
189
+ - lib/distorted-floor/monkey_business/hash.rb
190
+ - lib/distorted-floor/monkey_business/set.rb
191
+ - lib/distorted-floor/monkey_business/string.rb
192
+ homepage: https://cooltrainer.org
193
+ licenses:
194
+ - AGPL-3.0
195
+ metadata: {}
196
+ post_install_message:
197
+ rdoc_options: []
198
+ require_paths:
199
+ - lib
200
+ required_ruby_version: !ruby/object:Gem::Requirement
201
+ requirements:
202
+ - - ">="
203
+ - !ruby/object:Gem::Version
204
+ version: 3.1.0
205
+ required_rubygems_version: !ruby/object:Gem::Requirement
206
+ requirements:
207
+ - - ">="
208
+ - !ruby/object:Gem::Version
209
+ version: '0'
210
+ requirements: []
211
+ rubygems_version: 3.3.3
212
+ signing_key:
213
+ specification_version: 4
214
+ summary: Multimedia toolkit core.
215
+ test_files: []