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.
- checksums.yaml +4 -4
- data/README.adoc +703 -38
- data/lib/cabriolet/algorithm_factory.rb +250 -0
- data/lib/cabriolet/base_compressor.rb +206 -0
- data/lib/cabriolet/binary/bitstream.rb +167 -16
- data/lib/cabriolet/binary/bitstream_writer.rb +150 -21
- data/lib/cabriolet/binary/chm_structures.rb +2 -2
- data/lib/cabriolet/binary/hlp_structures.rb +258 -37
- data/lib/cabriolet/binary/lit_structures.rb +231 -65
- data/lib/cabriolet/binary/oab_structures.rb +17 -1
- data/lib/cabriolet/cab/command_handler.rb +226 -0
- data/lib/cabriolet/cab/compressor.rb +108 -84
- data/lib/cabriolet/cab/decompressor.rb +16 -20
- data/lib/cabriolet/cab/extractor.rb +142 -66
- data/lib/cabriolet/cab/file_compression_work.rb +52 -0
- data/lib/cabriolet/cab/file_compression_worker.rb +89 -0
- data/lib/cabriolet/checksum.rb +49 -0
- data/lib/cabriolet/chm/command_handler.rb +227 -0
- data/lib/cabriolet/chm/compressor.rb +7 -3
- data/lib/cabriolet/chm/decompressor.rb +39 -21
- data/lib/cabriolet/chm/parser.rb +5 -2
- data/lib/cabriolet/cli/base_command_handler.rb +127 -0
- data/lib/cabriolet/cli/command_dispatcher.rb +140 -0
- data/lib/cabriolet/cli/command_registry.rb +83 -0
- data/lib/cabriolet/cli.rb +356 -607
- data/lib/cabriolet/collections/file_collection.rb +175 -0
- data/lib/cabriolet/compressors/base.rb +1 -1
- data/lib/cabriolet/compressors/lzx.rb +241 -54
- data/lib/cabriolet/compressors/mszip.rb +35 -3
- data/lib/cabriolet/compressors/quantum.rb +36 -95
- data/lib/cabriolet/decompressors/base.rb +1 -1
- data/lib/cabriolet/decompressors/lzss.rb +13 -3
- data/lib/cabriolet/decompressors/lzx.rb +70 -33
- data/lib/cabriolet/decompressors/mszip.rb +126 -39
- data/lib/cabriolet/decompressors/quantum.rb +83 -53
- data/lib/cabriolet/errors.rb +3 -0
- data/lib/cabriolet/extraction/base_extractor.rb +88 -0
- data/lib/cabriolet/extraction/extractor.rb +171 -0
- data/lib/cabriolet/extraction/file_extraction_work.rb +60 -0
- data/lib/cabriolet/extraction/file_extraction_worker.rb +106 -0
- data/lib/cabriolet/file_entry.rb +156 -0
- data/lib/cabriolet/file_manager.rb +144 -0
- data/lib/cabriolet/format_base.rb +79 -0
- data/lib/cabriolet/hlp/command_handler.rb +282 -0
- data/lib/cabriolet/hlp/compressor.rb +28 -238
- data/lib/cabriolet/hlp/decompressor.rb +107 -147
- data/lib/cabriolet/hlp/parser.rb +52 -101
- data/lib/cabriolet/hlp/quickhelp/compression_stream.rb +138 -0
- data/lib/cabriolet/hlp/quickhelp/compressor.rb +151 -0
- data/lib/cabriolet/hlp/quickhelp/decompressor.rb +558 -0
- data/lib/cabriolet/hlp/quickhelp/file_writer.rb +125 -0
- data/lib/cabriolet/hlp/quickhelp/huffman_stream.rb +74 -0
- data/lib/cabriolet/hlp/quickhelp/huffman_tree.rb +167 -0
- data/lib/cabriolet/hlp/quickhelp/offset_calculator.rb +61 -0
- data/lib/cabriolet/hlp/quickhelp/parser.rb +274 -0
- data/lib/cabriolet/hlp/quickhelp/structure_builder.rb +93 -0
- data/lib/cabriolet/hlp/quickhelp/topic_builder.rb +52 -0
- data/lib/cabriolet/hlp/quickhelp/topic_compressor.rb +83 -0
- data/lib/cabriolet/hlp/winhelp/btree_builder.rb +289 -0
- data/lib/cabriolet/hlp/winhelp/compressor.rb +400 -0
- data/lib/cabriolet/hlp/winhelp/decompressor.rb +192 -0
- data/lib/cabriolet/hlp/winhelp/parser.rb +484 -0
- data/lib/cabriolet/hlp/winhelp/zeck_lz77.rb +271 -0
- data/lib/cabriolet/huffman/encoder.rb +15 -12
- data/lib/cabriolet/huffman/tree.rb +85 -1
- data/lib/cabriolet/kwaj/command_handler.rb +213 -0
- data/lib/cabriolet/kwaj/compressor.rb +7 -3
- data/lib/cabriolet/kwaj/decompressor.rb +18 -12
- data/lib/cabriolet/lit/command_handler.rb +221 -0
- data/lib/cabriolet/lit/compressor.rb +119 -168
- data/lib/cabriolet/lit/content_encoder.rb +76 -0
- data/lib/cabriolet/lit/content_type_detector.rb +50 -0
- data/lib/cabriolet/lit/decompressor.rb +518 -152
- data/lib/cabriolet/lit/directory_builder.rb +153 -0
- data/lib/cabriolet/lit/guid_generator.rb +16 -0
- data/lib/cabriolet/lit/header_writer.rb +124 -0
- data/lib/cabriolet/lit/parser.rb +670 -0
- data/lib/cabriolet/lit/piece_builder.rb +74 -0
- data/lib/cabriolet/lit/structure_builder.rb +252 -0
- data/lib/cabriolet/models/hlp_file.rb +130 -29
- data/lib/cabriolet/models/hlp_header.rb +105 -17
- data/lib/cabriolet/models/lit_header.rb +212 -25
- data/lib/cabriolet/models/szdd_header.rb +10 -2
- data/lib/cabriolet/models/winhelp_header.rb +127 -0
- data/lib/cabriolet/oab/command_handler.rb +257 -0
- data/lib/cabriolet/oab/compressor.rb +17 -8
- data/lib/cabriolet/oab/decompressor.rb +41 -10
- data/lib/cabriolet/offset_calculator.rb +81 -0
- data/lib/cabriolet/plugin.rb +233 -0
- data/lib/cabriolet/plugin_manager.rb +453 -0
- data/lib/cabriolet/plugin_validator.rb +422 -0
- data/lib/cabriolet/quantum_shared.rb +105 -0
- data/lib/cabriolet/system/io_system.rb +3 -0
- data/lib/cabriolet/system/memory_handle.rb +17 -4
- data/lib/cabriolet/szdd/command_handler.rb +217 -0
- data/lib/cabriolet/szdd/compressor.rb +15 -11
- data/lib/cabriolet/szdd/decompressor.rb +18 -9
- data/lib/cabriolet/version.rb +1 -1
- data/lib/cabriolet.rb +181 -20
- metadata +69 -4
- data/lib/cabriolet/auto.rb +0 -173
- 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
|