cabriolet 0.1.2 → 0.2.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.
Files changed (102) hide show
  1. checksums.yaml +4 -4
  2. data/README.adoc +703 -38
  3. data/lib/cabriolet/algorithm_factory.rb +250 -0
  4. data/lib/cabriolet/base_compressor.rb +206 -0
  5. data/lib/cabriolet/binary/bitstream.rb +167 -16
  6. data/lib/cabriolet/binary/bitstream_writer.rb +150 -21
  7. data/lib/cabriolet/binary/chm_structures.rb +2 -2
  8. data/lib/cabriolet/binary/hlp_structures.rb +258 -37
  9. data/lib/cabriolet/binary/lit_structures.rb +231 -65
  10. data/lib/cabriolet/binary/oab_structures.rb +17 -1
  11. data/lib/cabriolet/cab/command_handler.rb +226 -0
  12. data/lib/cabriolet/cab/compressor.rb +108 -84
  13. data/lib/cabriolet/cab/decompressor.rb +16 -20
  14. data/lib/cabriolet/cab/extractor.rb +142 -66
  15. data/lib/cabriolet/cab/file_compression_work.rb +52 -0
  16. data/lib/cabriolet/cab/file_compression_worker.rb +89 -0
  17. data/lib/cabriolet/checksum.rb +49 -0
  18. data/lib/cabriolet/chm/command_handler.rb +227 -0
  19. data/lib/cabriolet/chm/compressor.rb +7 -3
  20. data/lib/cabriolet/chm/decompressor.rb +39 -21
  21. data/lib/cabriolet/chm/parser.rb +5 -2
  22. data/lib/cabriolet/cli/base_command_handler.rb +127 -0
  23. data/lib/cabriolet/cli/command_dispatcher.rb +140 -0
  24. data/lib/cabriolet/cli/command_registry.rb +83 -0
  25. data/lib/cabriolet/cli.rb +356 -607
  26. data/lib/cabriolet/collections/file_collection.rb +175 -0
  27. data/lib/cabriolet/compressors/base.rb +1 -1
  28. data/lib/cabriolet/compressors/lzx.rb +241 -54
  29. data/lib/cabriolet/compressors/mszip.rb +35 -3
  30. data/lib/cabriolet/compressors/quantum.rb +36 -95
  31. data/lib/cabriolet/decompressors/base.rb +1 -1
  32. data/lib/cabriolet/decompressors/lzss.rb +13 -3
  33. data/lib/cabriolet/decompressors/lzx.rb +70 -33
  34. data/lib/cabriolet/decompressors/mszip.rb +126 -39
  35. data/lib/cabriolet/decompressors/quantum.rb +83 -53
  36. data/lib/cabriolet/errors.rb +3 -0
  37. data/lib/cabriolet/extraction/base_extractor.rb +88 -0
  38. data/lib/cabriolet/extraction/extractor.rb +171 -0
  39. data/lib/cabriolet/extraction/file_extraction_work.rb +60 -0
  40. data/lib/cabriolet/extraction/file_extraction_worker.rb +106 -0
  41. data/lib/cabriolet/file_entry.rb +156 -0
  42. data/lib/cabriolet/file_manager.rb +144 -0
  43. data/lib/cabriolet/format_base.rb +79 -0
  44. data/lib/cabriolet/hlp/command_handler.rb +282 -0
  45. data/lib/cabriolet/hlp/compressor.rb +28 -238
  46. data/lib/cabriolet/hlp/decompressor.rb +107 -147
  47. data/lib/cabriolet/hlp/parser.rb +52 -101
  48. data/lib/cabriolet/hlp/quickhelp/compression_stream.rb +138 -0
  49. data/lib/cabriolet/hlp/quickhelp/compressor.rb +151 -0
  50. data/lib/cabriolet/hlp/quickhelp/decompressor.rb +558 -0
  51. data/lib/cabriolet/hlp/quickhelp/file_writer.rb +125 -0
  52. data/lib/cabriolet/hlp/quickhelp/huffman_stream.rb +74 -0
  53. data/lib/cabriolet/hlp/quickhelp/huffman_tree.rb +167 -0
  54. data/lib/cabriolet/hlp/quickhelp/offset_calculator.rb +61 -0
  55. data/lib/cabriolet/hlp/quickhelp/parser.rb +274 -0
  56. data/lib/cabriolet/hlp/quickhelp/structure_builder.rb +93 -0
  57. data/lib/cabriolet/hlp/quickhelp/topic_builder.rb +52 -0
  58. data/lib/cabriolet/hlp/quickhelp/topic_compressor.rb +83 -0
  59. data/lib/cabriolet/hlp/winhelp/btree_builder.rb +289 -0
  60. data/lib/cabriolet/hlp/winhelp/compressor.rb +400 -0
  61. data/lib/cabriolet/hlp/winhelp/decompressor.rb +192 -0
  62. data/lib/cabriolet/hlp/winhelp/parser.rb +484 -0
  63. data/lib/cabriolet/hlp/winhelp/zeck_lz77.rb +271 -0
  64. data/lib/cabriolet/huffman/encoder.rb +15 -12
  65. data/lib/cabriolet/huffman/tree.rb +85 -1
  66. data/lib/cabriolet/kwaj/command_handler.rb +213 -0
  67. data/lib/cabriolet/kwaj/compressor.rb +7 -3
  68. data/lib/cabriolet/kwaj/decompressor.rb +18 -12
  69. data/lib/cabriolet/lit/command_handler.rb +221 -0
  70. data/lib/cabriolet/lit/compressor.rb +119 -168
  71. data/lib/cabriolet/lit/content_encoder.rb +76 -0
  72. data/lib/cabriolet/lit/content_type_detector.rb +50 -0
  73. data/lib/cabriolet/lit/decompressor.rb +518 -152
  74. data/lib/cabriolet/lit/directory_builder.rb +153 -0
  75. data/lib/cabriolet/lit/guid_generator.rb +16 -0
  76. data/lib/cabriolet/lit/header_writer.rb +124 -0
  77. data/lib/cabriolet/lit/parser.rb +670 -0
  78. data/lib/cabriolet/lit/piece_builder.rb +74 -0
  79. data/lib/cabriolet/lit/structure_builder.rb +252 -0
  80. data/lib/cabriolet/models/hlp_file.rb +130 -29
  81. data/lib/cabriolet/models/hlp_header.rb +105 -17
  82. data/lib/cabriolet/models/lit_header.rb +212 -25
  83. data/lib/cabriolet/models/szdd_header.rb +10 -2
  84. data/lib/cabriolet/models/winhelp_header.rb +127 -0
  85. data/lib/cabriolet/oab/command_handler.rb +257 -0
  86. data/lib/cabriolet/oab/compressor.rb +17 -8
  87. data/lib/cabriolet/oab/decompressor.rb +41 -10
  88. data/lib/cabriolet/offset_calculator.rb +81 -0
  89. data/lib/cabriolet/plugin.rb +233 -0
  90. data/lib/cabriolet/plugin_manager.rb +453 -0
  91. data/lib/cabriolet/plugin_validator.rb +422 -0
  92. data/lib/cabriolet/quantum_shared.rb +105 -0
  93. data/lib/cabriolet/system/io_system.rb +3 -0
  94. data/lib/cabriolet/system/memory_handle.rb +17 -4
  95. data/lib/cabriolet/szdd/command_handler.rb +217 -0
  96. data/lib/cabriolet/szdd/compressor.rb +15 -11
  97. data/lib/cabriolet/szdd/decompressor.rb +18 -9
  98. data/lib/cabriolet/version.rb +1 -1
  99. data/lib/cabriolet.rb +181 -20
  100. metadata +69 -4
  101. data/lib/cabriolet/auto.rb +0 -173
  102. data/lib/cabriolet/parallel.rb +0 -333
