markdown-merge 1.0.0
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
- checksums.yaml.gz.sig +0 -0
- data/CHANGELOG.md +251 -0
- data/CITATION.cff +20 -0
- data/CODE_OF_CONDUCT.md +134 -0
- data/CONTRIBUTING.md +227 -0
- data/FUNDING.md +74 -0
- data/LICENSE.txt +21 -0
- data/README.md +1087 -0
- data/REEK +0 -0
- data/RUBOCOP.md +71 -0
- data/SECURITY.md +21 -0
- data/lib/markdown/merge/cleanse/block_spacing.rb +253 -0
- data/lib/markdown/merge/cleanse/code_fence_spacing.rb +294 -0
- data/lib/markdown/merge/cleanse/condensed_link_refs.rb +405 -0
- data/lib/markdown/merge/cleanse.rb +42 -0
- data/lib/markdown/merge/code_block_merger.rb +300 -0
- data/lib/markdown/merge/conflict_resolver.rb +128 -0
- data/lib/markdown/merge/debug_logger.rb +26 -0
- data/lib/markdown/merge/document_problems.rb +190 -0
- data/lib/markdown/merge/file_aligner.rb +196 -0
- data/lib/markdown/merge/file_analysis.rb +353 -0
- data/lib/markdown/merge/file_analysis_base.rb +629 -0
- data/lib/markdown/merge/freeze_node.rb +93 -0
- data/lib/markdown/merge/gap_line_node.rb +136 -0
- data/lib/markdown/merge/link_definition_formatter.rb +49 -0
- data/lib/markdown/merge/link_definition_node.rb +157 -0
- data/lib/markdown/merge/link_parser.rb +421 -0
- data/lib/markdown/merge/link_reference_rehydrator.rb +320 -0
- data/lib/markdown/merge/markdown_structure.rb +123 -0
- data/lib/markdown/merge/merge_result.rb +166 -0
- data/lib/markdown/merge/node_type_normalizer.rb +126 -0
- data/lib/markdown/merge/output_builder.rb +166 -0
- data/lib/markdown/merge/partial_template_merger.rb +334 -0
- data/lib/markdown/merge/smart_merger.rb +221 -0
- data/lib/markdown/merge/smart_merger_base.rb +621 -0
- data/lib/markdown/merge/table_match_algorithm.rb +504 -0
- data/lib/markdown/merge/table_match_refiner.rb +136 -0
- data/lib/markdown/merge/version.rb +12 -0
- data/lib/markdown/merge/whitespace_normalizer.rb +251 -0
- data/lib/markdown/merge.rb +149 -0
- data/lib/markdown-merge.rb +4 -0
- data/sig/markdown/merge.rbs +341 -0
- data.tar.gz.sig +0 -0
- metadata +365 -0
- metadata.gz.sig +0 -0
|
@@ -0,0 +1,341 @@
|
|
|
1
|
+
module Markdown
|
|
2
|
+
module Merge
|
|
3
|
+
VERSION: String
|
|
4
|
+
|
|
5
|
+
# Base error class for Markdown::Merge
|
|
6
|
+
class Error < Ast::Merge::Error
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
# Raised when a Markdown file has parsing errors
|
|
10
|
+
class ParseError < Ast::Merge::ParseError
|
|
11
|
+
def initialize: (?String? message, ?content: String?, ?errors: Array[untyped]) -> void
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
# Raised when the template file has syntax errors
|
|
15
|
+
class TemplateParseError < ParseError
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
# Raised when the destination file has syntax errors
|
|
19
|
+
class DestinationParseError < ParseError
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# Debug logging utility for Markdown::Merge operations
|
|
23
|
+
module DebugLogger
|
|
24
|
+
extend Ast::Merge::DebugLogger
|
|
25
|
+
|
|
26
|
+
def self.env_var_name: () -> String
|
|
27
|
+
def self.env_var_name=: (String name) -> String
|
|
28
|
+
def self.log_prefix: () -> String
|
|
29
|
+
def self.log_prefix=: (String prefix) -> String
|
|
30
|
+
def self.enabled?: () -> bool
|
|
31
|
+
def self.debug: (*untyped args) -> void
|
|
32
|
+
def self.info: (*untyped args) -> void
|
|
33
|
+
def self.warning: (*untyped args) -> void
|
|
34
|
+
def self.time: [T] (String label) { () -> T } -> T
|
|
35
|
+
def self.log_node: (untyped node, ?label: String) -> void
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# Represents a frozen block of Markdown content
|
|
39
|
+
class FreezeNode < Ast::Merge::FreezeNodeBase
|
|
40
|
+
def initialize: (
|
|
41
|
+
start_line: Integer,
|
|
42
|
+
end_line: Integer,
|
|
43
|
+
content: String,
|
|
44
|
+
start_marker: String,
|
|
45
|
+
end_marker: String,
|
|
46
|
+
?nodes: Array[untyped],
|
|
47
|
+
?reason: String?
|
|
48
|
+
) -> void
|
|
49
|
+
|
|
50
|
+
def signature: () -> Array[Symbol | String]
|
|
51
|
+
def full_text: () -> String
|
|
52
|
+
def line_count: () -> Integer
|
|
53
|
+
def contains_type?: (Symbol type_symbol) -> bool
|
|
54
|
+
def inspect: () -> String
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
# Base class for file analysis for Markdown files
|
|
58
|
+
class FileAnalysisBase
|
|
59
|
+
include Ast::Merge::FileAnalyzable
|
|
60
|
+
|
|
61
|
+
DEFAULT_FREEZE_TOKEN: String
|
|
62
|
+
|
|
63
|
+
attr_reader document: untyped
|
|
64
|
+
attr_reader statements: Array[untyped]
|
|
65
|
+
|
|
66
|
+
def initialize: (
|
|
67
|
+
String source,
|
|
68
|
+
?freeze_token: String,
|
|
69
|
+
?signature_generator: (^(untyped) -> (Array[untyped] | untyped | nil))?,
|
|
70
|
+
**untyped parser_options
|
|
71
|
+
) -> void
|
|
72
|
+
|
|
73
|
+
# Abstract methods - subclasses must implement
|
|
74
|
+
def parse_document: (String source) -> untyped
|
|
75
|
+
def next_sibling: (untyped node) -> untyped?
|
|
76
|
+
|
|
77
|
+
def valid?: () -> bool
|
|
78
|
+
def compute_node_signature: (untyped node) -> Array[untyped]?
|
|
79
|
+
def fallthrough_node?: (untyped value) -> bool
|
|
80
|
+
def parser_node?: (untyped value) -> bool
|
|
81
|
+
def compute_parser_signature: (untyped node) -> Array[untyped]?
|
|
82
|
+
def safe_string_content: (untyped node) -> String
|
|
83
|
+
def extract_text_content: (untyped node) -> String
|
|
84
|
+
def extract_table_header_content: (untyped node) -> String
|
|
85
|
+
def source_range: (Integer start_line, Integer end_line) -> String
|
|
86
|
+
def count_children: (untyped node) -> Integer
|
|
87
|
+
|
|
88
|
+
private
|
|
89
|
+
|
|
90
|
+
def extract_and_integrate_all_nodes: () -> Array[untyped]
|
|
91
|
+
def collect_top_level_nodes: () -> Array[untyped]
|
|
92
|
+
def build_freeze_blocks: (Array[untyped] nodes) -> Array[FreezeNode]
|
|
93
|
+
def integrate_freeze_blocks: (Array[untyped] nodes, Array[FreezeNode] freeze_blocks) -> Array[untyped]
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
# Aligns Markdown block elements between template and destination files
|
|
97
|
+
class FileAligner
|
|
98
|
+
attr_reader template_analysis: FileAnalysisBase
|
|
99
|
+
attr_reader dest_analysis: FileAnalysisBase
|
|
100
|
+
attr_reader match_refiner: (^(Array[untyped], Array[untyped], Hash[Symbol, untyped]) -> Array[MatchResult])?
|
|
101
|
+
|
|
102
|
+
def initialize: (
|
|
103
|
+
FileAnalysisBase template_analysis,
|
|
104
|
+
FileAnalysisBase dest_analysis,
|
|
105
|
+
?match_refiner: (^(Array[untyped], Array[untyped], Hash[Symbol, untyped]) -> Array[MatchResult])?
|
|
106
|
+
) -> void
|
|
107
|
+
|
|
108
|
+
def align: () -> Array[Hash[Symbol, untyped]]
|
|
109
|
+
|
|
110
|
+
private
|
|
111
|
+
|
|
112
|
+
def build_signature_map: (Array[untyped] statements, FileAnalysisBase analysis) -> Hash[Array[untyped], Array[Integer]]
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
# Match result from refiners
|
|
116
|
+
class MatchResult
|
|
117
|
+
attr_reader template_node: untyped
|
|
118
|
+
attr_reader dest_node: untyped
|
|
119
|
+
attr_reader score: Float
|
|
120
|
+
|
|
121
|
+
def initialize: (
|
|
122
|
+
template_node: untyped,
|
|
123
|
+
dest_node: untyped,
|
|
124
|
+
score: Float
|
|
125
|
+
) -> void
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
# Resolves conflicts between matching Markdown elements
|
|
129
|
+
class ConflictResolver < Ast::Merge::ConflictResolverBase
|
|
130
|
+
def initialize: (
|
|
131
|
+
preference: Symbol,
|
|
132
|
+
template_analysis: FileAnalysisBase,
|
|
133
|
+
dest_analysis: FileAnalysisBase
|
|
134
|
+
) -> void
|
|
135
|
+
|
|
136
|
+
private
|
|
137
|
+
|
|
138
|
+
def resolve_node_pair: (
|
|
139
|
+
untyped template_node,
|
|
140
|
+
untyped dest_node,
|
|
141
|
+
template_index: Integer,
|
|
142
|
+
dest_index: Integer
|
|
143
|
+
) -> Hash[Symbol, untyped]
|
|
144
|
+
|
|
145
|
+
def content_identical?: (untyped template_node, untyped dest_node) -> bool
|
|
146
|
+
def node_to_text: (untyped node, FileAnalysisBase analysis) -> String
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
# Represents the result of a Markdown merge operation
|
|
150
|
+
class MergeResult < Ast::Merge::MergeResultBase
|
|
151
|
+
def initialize: (
|
|
152
|
+
content: String?,
|
|
153
|
+
?conflicts: Array[Hash[Symbol, untyped]],
|
|
154
|
+
?frozen_blocks: Array[Hash[Symbol, untyped]],
|
|
155
|
+
?stats: Hash[Symbol, untyped]
|
|
156
|
+
) -> void
|
|
157
|
+
|
|
158
|
+
def content: () -> String?
|
|
159
|
+
def content?: () -> bool
|
|
160
|
+
def content_string: () -> String?
|
|
161
|
+
def success?: () -> bool
|
|
162
|
+
def conflicts?: () -> bool
|
|
163
|
+
def has_frozen_blocks?: () -> bool
|
|
164
|
+
def nodes_added: () -> Integer
|
|
165
|
+
def nodes_removed: () -> Integer
|
|
166
|
+
def nodes_modified: () -> Integer
|
|
167
|
+
def merge_time_ms: () -> Float?
|
|
168
|
+
def frozen_count: () -> Integer
|
|
169
|
+
def inspect: () -> String
|
|
170
|
+
def to_s: () -> String
|
|
171
|
+
|
|
172
|
+
private
|
|
173
|
+
|
|
174
|
+
def default_stats: () -> Hash[Symbol, untyped]
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
# Algorithm for computing match scores between two Markdown tables
|
|
178
|
+
class TableMatchAlgorithm
|
|
179
|
+
DEFAULT_WEIGHTS: Hash[Symbol, Float]
|
|
180
|
+
FIRST_COLUMN_SIMILARITY_THRESHOLD: Float
|
|
181
|
+
|
|
182
|
+
attr_reader position_a: Integer?
|
|
183
|
+
attr_reader position_b: Integer?
|
|
184
|
+
attr_reader total_tables_a: Integer
|
|
185
|
+
attr_reader total_tables_b: Integer
|
|
186
|
+
attr_reader weights: Hash[Symbol, Float]
|
|
187
|
+
|
|
188
|
+
def initialize: (
|
|
189
|
+
?position_a: Integer?,
|
|
190
|
+
?position_b: Integer?,
|
|
191
|
+
?total_tables_a: Integer,
|
|
192
|
+
?total_tables_b: Integer,
|
|
193
|
+
?weights: Hash[Symbol, Float]
|
|
194
|
+
) -> void
|
|
195
|
+
|
|
196
|
+
def call: (untyped table_a, untyped table_b) -> Float
|
|
197
|
+
|
|
198
|
+
private
|
|
199
|
+
|
|
200
|
+
def levenshtein_distance: (String a, String b) -> Integer
|
|
201
|
+
def levenshtein_similarity: (String a, String b) -> Float
|
|
202
|
+
def extract_rows: (untyped table) -> Array[Array[String]]
|
|
203
|
+
def extract_cell_text: (untyped cell) -> String
|
|
204
|
+
def compute_header_match: (Array[Array[String]] rows_a, Array[Array[String]] rows_b) -> Float
|
|
205
|
+
def compute_first_column_match: (Array[Array[String]] rows_a, Array[Array[String]] rows_b) -> Float
|
|
206
|
+
def compute_row_content_match: (Array[Array[String]] rows_a, Array[Array[String]] rows_b) -> Float
|
|
207
|
+
def compute_total_cells_match: (Array[Array[String]] rows_a, Array[Array[String]] rows_b) -> Float
|
|
208
|
+
def compute_position_score: () -> Float
|
|
209
|
+
def weighted_average: (Hash[Symbol, Float] scores) -> Float
|
|
210
|
+
end
|
|
211
|
+
|
|
212
|
+
# Match refiner for Markdown tables that didn't match by exact signature
|
|
213
|
+
class TableMatchRefiner < Ast::Merge::MatchRefinerBase
|
|
214
|
+
attr_reader algorithm_options: Hash[Symbol, untyped]
|
|
215
|
+
|
|
216
|
+
def initialize: (
|
|
217
|
+
?threshold: Float,
|
|
218
|
+
?algorithm_options: Hash[Symbol, untyped],
|
|
219
|
+
**untyped options
|
|
220
|
+
) -> void
|
|
221
|
+
|
|
222
|
+
def call: (
|
|
223
|
+
Array[untyped] template_nodes,
|
|
224
|
+
Array[untyped] dest_nodes,
|
|
225
|
+
?Hash[Symbol, untyped] context
|
|
226
|
+
) -> Array[MatchResult]
|
|
227
|
+
|
|
228
|
+
private
|
|
229
|
+
|
|
230
|
+
def extract_tables: (Array[untyped] nodes) -> Array[untyped]
|
|
231
|
+
def table_node?: (untyped node) -> bool
|
|
232
|
+
def compute_table_similarity: (
|
|
233
|
+
untyped t_table,
|
|
234
|
+
untyped d_table,
|
|
235
|
+
Integer t_idx,
|
|
236
|
+
Integer d_idx,
|
|
237
|
+
Integer total_t,
|
|
238
|
+
Integer total_d
|
|
239
|
+
) -> Float
|
|
240
|
+
end
|
|
241
|
+
|
|
242
|
+
# Merges fenced code blocks using language-specific *-merge gems
|
|
243
|
+
class CodeBlockMerger
|
|
244
|
+
DEFAULT_MERGERS: Hash[String, ^(String, String, Symbol, **untyped) -> Hash[Symbol, untyped]]
|
|
245
|
+
|
|
246
|
+
attr_reader mergers: Hash[String, ^(String, String, Symbol, **untyped) -> Hash[Symbol, untyped]]
|
|
247
|
+
attr_reader enabled: bool
|
|
248
|
+
|
|
249
|
+
def initialize: (
|
|
250
|
+
?mergers: Hash[String, ^(String, String, Symbol, **untyped) -> Hash[Symbol, untyped]],
|
|
251
|
+
?enabled: bool
|
|
252
|
+
) -> void
|
|
253
|
+
|
|
254
|
+
def supports_language?: (String? language) -> bool
|
|
255
|
+
def merge_code_blocks: (
|
|
256
|
+
untyped template_node,
|
|
257
|
+
untyped dest_node,
|
|
258
|
+
preference: Symbol,
|
|
259
|
+
**untyped opts
|
|
260
|
+
) -> Hash[Symbol, untyped]
|
|
261
|
+
|
|
262
|
+
# Class methods for specific mergers
|
|
263
|
+
def self.merge_with_prism: (String template, String dest, Symbol preference, **untyped opts) -> Hash[Symbol, untyped]
|
|
264
|
+
def self.merge_with_psych: (String template, String dest, Symbol preference, **untyped opts) -> Hash[Symbol, untyped]
|
|
265
|
+
def self.merge_with_json: (String template, String dest, Symbol preference, **untyped opts) -> Hash[Symbol, untyped]
|
|
266
|
+
def self.merge_with_toml: (String template, String dest, Symbol preference, **untyped opts) -> Hash[Symbol, untyped]
|
|
267
|
+
|
|
268
|
+
private
|
|
269
|
+
|
|
270
|
+
def extract_language: (untyped node) -> String?
|
|
271
|
+
def extract_content: (untyped node) -> String
|
|
272
|
+
def rebuild_code_block: (String language, String content, untyped reference_node) -> String
|
|
273
|
+
def not_merged: (String reason) -> Hash[Symbol, untyped]
|
|
274
|
+
end
|
|
275
|
+
|
|
276
|
+
# Builds markdown output from merge operations
|
|
277
|
+
class OutputBuilder
|
|
278
|
+
@parts: Array[String]
|
|
279
|
+
@preserve_formatting: bool
|
|
280
|
+
|
|
281
|
+
def initialize: (?preserve_formatting: bool) -> void
|
|
282
|
+
def add_node_source: (untyped node, FileAnalysisBase analysis) -> void
|
|
283
|
+
def add_link_definition: (LinkDefinitionNode node) -> void
|
|
284
|
+
def add_gap_line: (?count: Integer) -> void
|
|
285
|
+
def add_raw: (String text) -> void
|
|
286
|
+
def to_s: () -> String
|
|
287
|
+
def empty?: () -> bool
|
|
288
|
+
def clear: () -> void
|
|
289
|
+
|
|
290
|
+
private
|
|
291
|
+
|
|
292
|
+
def extract_source: (untyped node, FileAnalysisBase analysis) -> String?
|
|
293
|
+
def extract_parser_node_source: (untyped node, FileAnalysisBase analysis) -> String?
|
|
294
|
+
end
|
|
295
|
+
|
|
296
|
+
# Formats link reference definitions for output
|
|
297
|
+
module LinkDefinitionFormatter
|
|
298
|
+
def self.format: (LinkDefinitionNode node) -> String
|
|
299
|
+
def self.format_all: (Array[LinkDefinitionNode] nodes, ?separator: String) -> String
|
|
300
|
+
end
|
|
301
|
+
|
|
302
|
+
# Base class for smart Markdown file merging
|
|
303
|
+
class SmartMergerBase
|
|
304
|
+
attr_reader template_analysis: FileAnalysisBase
|
|
305
|
+
attr_reader dest_analysis: FileAnalysisBase
|
|
306
|
+
attr_reader aligner: FileAligner
|
|
307
|
+
attr_reader resolver: ConflictResolver
|
|
308
|
+
attr_reader code_block_merger: CodeBlockMerger?
|
|
309
|
+
|
|
310
|
+
def initialize: (
|
|
311
|
+
String template_content,
|
|
312
|
+
String dest_content,
|
|
313
|
+
?signature_generator: (^(untyped) -> (Array[untyped] | untyped | nil))?,
|
|
314
|
+
?preference: Symbol,
|
|
315
|
+
?add_template_only_nodes: bool,
|
|
316
|
+
?inner_merge_code_blocks: (bool | CodeBlockMerger),
|
|
317
|
+
?freeze_token: String,
|
|
318
|
+
?match_refiner: (^(Array[untyped], Array[untyped], Hash[Symbol, untyped]) -> Array[MatchResult])?,
|
|
319
|
+
**untyped parser_options
|
|
320
|
+
) -> void
|
|
321
|
+
|
|
322
|
+
# Abstract methods - subclasses must implement
|
|
323
|
+
def create_file_analysis: (String content, **untyped options) -> FileAnalysisBase
|
|
324
|
+
def node_to_source: (untyped node, FileAnalysisBase analysis) -> String
|
|
325
|
+
|
|
326
|
+
def template_parse_error_class: () -> Class
|
|
327
|
+
def destination_parse_error_class: () -> Class
|
|
328
|
+
|
|
329
|
+
def merge: () -> String
|
|
330
|
+
def merge_result: () -> MergeResult
|
|
331
|
+
|
|
332
|
+
private
|
|
333
|
+
|
|
334
|
+
def build_result_content: (Array[Hash[Symbol, untyped]] alignment) -> String
|
|
335
|
+
def process_alignment_entry: (Hash[Symbol, untyped] entry) -> String?
|
|
336
|
+
def handle_match: (Hash[Symbol, untyped] entry) -> String?
|
|
337
|
+
def handle_template_only: (Hash[Symbol, untyped] entry) -> String?
|
|
338
|
+
def handle_dest_only: (Hash[Symbol, untyped] entry) -> String?
|
|
339
|
+
end
|
|
340
|
+
end
|
|
341
|
+
end
|
data.tar.gz.sig
ADDED
|
Binary file
|
metadata
ADDED
|
@@ -0,0 +1,365 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: markdown-merge
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- Peter H. Boling
|
|
8
|
+
bindir: exe
|
|
9
|
+
cert_chain:
|
|
10
|
+
- |
|
|
11
|
+
-----BEGIN CERTIFICATE-----
|
|
12
|
+
MIIEgDCCAuigAwIBAgIBATANBgkqhkiG9w0BAQsFADBDMRUwEwYDVQQDDAxwZXRl
|
|
13
|
+
ci5ib2xpbmcxFTATBgoJkiaJk/IsZAEZFgVnbWFpbDETMBEGCgmSJomT8ixkARkW
|
|
14
|
+
A2NvbTAeFw0yNTA1MDQxNTMzMDlaFw00NTA0MjkxNTMzMDlaMEMxFTATBgNVBAMM
|
|
15
|
+
DHBldGVyLmJvbGluZzEVMBMGCgmSJomT8ixkARkWBWdtYWlsMRMwEQYKCZImiZPy
|
|
16
|
+
LGQBGRYDY29tMIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAruUoo0WA
|
|
17
|
+
uoNuq6puKWYeRYiZekz/nsDeK5x/0IEirzcCEvaHr3Bmz7rjo1I6On3gGKmiZs61
|
|
18
|
+
LRmQ3oxy77ydmkGTXBjruJB+pQEn7UfLSgQ0xa1/X3kdBZt6RmabFlBxnHkoaGY5
|
|
19
|
+
mZuZ5+Z7walmv6sFD9ajhzj+oIgwWfnEHkXYTR8I6VLN7MRRKGMPoZ/yvOmxb2DN
|
|
20
|
+
coEEHWKO9CvgYpW7asIihl/9GMpKiRkcYPm9dGQzZc6uTwom1COfW0+ZOFrDVBuV
|
|
21
|
+
FMQRPswZcY4Wlq0uEBLPU7hxnCL9nKK6Y9IhdDcz1mY6HZ91WImNslOSI0S8hRpj
|
|
22
|
+
yGOWxQIhBT3fqCBlRIqFQBudrnD9jSNpSGsFvbEijd5ns7Z9ZMehXkXDycpGAUj1
|
|
23
|
+
to/5cuTWWw1JqUWrKJYoifnVhtE1o1DZ+LkPtWxHtz5kjDG/zR3MG0Ula0UOavlD
|
|
24
|
+
qbnbcXPBnwXtTFeZ3C+yrWpE4pGnl3yGkZj9SMTlo9qnTMiPmuWKQDatAgMBAAGj
|
|
25
|
+
fzB9MAkGA1UdEwQCMAAwCwYDVR0PBAQDAgSwMB0GA1UdDgQWBBQE8uWvNbPVNRXZ
|
|
26
|
+
HlgPbc2PCzC4bjAhBgNVHREEGjAYgRZwZXRlci5ib2xpbmdAZ21haWwuY29tMCEG
|
|
27
|
+
A1UdEgQaMBiBFnBldGVyLmJvbGluZ0BnbWFpbC5jb20wDQYJKoZIhvcNAQELBQAD
|
|
28
|
+
ggGBAJbnUwfJQFPkBgH9cL7hoBfRtmWiCvdqdjeTmi04u8zVNCUox0A4gT982DE9
|
|
29
|
+
wmuN12LpdajxZONqbXuzZvc+nb0StFwmFYZG6iDwaf4BPywm2e/Vmq0YG45vZXGR
|
|
30
|
+
L8yMDSK1cQXjmA+ZBKOHKWavxP6Vp7lWvjAhz8RFwqF9GuNIdhv9NpnCAWcMZtpm
|
|
31
|
+
GUPyIWw/Cw/2wZp74QzZj6Npx+LdXoLTF1HMSJXZ7/pkxLCsB8m4EFVdb/IrW/0k
|
|
32
|
+
kNSfjtAfBHO8nLGuqQZVH9IBD1i9K6aSs7pT6TW8itXUIlkIUI2tg5YzW6OFfPzq
|
|
33
|
+
QekSkX3lZfY+HTSp/o+YvKkqWLUV7PQ7xh1ZYDtocpaHwgxe/j3bBqHE+CUPH2vA
|
|
34
|
+
0V/FwdTRWcwsjVoOJTrYcff8pBZ8r2MvtAc54xfnnhGFzeRHfcltobgFxkAXdE6p
|
|
35
|
+
DVjBtqT23eugOqQ73umLcYDZkc36vnqGxUBSsXrzY9pzV5gGr2I8YUxMqf6ATrZt
|
|
36
|
+
L9nRqA==
|
|
37
|
+
-----END CERTIFICATE-----
|
|
38
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
|
39
|
+
dependencies:
|
|
40
|
+
- !ruby/object:Gem::Dependency
|
|
41
|
+
name: ast-merge
|
|
42
|
+
requirement: !ruby/object:Gem::Requirement
|
|
43
|
+
requirements:
|
|
44
|
+
- - "~>"
|
|
45
|
+
- !ruby/object:Gem::Version
|
|
46
|
+
version: '4.0'
|
|
47
|
+
- - ">="
|
|
48
|
+
- !ruby/object:Gem::Version
|
|
49
|
+
version: 4.0.2
|
|
50
|
+
type: :runtime
|
|
51
|
+
prerelease: false
|
|
52
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
53
|
+
requirements:
|
|
54
|
+
- - "~>"
|
|
55
|
+
- !ruby/object:Gem::Version
|
|
56
|
+
version: '4.0'
|
|
57
|
+
- - ">="
|
|
58
|
+
- !ruby/object:Gem::Version
|
|
59
|
+
version: 4.0.2
|
|
60
|
+
- !ruby/object:Gem::Dependency
|
|
61
|
+
name: tree_haver
|
|
62
|
+
requirement: !ruby/object:Gem::Requirement
|
|
63
|
+
requirements:
|
|
64
|
+
- - "~>"
|
|
65
|
+
- !ruby/object:Gem::Version
|
|
66
|
+
version: '5.0'
|
|
67
|
+
- - ">="
|
|
68
|
+
- !ruby/object:Gem::Version
|
|
69
|
+
version: 5.0.2
|
|
70
|
+
type: :runtime
|
|
71
|
+
prerelease: false
|
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
73
|
+
requirements:
|
|
74
|
+
- - "~>"
|
|
75
|
+
- !ruby/object:Gem::Version
|
|
76
|
+
version: '5.0'
|
|
77
|
+
- - ">="
|
|
78
|
+
- !ruby/object:Gem::Version
|
|
79
|
+
version: 5.0.2
|
|
80
|
+
- !ruby/object:Gem::Dependency
|
|
81
|
+
name: parslet
|
|
82
|
+
requirement: !ruby/object:Gem::Requirement
|
|
83
|
+
requirements:
|
|
84
|
+
- - "~>"
|
|
85
|
+
- !ruby/object:Gem::Version
|
|
86
|
+
version: '2.0'
|
|
87
|
+
type: :runtime
|
|
88
|
+
prerelease: false
|
|
89
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
90
|
+
requirements:
|
|
91
|
+
- - "~>"
|
|
92
|
+
- !ruby/object:Gem::Version
|
|
93
|
+
version: '2.0'
|
|
94
|
+
- !ruby/object:Gem::Dependency
|
|
95
|
+
name: version_gem
|
|
96
|
+
requirement: !ruby/object:Gem::Requirement
|
|
97
|
+
requirements:
|
|
98
|
+
- - "~>"
|
|
99
|
+
- !ruby/object:Gem::Version
|
|
100
|
+
version: '1.1'
|
|
101
|
+
- - ">="
|
|
102
|
+
- !ruby/object:Gem::Version
|
|
103
|
+
version: 1.1.9
|
|
104
|
+
type: :runtime
|
|
105
|
+
prerelease: false
|
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
107
|
+
requirements:
|
|
108
|
+
- - "~>"
|
|
109
|
+
- !ruby/object:Gem::Version
|
|
110
|
+
version: '1.1'
|
|
111
|
+
- - ">="
|
|
112
|
+
- !ruby/object:Gem::Version
|
|
113
|
+
version: 1.1.9
|
|
114
|
+
- !ruby/object:Gem::Dependency
|
|
115
|
+
name: kettle-dev
|
|
116
|
+
requirement: !ruby/object:Gem::Requirement
|
|
117
|
+
requirements:
|
|
118
|
+
- - "~>"
|
|
119
|
+
- !ruby/object:Gem::Version
|
|
120
|
+
version: '1.1'
|
|
121
|
+
type: :development
|
|
122
|
+
prerelease: false
|
|
123
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
124
|
+
requirements:
|
|
125
|
+
- - "~>"
|
|
126
|
+
- !ruby/object:Gem::Version
|
|
127
|
+
version: '1.1'
|
|
128
|
+
- !ruby/object:Gem::Dependency
|
|
129
|
+
name: bundler-audit
|
|
130
|
+
requirement: !ruby/object:Gem::Requirement
|
|
131
|
+
requirements:
|
|
132
|
+
- - "~>"
|
|
133
|
+
- !ruby/object:Gem::Version
|
|
134
|
+
version: 0.9.2
|
|
135
|
+
type: :development
|
|
136
|
+
prerelease: false
|
|
137
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
138
|
+
requirements:
|
|
139
|
+
- - "~>"
|
|
140
|
+
- !ruby/object:Gem::Version
|
|
141
|
+
version: 0.9.2
|
|
142
|
+
- !ruby/object:Gem::Dependency
|
|
143
|
+
name: rake
|
|
144
|
+
requirement: !ruby/object:Gem::Requirement
|
|
145
|
+
requirements:
|
|
146
|
+
- - "~>"
|
|
147
|
+
- !ruby/object:Gem::Version
|
|
148
|
+
version: '13.0'
|
|
149
|
+
type: :development
|
|
150
|
+
prerelease: false
|
|
151
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
152
|
+
requirements:
|
|
153
|
+
- - "~>"
|
|
154
|
+
- !ruby/object:Gem::Version
|
|
155
|
+
version: '13.0'
|
|
156
|
+
- !ruby/object:Gem::Dependency
|
|
157
|
+
name: require_bench
|
|
158
|
+
requirement: !ruby/object:Gem::Requirement
|
|
159
|
+
requirements:
|
|
160
|
+
- - "~>"
|
|
161
|
+
- !ruby/object:Gem::Version
|
|
162
|
+
version: '1.0'
|
|
163
|
+
- - ">="
|
|
164
|
+
- !ruby/object:Gem::Version
|
|
165
|
+
version: 1.0.4
|
|
166
|
+
type: :development
|
|
167
|
+
prerelease: false
|
|
168
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
169
|
+
requirements:
|
|
170
|
+
- - "~>"
|
|
171
|
+
- !ruby/object:Gem::Version
|
|
172
|
+
version: '1.0'
|
|
173
|
+
- - ">="
|
|
174
|
+
- !ruby/object:Gem::Version
|
|
175
|
+
version: 1.0.4
|
|
176
|
+
- !ruby/object:Gem::Dependency
|
|
177
|
+
name: appraisal2
|
|
178
|
+
requirement: !ruby/object:Gem::Requirement
|
|
179
|
+
requirements:
|
|
180
|
+
- - "~>"
|
|
181
|
+
- !ruby/object:Gem::Version
|
|
182
|
+
version: '3.0'
|
|
183
|
+
type: :development
|
|
184
|
+
prerelease: false
|
|
185
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
186
|
+
requirements:
|
|
187
|
+
- - "~>"
|
|
188
|
+
- !ruby/object:Gem::Version
|
|
189
|
+
version: '3.0'
|
|
190
|
+
- !ruby/object:Gem::Dependency
|
|
191
|
+
name: kettle-test
|
|
192
|
+
requirement: !ruby/object:Gem::Requirement
|
|
193
|
+
requirements:
|
|
194
|
+
- - "~>"
|
|
195
|
+
- !ruby/object:Gem::Version
|
|
196
|
+
version: '1.0'
|
|
197
|
+
- - ">="
|
|
198
|
+
- !ruby/object:Gem::Version
|
|
199
|
+
version: 1.0.6
|
|
200
|
+
type: :development
|
|
201
|
+
prerelease: false
|
|
202
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
203
|
+
requirements:
|
|
204
|
+
- - "~>"
|
|
205
|
+
- !ruby/object:Gem::Version
|
|
206
|
+
version: '1.0'
|
|
207
|
+
- - ">="
|
|
208
|
+
- !ruby/object:Gem::Version
|
|
209
|
+
version: 1.0.6
|
|
210
|
+
- !ruby/object:Gem::Dependency
|
|
211
|
+
name: ruby-progressbar
|
|
212
|
+
requirement: !ruby/object:Gem::Requirement
|
|
213
|
+
requirements:
|
|
214
|
+
- - "~>"
|
|
215
|
+
- !ruby/object:Gem::Version
|
|
216
|
+
version: '1.13'
|
|
217
|
+
type: :development
|
|
218
|
+
prerelease: false
|
|
219
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
220
|
+
requirements:
|
|
221
|
+
- - "~>"
|
|
222
|
+
- !ruby/object:Gem::Version
|
|
223
|
+
version: '1.13'
|
|
224
|
+
- !ruby/object:Gem::Dependency
|
|
225
|
+
name: stone_checksums
|
|
226
|
+
requirement: !ruby/object:Gem::Requirement
|
|
227
|
+
requirements:
|
|
228
|
+
- - "~>"
|
|
229
|
+
- !ruby/object:Gem::Version
|
|
230
|
+
version: '1.0'
|
|
231
|
+
- - ">="
|
|
232
|
+
- !ruby/object:Gem::Version
|
|
233
|
+
version: 1.0.2
|
|
234
|
+
type: :development
|
|
235
|
+
prerelease: false
|
|
236
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
237
|
+
requirements:
|
|
238
|
+
- - "~>"
|
|
239
|
+
- !ruby/object:Gem::Version
|
|
240
|
+
version: '1.0'
|
|
241
|
+
- - ">="
|
|
242
|
+
- !ruby/object:Gem::Version
|
|
243
|
+
version: 1.0.2
|
|
244
|
+
- !ruby/object:Gem::Dependency
|
|
245
|
+
name: gitmoji-regex
|
|
246
|
+
requirement: !ruby/object:Gem::Requirement
|
|
247
|
+
requirements:
|
|
248
|
+
- - "~>"
|
|
249
|
+
- !ruby/object:Gem::Version
|
|
250
|
+
version: '1.0'
|
|
251
|
+
- - ">="
|
|
252
|
+
- !ruby/object:Gem::Version
|
|
253
|
+
version: 1.0.3
|
|
254
|
+
type: :development
|
|
255
|
+
prerelease: false
|
|
256
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
257
|
+
requirements:
|
|
258
|
+
- - "~>"
|
|
259
|
+
- !ruby/object:Gem::Version
|
|
260
|
+
version: '1.0'
|
|
261
|
+
- - ">="
|
|
262
|
+
- !ruby/object:Gem::Version
|
|
263
|
+
version: 1.0.3
|
|
264
|
+
description: "☯️ Ast::Merge-based structure for merging Markdown files with tools
|
|
265
|
+
like markly-merge and commonmarker-merge"
|
|
266
|
+
email:
|
|
267
|
+
- floss@galtzo.com
|
|
268
|
+
executables: []
|
|
269
|
+
extensions: []
|
|
270
|
+
extra_rdoc_files:
|
|
271
|
+
- CHANGELOG.md
|
|
272
|
+
- CITATION.cff
|
|
273
|
+
- CODE_OF_CONDUCT.md
|
|
274
|
+
- CONTRIBUTING.md
|
|
275
|
+
- FUNDING.md
|
|
276
|
+
- LICENSE.txt
|
|
277
|
+
- README.md
|
|
278
|
+
- REEK
|
|
279
|
+
- RUBOCOP.md
|
|
280
|
+
- SECURITY.md
|
|
281
|
+
files:
|
|
282
|
+
- CHANGELOG.md
|
|
283
|
+
- CITATION.cff
|
|
284
|
+
- CODE_OF_CONDUCT.md
|
|
285
|
+
- CONTRIBUTING.md
|
|
286
|
+
- FUNDING.md
|
|
287
|
+
- LICENSE.txt
|
|
288
|
+
- README.md
|
|
289
|
+
- REEK
|
|
290
|
+
- RUBOCOP.md
|
|
291
|
+
- SECURITY.md
|
|
292
|
+
- lib/markdown-merge.rb
|
|
293
|
+
- lib/markdown/merge.rb
|
|
294
|
+
- lib/markdown/merge/cleanse.rb
|
|
295
|
+
- lib/markdown/merge/cleanse/block_spacing.rb
|
|
296
|
+
- lib/markdown/merge/cleanse/code_fence_spacing.rb
|
|
297
|
+
- lib/markdown/merge/cleanse/condensed_link_refs.rb
|
|
298
|
+
- lib/markdown/merge/code_block_merger.rb
|
|
299
|
+
- lib/markdown/merge/conflict_resolver.rb
|
|
300
|
+
- lib/markdown/merge/debug_logger.rb
|
|
301
|
+
- lib/markdown/merge/document_problems.rb
|
|
302
|
+
- lib/markdown/merge/file_aligner.rb
|
|
303
|
+
- lib/markdown/merge/file_analysis.rb
|
|
304
|
+
- lib/markdown/merge/file_analysis_base.rb
|
|
305
|
+
- lib/markdown/merge/freeze_node.rb
|
|
306
|
+
- lib/markdown/merge/gap_line_node.rb
|
|
307
|
+
- lib/markdown/merge/link_definition_formatter.rb
|
|
308
|
+
- lib/markdown/merge/link_definition_node.rb
|
|
309
|
+
- lib/markdown/merge/link_parser.rb
|
|
310
|
+
- lib/markdown/merge/link_reference_rehydrator.rb
|
|
311
|
+
- lib/markdown/merge/markdown_structure.rb
|
|
312
|
+
- lib/markdown/merge/merge_result.rb
|
|
313
|
+
- lib/markdown/merge/node_type_normalizer.rb
|
|
314
|
+
- lib/markdown/merge/output_builder.rb
|
|
315
|
+
- lib/markdown/merge/partial_template_merger.rb
|
|
316
|
+
- lib/markdown/merge/smart_merger.rb
|
|
317
|
+
- lib/markdown/merge/smart_merger_base.rb
|
|
318
|
+
- lib/markdown/merge/table_match_algorithm.rb
|
|
319
|
+
- lib/markdown/merge/table_match_refiner.rb
|
|
320
|
+
- lib/markdown/merge/version.rb
|
|
321
|
+
- lib/markdown/merge/whitespace_normalizer.rb
|
|
322
|
+
- sig/markdown/merge.rbs
|
|
323
|
+
homepage: https://github.com/kettle-rb/markdown-merge
|
|
324
|
+
licenses:
|
|
325
|
+
- MIT
|
|
326
|
+
metadata:
|
|
327
|
+
homepage_uri: https://markdown-merge.galtzo.com/
|
|
328
|
+
source_code_uri: https://github.com/kettle-rb/markdown-merge/tree/v1.0.0
|
|
329
|
+
changelog_uri: https://github.com/kettle-rb/markdown-merge/blob/v1.0.0/CHANGELOG.md
|
|
330
|
+
bug_tracker_uri: https://github.com/kettle-rb/markdown-merge/issues
|
|
331
|
+
documentation_uri: https://www.rubydoc.info/gems/markdown-merge/1.0.0
|
|
332
|
+
funding_uri: https://github.com/sponsors/pboling
|
|
333
|
+
wiki_uri: https://github.com/kettle-rb/markdown-merge/wiki
|
|
334
|
+
news_uri: https://www.railsbling.com/tags/markdown-merge
|
|
335
|
+
discord_uri: https://discord.gg/3qme4XHNKN
|
|
336
|
+
rubygems_mfa_required: 'true'
|
|
337
|
+
rdoc_options:
|
|
338
|
+
- "--title"
|
|
339
|
+
- markdown-merge - ☯️ Ast::Merge-based structure for building Markdown merging tools
|
|
340
|
+
like markly-merge and commonmarker-merge
|
|
341
|
+
- "--main"
|
|
342
|
+
- README.md
|
|
343
|
+
- "--exclude"
|
|
344
|
+
- "^sig/"
|
|
345
|
+
- "--line-numbers"
|
|
346
|
+
- "--inline-source"
|
|
347
|
+
- "--quiet"
|
|
348
|
+
require_paths:
|
|
349
|
+
- lib
|
|
350
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
351
|
+
requirements:
|
|
352
|
+
- - ">="
|
|
353
|
+
- !ruby/object:Gem::Version
|
|
354
|
+
version: 3.2.0
|
|
355
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
356
|
+
requirements:
|
|
357
|
+
- - ">="
|
|
358
|
+
- !ruby/object:Gem::Version
|
|
359
|
+
version: '0'
|
|
360
|
+
requirements: []
|
|
361
|
+
rubygems_version: 4.0.4
|
|
362
|
+
specification_version: 4
|
|
363
|
+
summary: "☯️ Ast::Merge-based structure for building Markdown merging tools like markly-merge
|
|
364
|
+
and commonmarker-merge"
|
|
365
|
+
test_files: []
|
metadata.gz.sig
ADDED
|
Binary file
|