markly 0.15.0 → 0.15.2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d9b96430051a815282d6f83d487fc0c0cdc636b174a1f1f775f0574950e8bab3
4
- data.tar.gz: d16b1c808df1030e6bcc9c67c99f88a0eeae8d8e604b68745e0d8f4c16ac171d
3
+ metadata.gz: 78c9ac76ac7421696ae270097bcf7e960f78b3ae8850232fa9d7c1d6a5e5d893
4
+ data.tar.gz: eb0e5d5ebcfb8cf4f128dc61ac3989eb789a31ae1f9ec7e99ecd6c9482859edc
5
5
  SHA512:
6
- metadata.gz: 9e7e24631dbd95cb90ee889919be9bb6a267c6e2cf31e7355dd21f5e0c903a83a288178bffcf4430eed4ed58b3d2c014e8e3617629a9c703f063069a03cfeaf7
7
- data.tar.gz: 2c51b26c4ce3d2467079ce968f0d2bae307090b49b59b0acfb7396ad00c140e276f76d9291ac4bc65e24e368005b6929990521de4749fecd678f1b6b0ed6d77d
6
+ metadata.gz: 2c68b3899e33d96fcfeb9ad0c2458f67dffd9b9f8d5a1e2f1b2cd8a158faf74d5b4e1246f59b7257606b8b2218175a3563ad048824878ae6b04f6a1f5b7bfc28
7
+ data.tar.gz: 27d4228f0c7f158d1397117ce744f4c00ed7a59fff8253756281dc3f87d01aa642759a71187e9ee137d051d91a9d059a739addaa8b9f8f3b23b544f7ebb3f18b
checksums.yaml.gz.sig CHANGED
Binary file
@@ -0,0 +1,94 @@
1
+ # Abstract Syntax Tree
2
+
3
+ This guide explains how to use Markly's abstract syntax tree (AST) to parse and manipulate Markdown documents.
4
+
5
+ ## Parsing
6
+
7
+ You can parse Markdown to a `Document` node using `Markly.parse`:
8
+
9
+ ~~~ ruby
10
+ require 'markly'
11
+
12
+ document = Markly.parse('*Hello* world')
13
+
14
+ pp document
15
+ ~~~
16
+
17
+ This will print out the following:
18
+
19
+ ~~~
20
+ #<Markly::Node(document):
21
+ source_position={:start_line=>1, :start_column=>1, :end_line=>1, :end_column=>13}
22
+ children=[#<Markly::Node(paragraph):
23
+ source_position={:start_line=>1, :start_column=>1, :end_line=>1, :end_column=>13}
24
+ children=[#<Markly::Node(emph):
25
+ source_position={:start_line=>1, :start_column=>1, :end_line=>1, :end_column=>7}
26
+ children=[#<Markly::Node(text): source_position={:start_line=>1, :start_column=>2, :end_line=>1, :end_column=>6}, string_content="Hello">]>,
27
+ #<Markly::Node(text): source_position={:start_line=>1, :start_column=>8, :end_line=>1, :end_column=>13}, string_content=" world">]>]>
28
+ ~~~
29
+
30
+ As you can see, a document consists of a root node, which contains several children, they themselves containing children, and so on. We refer to this as the abstract syntax tree (AST).
31
+
32
+ ## Example: Walking the AST
33
+
34
+ You can use `walk` or `each` to iterate over nodes:
35
+
36
+ - `walk` will iterate on a node and recursively iterate on a node's children.
37
+ - `each` will iterate on a node and its children, but no further.
38
+
39
+ <!-- end list -->
40
+
41
+ ``` ruby
42
+ require "markly"
43
+
44
+ document = Markly.parse("# The site\n\n [GitHub](https://www.github.com)")
45
+
46
+ # Walk tree and print out URLs for links:
47
+ document.walk do |node|
48
+ if node.type == :link
49
+ puts "URL = #{node.url}"
50
+ end
51
+ end
52
+
53
+ # Capitalize all regular text in headers:
54
+ document.walk do |node|
55
+ if node.type == :header
56
+ node.each do |subnode|
57
+ if subnode.type == :text
58
+ subnode.string_content = subnode.string_content.upcase
59
+ end
60
+ end
61
+ end
62
+ end
63
+
64
+ # Transform links to regular text:
65
+ document.walk do |node|
66
+ if node.type == :link
67
+ node.insert_before(node.first_child)
68
+ node.delete
69
+ end
70
+ end
71
+ ```
72
+
73
+ ### Creating a Custom Renderer
74
+
75
+ You can also derive a class from {ruby Markly::Renderer::HTML} class. Using a pure Ruby renderer is slower, but allows you to customize the output. For example:
76
+
77
+ ``` ruby
78
+ class MyHtmlRenderer < Markly::Renderer::HTML
79
+ def initialize
80
+ super
81
+ @header_id = 1
82
+ end
83
+
84
+ def header(node)
85
+ block do
86
+ out("<h", node.header_level, " id=\"", @header_id, "\">", :children, "</h", node.header_level, ">")
87
+ @header_id += 1
88
+ end
89
+ end
90
+ end
91
+
92
+ my_renderer = MyHtmlRenderer.new
93
+ puts my_renderer.render(document)
94
+ ```
@@ -0,0 +1,101 @@
1
+ # Getting Started
2
+
3
+ This guide explains now to install and use Markly.
4
+
5
+ ## Installation
6
+
7
+ Add the gem to your project:
8
+
9
+ $ bundle add markly
10
+
11
+ ## Usage
12
+
13
+ Markly's most basic usage is to convert Markdown to HTML. You can do this in a few ways:
14
+
15
+ ~~~ ruby
16
+ require 'markly'
17
+
18
+ Markly.render_html('Hi *there*')
19
+ # <p>Hi <em>there</em></p>\n
20
+ ~~~
21
+
22
+ You can also parse a string to receive a `Document` node. You can then print that node to HTML, iterate over the children, and other fun node stuff. For example:
23
+
24
+ ~~~ ruby
25
+ require 'markly'
26
+
27
+ document = Markly.parse('*Hello* world')
28
+ puts(document.to_html) # <p>Hi <em>there</em></p>\n
29
+
30
+ document.walk do |node|
31
+ puts node.type # [:document, :paragraph, :text, :emph, :text]
32
+ end
33
+ ~~~
34
+
35
+ ## Options
36
+
37
+ Markly accepts integer flags which control how the Markdown is parsed and rendered.
38
+
39
+ ### Parse Options
40
+
41
+ | Name | Description
42
+ | ------------------------------------ | -----------
43
+ | `Markly::DEFAULT` | The default parsing system.
44
+ | `Markly::UNSAFE` | Allow raw/custom HTML and unsafe links.
45
+ | `Markly::FOOTNOTES` | Parse footnotes.
46
+ | `Markly::LIBERAL_HTML_TAG` | Support liberal parsing of inline HTML tags.
47
+ | `Markly::SMART` | Use smart punctuation (curly quotes, etc.).
48
+ | `Markly::STRIKETHROUGH_DOUBLE_TILDE` | Parse strikethroughs by double tildes (compatibility with [redcarpet](https://github.com/vmg/redcarpet))
49
+ | `Markly::VALIDATE_UTF8` | Replace illegal sequences with the replacement character `U+FFFD`.
50
+
51
+ ### Render Options
52
+
53
+ | Name | Description |
54
+ | --------------------------------------- | --------------------------------------------------------------- |
55
+ | `Markly::DEFAULT` | The default rendering system. |
56
+ | `Markly::UNSAFE` | Allow raw/custom HTML and unsafe links. |
57
+ | `Markly::GITHUB_PRE_LANG` | Use GitHub-style `<pre lang>` for fenced code blocks. |
58
+ | `Markly::HARD_BREAKS` | Treat `\n` as hardbreaks (by adding `<br/>`). |
59
+ | `Markly::NO_BREAKS` | Translate `\n` in the source to a single whitespace. |
60
+ | `Markly::SOURCE_POSITION` | Include source position in rendered HTML. |
61
+ | `Markly::TABLE_PREFER_STYLE_ATTRIBUTES` | Use `style` insted of `align` for table cells. |
62
+ | `Markly::FULL_INFO_STRING` | Include full info strings of code blocks in separate attribute. |
63
+
64
+ ### Passing Options
65
+
66
+ To apply a single option, pass it in as a flags option:
67
+
68
+ ``` ruby
69
+ Markly.parse("\"Hello,\" said the spider.", flags: Markly::SMART)
70
+ # <p>“Hello,” said the spider.</p>\n
71
+ ```
72
+
73
+ To have multiple options applied, `|` (or) the flags together:
74
+
75
+ ``` ruby
76
+ Markly.render_html("\"'Shelob' is my name.\"", flags: Markly::HARD_BREAKS|Markly::SOURCE_POSITION)
77
+ ```
78
+
79
+ ## Extensions
80
+
81
+ Both `render_html` and `parse` take an optional `extensions:` argument defining the extensions you want enabled as your CommonMark document is being processed:
82
+
83
+ ``` ruby
84
+ Markly.render_html("<script>hi</script>", flags: Markly::UNSAFE, extensions: [:tagfilter])
85
+ ```
86
+
87
+ The documentation for these extensions are [defined in this spec](https://github.github.com/gfm/), and the rationale is provided [in this blog post](https://githubengineering.com/a-formal-spec-for-github-markdown/).
88
+
89
+ The available extensions are:
90
+
91
+ - `:table` - This provides support for tables.
92
+ - `:tasklist` - This provides support for task list items.
93
+ - `:strikethrough` - This provides support for strikethroughs.
94
+ - `:autolink` - This provides support for automatically converting URLs to anchor tags.
95
+ - `:tagfilter` - This escapes [several "unsafe" HTML tags](https://github.github.com/gfm/#disallowed-raw-html-extension-), causing them to not have any effect.
96
+
97
+ ## Developing Locally
98
+
99
+ After cloning the repo:
100
+
101
+ $ bake build test
@@ -0,0 +1,115 @@
1
+ # Headings
2
+
3
+ This guide explains how to work with headings in Markly, including extracting them for navigation and handling duplicate heading text.
4
+
5
+ ## Unique ID Generation
6
+
7
+ When rendering HTML with `ids: true`, duplicate heading text automatically gets unique IDs to avoid collisions. This is particularly useful when multiple sections have the same title (e.g., multiple "Deployment" sections under different parent headings).
8
+
9
+ ``` ruby
10
+ markdown = <<~MARKDOWN
11
+ ## Kubernetes
12
+
13
+ ### Deployment
14
+
15
+ ## Systemd
16
+
17
+ ### Deployment
18
+ MARKDOWN
19
+
20
+ renderer = Markly::Renderer::HTML.new(ids: true)
21
+ html = renderer.render(Markly.parse(markdown))
22
+
23
+ # Generates:
24
+ # <section id="kubernetes">...</section>
25
+ # <section id="deployment">...</section>
26
+ # <section id="systemd">...</section>
27
+ # <section id="deployment-2">...</section>
28
+ ```
29
+
30
+ The first occurrence gets the clean ID, subsequent duplicates get numbered suffixes (`-2`, `-3`, etc.).
31
+
32
+ ## Extracting Headings for Table of Contents
33
+
34
+ The `Headings` class can extract headings for building navigation or table of contents:
35
+
36
+ ``` ruby
37
+ document = Markly.parse(markdown)
38
+ headings = Markly::Renderer::Headings.extract(document, min_level: 2, max_level: 3)
39
+
40
+ headings.each do |heading|
41
+ puts "#{heading.level}: #{heading.text} (#{heading.anchor})"
42
+ end
43
+
44
+ # Output:
45
+ # 2: Kubernetes (kubernetes)
46
+ # 3: Deployment (deployment)
47
+ # 2: Systemd (systemd)
48
+ # 3: Deployment (deployment-2)
49
+ ```
50
+
51
+ Each `Heading` object has:
52
+ - `level` - The heading level (1-6)
53
+ - `text` - The plain text content
54
+ - `anchor` - The unique ID/anchor
55
+ - `node` - The original Markly AST node
56
+
57
+ ### Level Filtering
58
+
59
+ Use `min_level` and `max_level` to filter which heading levels to extract:
60
+
61
+ ``` ruby
62
+ # Only extract h2 and h3 headings
63
+ headings = Markly::Renderer::Headings.extract(document, min_level: 2, max_level: 3)
64
+
65
+ # Only h1 headings
66
+ headings = Markly::Renderer::Headings.extract(document, min_level: 1, max_level: 1)
67
+ ```
68
+
69
+ ## Custom Heading Strategies
70
+
71
+ For advanced use cases, you can provide a custom `Headings` instance to the HTML renderer:
72
+
73
+ ### Sharing State Across Documents
74
+
75
+ To ensure IDs remain unique across multiple documents:
76
+
77
+ ``` ruby
78
+ # Share heading state across multiple documents
79
+ headings = Markly::Renderer::Headings.new
80
+ renderer = Markly::Renderer::HTML.new(headings: headings)
81
+
82
+ doc1_html = renderer.render(Markly.parse(doc1_markdown))
83
+ doc2_html = renderer.render(Markly.parse(doc2_markdown))
84
+ # IDs remain unique across both documents
85
+ ```
86
+
87
+ ### Custom ID Generation
88
+
89
+ Subclass `Headings` to implement alternative ID generation strategies:
90
+
91
+ ``` ruby
92
+ class HierarchicalHeadings < Markly::Renderer::Headings
93
+ def initialize
94
+ super
95
+ @parent_context = []
96
+ end
97
+
98
+ def anchor_for(node)
99
+ base = base_anchor_for(node)
100
+
101
+ # Custom logic: could incorporate parent heading context to generate IDs like "kubernetes-deployment" instead of "deployment-2"
102
+
103
+ if @ids.key?(base)
104
+ @ids[base] += 1
105
+ "#{base}-#{@ids[base]}"
106
+ else
107
+ @ids[base] = 1
108
+ base
109
+ end
110
+ end
111
+ end
112
+
113
+ renderer = Markly::Renderer::HTML.new(headings: HierarchicalHeadings.new)
114
+ ```
115
+
@@ -0,0 +1,20 @@
1
+ # Automatically generated context index for Utopia::Project guides.
2
+ # Do not edit then files in this directory directly, instead edit the guides and then run `bake utopia:project:agent:context:update`.
3
+ ---
4
+ description: CommonMark parser and renderer. Written in C, wrapped in Ruby.
5
+ metadata:
6
+ documentation_uri: https://ioquatix.github.io/markly/
7
+ funding_uri: https://github.com/sponsors/ioquatix/
8
+ source_code_uri: https://github.com/ioquatix/markly.git
9
+ files:
10
+ - path: getting-started.md
11
+ title: Getting Started
12
+ description: This guide explains now to install and use Markly.
13
+ - path: abstract-syntax-tree.md
14
+ title: Abstract Syntax Tree
15
+ description: This guide explains how to use Markly's abstract syntax tree (AST)
16
+ to parse and manipulate Markdown documents.
17
+ - path: headings.md
18
+ title: Headings
19
+ description: This guide explains how to work with headings in Markly, including
20
+ extracting them for navigation and handling duplicate heading text.
data/ext/markly/blocks.c CHANGED
@@ -72,6 +72,20 @@ static CMARK_INLINE bool S_is_space_or_tab(char c) {
72
72
  return (c == ' ' || c == '\t');
73
73
  }
74
74
 
75
+ // Returns true if block is being finalized on the same line it ends.
76
+ // This happens for:
77
+ // - Document node (special case)
78
+ // - Fenced code blocks (end on the closing fence line)
79
+ // - Setext headings (end on the underline)
80
+ // - Any block finalized on the same line it started (e.g., single-line HTML blocks)
81
+ static CMARK_INLINE bool S_ends_on_current_line(cmark_parser *parser, cmark_node *b) {
82
+ return S_type(b) == CMARK_NODE_DOCUMENT ||
83
+ (S_type(b) == CMARK_NODE_CODE_BLOCK && b->as.code.fenced) ||
84
+ (S_type(b) == CMARK_NODE_HEADING && b->as.heading.setext) ||
85
+ // Single-line blocks: finalized on same line they started
86
+ b->start_line == parser->line_number;
87
+ }
88
+
75
89
  static void S_parser_feed(cmark_parser *parser, const unsigned char *buffer,
76
90
  size_t len, bool eof);
77
91
 
@@ -288,17 +302,15 @@ static cmark_node *finalize(cmark_parser *parser, cmark_node *b) {
288
302
  bool has_content;
289
303
 
290
304
  parent = b->parent;
291
- assert(b->flags &
292
- CMARK_NODE__OPEN); // shouldn't call finalize on closed blocks
305
+ assert(b->flags & CMARK_NODE__OPEN); // shouldn't call finalize on closed blocks
293
306
  b->flags &= ~CMARK_NODE__OPEN;
294
307
 
295
308
  if (parser->curline.size == 0) {
296
- // end of input - line number has not been incremented
309
+ // end of input - line number has not been incremented:
297
310
  b->end_line = parser->line_number;
298
311
  b->end_column = parser->last_line_length;
299
- } else if (S_type(b) == CMARK_NODE_DOCUMENT ||
300
- (S_type(b) == CMARK_NODE_CODE_BLOCK && b->as.code.fenced) ||
301
- (S_type(b) == CMARK_NODE_HEADING && b->as.heading.setext)) {
312
+ } else if (S_ends_on_current_line(parser, b)) {
313
+ // Block ends on current line (line_number already incremented):
302
314
  b->end_line = parser->line_number;
303
315
  b->end_column = parser->curline.size;
304
316
  if (b->end_column && parser->curline.ptr[b->end_column - 1] == '\n')
@@ -306,6 +318,7 @@ static cmark_node *finalize(cmark_parser *parser, cmark_node *b) {
306
318
  if (b->end_column && parser->curline.ptr[b->end_column - 1] == '\r')
307
319
  b->end_column -= 1;
308
320
  } else {
321
+ // Block ended on a previous line:
309
322
  b->end_line = parser->line_number - 1;
310
323
  b->end_column = parser->last_line_length;
311
324
  }
data/lib/markly/node.rb CHANGED
@@ -6,6 +6,7 @@
6
6
  # Copyright, 2017, by Goro Fuji.
7
7
  # Copyright, 2018, by Jerry van Leeuwen.
8
8
  # Copyright, 2020-2025, by Samuel Williams.
9
+ # Copyright, 2025, by Olle Jonsson.
9
10
 
10
11
  require_relative "node/inspect"
11
12
 
@@ -26,9 +26,9 @@ module Markly
26
26
  def out(*args)
27
27
  args.each do |arg|
28
28
  if arg == :children
29
- @node.each {|child| out(child)}
29
+ @node.each{|child| out(child)}
30
30
  elsif arg.is_a?(Array)
31
- arg.each {|x| render(x)}
31
+ arg.each{|x| render(x)}
32
32
  elsif arg.is_a?(Node)
33
33
  render(arg)
34
34
  else
@@ -43,7 +43,7 @@ module Markly
43
43
  document(node)
44
44
  @stream.string
45
45
  elsif @in_plain && node.type != :text && node.type != :softbreak
46
- node.each {|child| render(child)}
46
+ node.each{|child| render(child)}
47
47
  else
48
48
  send(node.type, node)
49
49
  end
@@ -10,7 +10,13 @@
10
10
 
11
11
  require_relative "generic"
12
12
  require_relative "headings"
13
- require "cgi"
13
+
14
+ require "cgi/escape"
15
+
16
+ # Compatibility for older Ruby versions where escape_html alias doesn't exist:
17
+ unless CGI.respond_to?(:escape_html)
18
+ require "cgi"
19
+ end
14
20
 
15
21
  module Markly
16
22
  module Renderer
@@ -256,10 +262,10 @@ module Markly
256
262
  end
257
263
 
258
264
  TABLE_CELL_ALIGNMENT = {
259
- left: ' align="left"',
260
- right: ' align="right"',
261
- center: ' align="center"'
262
- }.freeze
265
+ left: ' align="left"',
266
+ right: ' align="right"',
267
+ center: ' align="center"'
268
+ }.freeze
263
269
 
264
270
  def table_cell(node)
265
271
  align = TABLE_CELL_ALIGNMENT.fetch(@alignments[@column_index], "")
@@ -7,5 +7,5 @@
7
7
  # Copyright, 2020-2025, by Samuel Williams.
8
8
 
9
9
  module Markly
10
- VERSION = "0.15.0"
10
+ VERSION = "0.15.2"
11
11
  end
data/license.md CHANGED
@@ -17,9 +17,11 @@ Copyright, 2018, by Akira Matsuda.
17
17
  Copyright, 2018, by Danny Iachini.
18
18
  Copyright, 2019-2020, by Tomoya Chiba.
19
19
  Copyright, 2019, by Brett Walker.
20
- Copyright, 2020, by Olle Jonsson.
20
+ Copyright, 2020-2025, by Olle Jonsson.
21
21
  Copyright, 2020-2025, by Samuel Williams.
22
22
  Copyright, 2024, by Ross Kaffenberger.
23
+ Copyright, 2025, by Henrik Nyh.
24
+ Copyright, 2025, by Peter H. Boling.
23
25
 
24
26
  Permission is hereby granted, free of charge, to any person obtaining a copy
25
27
  of this software and associated documentation files (the "Software"), to deal
data/readme.md CHANGED
@@ -1,18 +1,14 @@
1
1
  # Markly
2
2
 
3
- A parser and abstract syntax tree for Markdown documents (CommonMark compatible) in Ruby. Originally forked from
4
- [CommonMarker](https://github.com/gjtorikian/commonmarker). It also includes extensions to the CommonMark spec as
5
- documented in the [GitHub Flavored Markdown spec](http://github.github.com/gfm/), such as support for tables,
6
- strikethroughs, and autolinking.
3
+ A parser and abstract syntax tree for Markdown documents (CommonMark compatible) in Ruby. Originally forked from [CommonMarker](https://github.com/gjtorikian/commonmarker). It also includes extensions to the CommonMark spec as documented in the [GitHub Flavored Markdown spec](http://github.github.com/gfm/), such as support for tables, strikethroughs, and autolinking.
7
4
 
8
5
  [![Development Status](https://github.com/ioquatix/markly/workflows/Test/badge.svg)](https://github.com/ioquatix/markly/actions?workflow=Test)
9
6
 
10
7
  ## Motivation
11
8
 
12
- This code base was originally forked from [Commonmarker](https://github.com/gjtorikian/commonmarker) before they
13
- switched from `cmark-gfm` (C) to `comrak` (Rust). The original implementation provided access to the abstract syntax
14
- tree (AST), which is useful for building tools on top of Markdown. The Rust implementation does not provide this
15
- functionality, and so this fork was created to continue to provide these (and more) features.
9
+ This code base was originally forked from [Commonmarker](https://github.com/gjtorikian/commonmarker) before theyswitched from `cmark-gfm` (C) to `comrak` (Rust). The original implementation provided access to the abstract syntaxtree (AST), which is useful for building tools on top of Markdown. The Rust implementation did not provide thisfunctionality, and so this fork was created to continue to provide these (and more) features.
10
+
11
+ It should be noted that `commonmarker` re-introduced AST access, but the original C implementation in this fork is [3-4x faster at processing Markdown into HTML](https://github.com/gjtorikian/commonmarker?tab=readme-ov-file#benchmarks) and has a more advanced HTML generation and AST processing features.
16
12
 
17
13
  ## Usage
18
14
 
@@ -28,6 +24,10 @@ Please see the [project documentation](https://ioquatix.github.io/markly/) for m
28
24
 
29
25
  Please see the [project releases](https://ioquatix.github.io/markly/releases/index) for all releases.
30
26
 
27
+ ### v0.15.1
28
+
29
+ - Add agent context.
30
+
31
31
  ### v0.15.0
32
32
 
33
33
  - Introduced `Markly::Renderer::Headings` class for extracting headings from markdown documents with automatic duplicate ID resolution. When rendering HTML with `ids: true`, duplicate heading text now automatically gets unique IDs (`deployment`, `deployment-2`, `deployment-3`). The `Headings` class can also be used to extract headings for building navigation or table of contents.
data/releases.md CHANGED
@@ -1,5 +1,9 @@
1
1
  # Releases
2
2
 
3
+ ## v0.15.1
4
+
5
+ - Add agent context.
6
+
3
7
  ## v0.15.0
4
8
 
5
9
  - Introduced `Markly::Renderer::Headings` class for extracting headings from markdown documents with automatic duplicate ID resolution. When rendering HTML with `ids: true`, duplicate heading text now automatically gets unique IDs (`deployment`, `deployment-2`, `deployment-3`). The `Headings` class can also be used to extract headings for building navigation or table of contents.
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: markly
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.15.0
4
+ version: 0.15.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Garen Torikian
@@ -14,13 +14,15 @@ authors:
14
14
  - Andrew Anderson
15
15
  - Ben Woosley
16
16
  - Goro Fuji
17
+ - Olle Jonsson
17
18
  - Tomoya Chiba
18
19
  - Akira Matsuda
19
20
  - Danny Iachini
21
+ - Henrik Nyh
20
22
  - Jerry van Leeuwen
21
23
  - Michael Camilleri
22
24
  - Mu-An Chiou
23
- - Olle Jonsson
25
+ - Peter H. Boling
24
26
  - Roberto Hidalgo
25
27
  - Ross Kaffenberger
26
28
  - Vitaliy Klachkov
@@ -62,6 +64,10 @@ extensions:
62
64
  - ext/markly/extconf.rb
63
65
  extra_rdoc_files: []
64
66
  files:
67
+ - context/abstract-syntax-tree.md
68
+ - context/getting-started.md
69
+ - context/headings.md
70
+ - context/index.yaml
65
71
  - ext/markly/arena.c
66
72
  - ext/markly/autolink.c
67
73
  - ext/markly/autolink.h
metadata.gz.sig CHANGED
Binary file