@@ -0,0 +1,76 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Cabriolet
4
+ module LIT
5
+ # Encodes LIT content data (NameList, manifest)
6
+ class ContentEncoder
7
+ # Build NameList data from sections
8
+ #
9
+ # @param sections [Array<Hash>] Sections array
10
+ # @return [String] Binary NameList data
11
+ def self.build_namelist_data(sections)
12
+ data = +""
13
+ data += [0].pack("v") # Initial field
14
+
15
+ # Write number of sections
16
+ data += [sections.size].pack("v")
17
+
18
+ # Write each section name
19
+ null_terminator = [0].pack("v")
20
+ sections.each do |section|
21
+ name = section[:name]
22
+ # Convert to UTF-16LE
23
+ name_utf16 = name.encode("UTF-16LE").force_encoding("ASCII-8BIT")
24
+ name_length = name_utf16.bytesize / 2
25
+
26
+ data += [name_length].pack("v")
27
+ data += name_utf16
28
+ data += null_terminator
29
+ end
30
+
31
+ data
32
+ end
33
+
34
+ # Build manifest data from manifest structure
35
+ #
36
+ # @param manifest [Hash] Manifest structure with mappings
37
+ # @return [String] Binary manifest data
38
+ def self.build_manifest_data(manifest)
39
+ data = +""
40
+
41
+ # For simplicity: single directory entry
42
+ data += [0].pack("C") # Empty directory name = end of directories
43
+
44
+ # Write 4 groups
45
+ terminator = [0].pack("C")
46
+ 4.times do |group|
47
+ # Get mappings for this group
48
+ group_mappings = manifest[:mappings].select { |m| m[:group] == group }
49
+
50
+ data += [group_mappings.size].pack("V")
51
+
52
+ group_mappings.each do |mapping|
53
+ data += [mapping[:offset]].pack("V")
54
+
55
+ # Internal name
56
+ data += [mapping[:internal_name].bytesize].pack("C")
57
+ data += mapping[:internal_name]
58
+
59
+ # Original name
60
+ data += [mapping[:original_name].bytesize].pack("C")
61
+ data += mapping[:original_name]
62
+
63
+ # Content type
64
+ data += [mapping[:content_type].bytesize].pack("C")
65
+ data += mapping[:content_type]
66
+
67
+ # Terminator
68
+ data += terminator
69
+ end
70
+ end
71
+
72
+ data
73
+ end
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,50 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Cabriolet
4
+ module LIT
5
+ # Detects content type and file group for LIT files
6
+ class ContentTypeDetector
7
+ # Guess content type from filename
8
+ #
9
+ # @param filename [String] Filename to analyze
10
+ # @return [String] MIME content type
11
+ def self.content_type(filename)
12
+ ext = ::File.extname(filename).downcase
13
+ case ext
14
+ when ".html", ".htm"
15
+ "text/html"
16
+ when ".css"
17
+ "text/css"
18
+ when ".jpg", ".jpeg"
19
+ "image/jpeg"
20
+ when ".png"
21
+ "image/png"
22
+ when ".gif"
23
+ "image/gif"
24
+ when ".txt"
25
+ "text/plain"
26
+ else
27
+ "application/octet-stream"
28
+ end
29
+ end
30
+
31
+ # Guess file group (0=HTML spine, 1=HTML other, 2=CSS, 3=Images)
32
+ #
33
+ # @param filename [String] Filename to analyze
34
+ # @return [Integer] Group number
35
+ def self.file_group(filename)
36
+ ext = ::File.extname(filename).downcase
37
+ case ext
38
+ when ".html", ".htm"
39
+ 0 # HTML spine (simplification - could be group 1 for non-spine)
40
+ when ".css"
41
+ 2 # CSS
42
+ when ".jpg", ".jpeg", ".png", ".gif"
43
+ 3 # Images
44
+ else
45
+ 1 # Other
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end