diff options
author | nagachika <nagachika@ruby-lang.org> | 2021-05-22 14:51:13 +0900 |
---|---|---|
committer | nagachika <nagachika@ruby-lang.org> | 2021-05-22 14:51:55 +0900 |
commit | 2a70d2148453aeb39443f4c84147ace722d53a9a (patch) | |
tree | 087960766130077e1fef3bb55c9a78b7bed47902 /lib/rdoc/markup/attribute_manager.rb | |
parent | 3e07a4edc92f18dec4806961c1b724ac5cf4d6b2 (diff) |
merge revision(s) b1c73f239fe9af97de837331849f55d67c27561e,bb570ce6d80d28cfc7131dcb72885eed2f989b30,b88d1e6b44164bca0c2b85ea6639469813e1e1d8,127f735c1e5e0771076caf2a74390757a42fb177,f3f1a666c77f8c528b0adc9ccf78e4b9910bd6e0,fa048a0f8523cefde5428805dd334691486319e6,d5d1c41728d65acfb8aa2cf95f2d8ac88f271cd1,52ebaf718e6a78297ceb0dff49815eeed28eae45,7fe22152fc28084f4395fece84ff6e5eb2d6b288,19e6d271266eca5925e66fc8ec39b251a2fa6bcd,05898c5b9001c0b1e8bd7bf0d12b42a8e7c388b8,3651f678a719ae3a35825bcb4e0dabbc7c60d8df,10b082064e6ab0943cce4ef43e567d8044c7096d,de8e6218a3257fe19b46ff0aa157e66f452ac8b7,971a0cd246db6578e1ea8760a903e1a23e3681f3,61a29a41e1d0d11a9963315aa86d25ed690124c0,ff9a00887161840eb8a34d53749a7d7962181cfe,fad3412d475b57055f426cf4e86eafeab516672b,54aa11efa8b1be2c5d20402890d6d2fa90aa19a8,e84d275fe6d0c14ba58ce73b13323879c060b7ae,61e1cf23ac0d122fba3ad4cbaa402c7c94ad54d3,a6948329f8f89fb390215086fe4a888915fd589e,64b991b0cd98ee8f23266b8cbea0fa34bdaab1ec,b1c73f239fe9af97de837331849f55d67c27561e,0ee24b4fab1a1faef600a42c29863e1c3edd8c61: [Backport #17877]
Synchronize rdoc with upstream version v6.3.1.
[ruby/rdoc] Use File.open to fix the OS Command Injection
vulnerability in CVE-2021-31799
https://github.com/ruby/rdoc/commit/a7f5d6ab88
---
lib/rdoc/rdoc.rb | 2 +-
test/rdoc/test_rdoc_rdoc.rb | 12 ++++++++++++
2 files changed, 13 insertions(+), 1 deletion(-)
[ruby/rdoc] Support ChangeLog generated by `git log`
https://github.com/ruby/rdoc/commit/5e0a123ca1
---
lib/rdoc/parser/changelog.rb | 35 +++++++++++++++++++++
test/rdoc/test_rdoc_parser_changelog.rb | 56 +++++++++++++++++++++++++++++++++
2 files changed, 91 insertions(+)
[ruby/rdoc] Make each commit entries h3
https://github.com/ruby/rdoc/commit/11eefb2ae9
---
lib/rdoc/parser/changelog.rb | 12 ++++++------
test/rdoc/test_rdoc_parser_changelog.rb | 12 ++++--------
2 files changed, 10 insertions(+), 14 deletions(-)
[ruby/rdoc] Tweak log entry markdown
* add 3 levels to headings
* prefix commit log to labels to make unique IDs
https://github.com/ruby/rdoc/commit/5074c13209
---
lib/rdoc/parser/changelog.rb | 20 +++++++++++++++++-
test/rdoc/test_rdoc_parser_changelog.rb | 36 ++++++++++++++++++++++++++++++++-
2 files changed, 54 insertions(+), 2 deletions(-)
[ruby/rdoc] Shorten commit hashes
https://github.com/ruby/rdoc/commit/5d3e153963
---
lib/rdoc/parser/changelog.rb | 2 +-
test/rdoc/test_rdoc_parser_changelog.rb | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
[ruby/rdoc] Add links to the commits
https://github.com/ruby/rdoc/commit/1821628076
---
lib/rdoc/parser/changelog.rb | 107 +++++++++++++++++++++++++-------
test/rdoc/test_rdoc_parser_changelog.rb | 36 ++++++-----
2 files changed, 107 insertions(+), 36 deletions(-)
[ruby/rdoc] Sort by CommitDate if available
https://github.com/ruby/rdoc/commit/455715e930
---
lib/rdoc/parser/changelog.rb | 11 ++++++---
test/rdoc/test_rdoc_parser_changelog.rb | 40 +++++++++++++++++++++++++++++++++
2 files changed, 48 insertions(+), 3 deletions(-)
[ruby/rdoc] Skip non-date logs by git-log
`RDoc::Parser::ChangeLog` mis-parses ChangeLog generated by
git-log, because of too heuristic `Time.parse`.
For instance, "commit 8187228de0142d3ac7950b7d977c2849e934c637"
results in "8187-08-16", that is, day 228 in the year 8187.
https://github.com/ruby/rdoc/commit/9711e6f6d9
---
lib/rdoc/parser/changelog.rb | 36 ++++++++++++++++++++-------------
test/rdoc/test_rdoc_parser_changelog.rb | 2 ++
2 files changed, 24 insertions(+), 14 deletions(-)
[ruby/rdoc] Support other date formats in git-log
https://github.com/ruby/rdoc/commit/ad8cf37d72
---
lib/rdoc/parser/changelog.rb | 6 +++---
test/rdoc/test_rdoc_parser_changelog.rb | 22 ++++++++++++++++++++++
2 files changed, 25 insertions(+), 3 deletions(-)
[ruby/rdoc] Support iso-strict format in git-log
https://github.com/ruby/rdoc/commit/2a6c22da63
---
lib/rdoc/parser/changelog.rb | 6 +++---
test/rdoc/test_rdoc_parser_changelog.rb | 11 +++++++++++
2 files changed, 14 insertions(+), 3 deletions(-)
[ruby/rdoc] Update Rdoc.css sidebar panel.
Updates css so the sidebar look like a panel instead of looking like chopped edges.
https://github.com/ruby/rdoc/commit/b0098c6d72
---
lib/rdoc/generator/template/darkfish/css/rdoc.css | 1 +
1 file changed, 1 insertion(+)
[ruby/rdoc] Support GFM table
https://github.com/ruby/rdoc/commit/9dc933df16
---
lib/rdoc/markdown.rb | 349 +++++++++++++++++++++++++++++++-
lib/rdoc/markup.rb | 1 +
lib/rdoc/markup/table.rb | 47 +++++
lib/rdoc/markup/to_html.rb | 23 +++
lib/rdoc/markup/to_joined_paragraph.rb | 1 +
lib/rdoc/markup/to_rdoc.rb | 28 +++
lib/rdoc/markup/to_table_of_contents.rb | 1 +
test/rdoc/test_rdoc_markdown.rb | 23 +++
8 files changed, 471 insertions(+), 2 deletions(-)
create mode 100644 lib/rdoc/markup/table.rb
[ruby/rdoc] Add table style
https://github.com/ruby/rdoc/commit/2219c5ae80
---
lib/rdoc/generator/template/darkfish/css/rdoc.css | 19 +++++++++++++++++++
1 file changed, 19 insertions(+)
[ruby/rdoc] Fixed CodeFence without blank lines
Currently a fenced code block needs a preceding blank line, it
should not be required, as:
https://github.github.com/gfm/#fenced-code-blocks
> A fenced code block may interrupt a paragraph, and does not
> require a blank line either before or after.
Just recommended:
https://docs.github.com/en/github/writing-on-github/creating-and-highlighting-code-blocks
> We recommend placing a blank line before and after code blocks
> to make the raw formatting easier to read.
https://github.com/ruby/rdoc/commit/0e1776caf3
---
lib/rdoc/markdown.rb | 447 +++++++---------------------------------
test/rdoc/test_rdoc_markdown.rb | 36 +++-
2 files changed, 112 insertions(+), 371 deletions(-)
[ruby/rdoc] Allow partial default values to be overridden with
.rdoc_options
https://github.com/ruby/rdoc/commit/e14800891f
---
lib/rdoc/options.rb | 34 +++++++++++++++++++++++++++++++++-
lib/rdoc/rdoc.rb | 7 ++++++-
test/rdoc/test_rdoc_rdoc.rb | 12 ++++++++++++
3 files changed, 51 insertions(+), 2 deletions(-)
[ruby/rdoc] Allow empty .rdoc_options
https://github.com/ruby/rdoc/commit/0c8cb25b50
---
lib/rdoc/rdoc.rb | 2 ++
test/rdoc/test_rdoc_rdoc.rb | 11 +++++++++++
2 files changed, 13 insertions(+)
[ruby/rdoc] Suppress unused variable warning of "text"
https://github.com/ruby/rdoc/commit/3a4120b155
---
lib/rdoc/markdown.rb | 345 ++++++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 343 insertions(+), 2 deletions(-)
[ruby/rdoc] Get rid of a trailing space
https://github.com/ruby/rdoc/commit/7b7b91768e
---
lib/rdoc/markdown.rb | 7 +++----
1 file changed, 3 insertions(+), 4 deletions(-)
[ruby/rdoc] Disable other notations in <code> tags
https://github.com/ruby/rdoc/commit/0cd3b55210
---
lib/rdoc/markup/attr_span.rb | 10 ++-
lib/rdoc/markup/attribute_manager.rb | 102 ++++++++++++++++++------
test/rdoc/test_rdoc_markup_attribute_manager.rb | 24 +++++-
test/rdoc/test_rdoc_markup_to_html.rb | 6 ++
4 files changed, 114 insertions(+), 28 deletions(-)
[ruby/rdoc] Treat other tags as word boundaries
https://github.com/ruby/rdoc/commit/8222f85a17
---
lib/rdoc/markup/attribute_manager.rb | 17 +++++++++++++----
test/rdoc/test_rdoc_markup_to_html.rb | 5 +++++
2 files changed, 18 insertions(+), 4 deletions(-)
[ruby/rdoc] Treat emphasis tags as excluding other notations
And exclusive notations don't exclude other exclusive notations.
https://github.com/ruby/rdoc/commit/b8baa9a435
---
lib/rdoc/markup/attr_span.rb | 2 +-
lib/rdoc/markup/attribute_manager.rb | 10 +++++-----
test/rdoc/test_rdoc_markup_attribute_manager.rb | 1 +
3 files changed, 7 insertions(+), 6 deletions(-)
[ruby/rdoc] Clarify that dots in URL are replaced
The dots in all path components from the document root are
replaced with underscores, not only in the basename.
https://github.com/ruby/rdoc/commit/7a3417ea4c
---
test/rdoc/test_rdoc_top_level.rb | 3 +++
1 file changed, 3 insertions(+)
[ruby/rdoc] Links to document texts without "rdoc-ref:" prefix
While links to generated HTML from RDoc file needs to be prefixed
by "rdoc-ref:" currently, in case of explicit references this
seems just redundant.
Also GitHub RDoc support does not work with this prefix.
This patch lets links to such document texts (".rb", ".rdoc" and
".md" now) refer URLs generated by `RDoc::TopLevel#http_url`
without the prefix.
https://github.com/ruby/rdoc/commit/f18b27b69d
---
lib/rdoc/markup/to_html.rb | 4 ++++
test/rdoc/test_rdoc_markup_to_html.rb | 21 +++++++++++++++++++++
2 files changed, 25 insertions(+)
[ruby/rdoc] Use File.open to fix the OS Command Injection
vulnerability in CVE-2021-31799
https://github.com/ruby/rdoc/commit/a7f5d6ab88
---
lib/rdoc/rdoc.rb | 2 +-
test/rdoc/test_rdoc_rdoc.rb | 12 ++++++++++++
2 files changed, 13 insertions(+), 1 deletion(-)
[ruby/rdoc] Version 6.3.1
https://github.com/ruby/rdoc/commit/9307f932b7
---
lib/rdoc/version.rb | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
Diffstat (limited to 'lib/rdoc/markup/attribute_manager.rb')
-rw-r--r-- | lib/rdoc/markup/attribute_manager.rb | 121 |
1 files changed, 93 insertions, 28 deletions
diff --git a/lib/rdoc/markup/attribute_manager.rb b/lib/rdoc/markup/attribute_manager.rb index f052bc8b01..50764510f3 100644 --- a/lib/rdoc/markup/attribute_manager.rb +++ b/lib/rdoc/markup/attribute_manager.rb @@ -59,6 +59,10 @@ class RDoc::Markup::AttributeManager attr_reader :regexp_handlings ## + # A bits of exclusive maps + attr_reader :exclusive_bitmap + + ## # Creates a new attribute manager that understands bold, emphasized and # teletype text. @@ -68,17 +72,18 @@ class RDoc::Markup::AttributeManager @protectable = %w[<] @regexp_handlings = [] @word_pair_map = {} + @exclusive_bitmap = 0 @attributes = RDoc::Markup::Attributes.new - add_word_pair "*", "*", :BOLD - add_word_pair "_", "_", :EM - add_word_pair "+", "+", :TT + add_word_pair "*", "*", :BOLD, true + add_word_pair "_", "_", :EM, true + add_word_pair "+", "+", :TT, true - add_html "em", :EM - add_html "i", :EM - add_html "b", :BOLD - add_html "tt", :TT - add_html "code", :TT + add_html "em", :EM, true + add_html "i", :EM, true + add_html "b", :BOLD, true + add_html "tt", :TT, true + add_html "code", :TT, true end ## @@ -122,29 +127,67 @@ class RDoc::Markup::AttributeManager res end + def exclusive?(attr) + (attr & @exclusive_bitmap) != 0 + end + + NON_PRINTING_START = "\1" # :nodoc: + NON_PRINTING_END = "\2" # :nodoc: + ## # Map attributes like <b>text</b>to the sequence # \001\002<char>\001\003<char>, where <char> is a per-attribute specific # character - def convert_attrs(str, attrs) + def convert_attrs(str, attrs, exclusive = false) + convert_attrs_matching_word_pairs(str, attrs, exclusive) + convert_attrs_word_pair_map(str, attrs, exclusive) + end + + def convert_attrs_matching_word_pairs(str, attrs, exclusive) # first do matching ones - tags = @matching_word_pairs.keys.join("") + tags = @matching_word_pairs.select { |start, bitmap| + if exclusive && exclusive?(bitmap) + true + elsif !exclusive && !exclusive?(bitmap) + true + else + false + end + }.keys + return if tags.empty? + all_tags = @matching_word_pairs.keys - re = /(^|\W)([#{tags}])([#\\]?[\w:.\/-]+?\S?)\2(\W|$)/ + re = /(^|\W|[#{all_tags.join("")}])([#{tags.join("")}])(\2*[#\\]?[\w:.\/\[\]-]+?\S?)\2(?!\2)([#{all_tags.join("")}]|\W|$)/ - 1 while str.gsub!(re) do + 1 while str.gsub!(re) { |orig| attr = @matching_word_pairs[$2] - attrs.set_attrs($`.length + $1.length + $2.length, $3.length, attr) - $1 + NULL * $2.length + $3 + NULL * $2.length + $4 - end + attr_updated = attrs.set_attrs($`.length + $1.length + $2.length, $3.length, attr) + if attr_updated + $1 + NULL * $2.length + $3 + NULL * $2.length + $4 + else + $1 + NON_PRINTING_START + $2 + NON_PRINTING_END + $3 + NON_PRINTING_START + $2 + NON_PRINTING_END + $4 + end + } + str.delete!(NON_PRINTING_START + NON_PRINTING_END) + end + def convert_attrs_word_pair_map(str, attrs, exclusive) # then non-matching unless @word_pair_map.empty? then @word_pair_map.each do |regexp, attr| - str.gsub!(regexp) { - attrs.set_attrs($`.length + $1.length, $2.length, attr) - NULL * $1.length + $2 + NULL * $3.length + if !exclusive + next if exclusive?(attr) + else + next if !exclusive?(attr) + end + 1 while str.gsub!(regexp) { |orig| + updated = attrs.set_attrs($`.length + $1.length, $2.length, attr) + if updated + NULL * $1.length + $2 + NULL * $3.length + else + orig + end } end end @@ -153,10 +196,18 @@ class RDoc::Markup::AttributeManager ## # Converts HTML tags to RDoc attributes - def convert_html(str, attrs) - tags = @html_tags.keys.join '|' + def convert_html(str, attrs, exclusive = false) + tags = @html_tags.select { |start, bitmap| + if exclusive && exclusive?(bitmap) + true + elsif !exclusive && !exclusive?(bitmap) + true + else + false + end + }.keys.join '|' - 1 while str.gsub!(/<(#{tags})>(.*?)<\/\1>/i) { + 1 while str.gsub!(/<(#{tags})>(.*?)<\/\1>/i) { |orig| attr = @html_tags[$1.downcase] html_length = $1.length + 2 seq = NULL * html_length @@ -168,8 +219,13 @@ class RDoc::Markup::AttributeManager ## # Converts regexp handling sequences to RDoc attributes - def convert_regexp_handlings str, attrs + def convert_regexp_handlings str, attrs, exclusive = false @regexp_handlings.each do |regexp, attribute| + if exclusive + next if !exclusive?(attribute) + else + next if exclusive?(attribute) + end str.scan(regexp) do capture = $~.size == 1 ? 0 : 1 @@ -205,7 +261,7 @@ class RDoc::Markup::AttributeManager # # am.add_word_pair '*', '*', :BOLD - def add_word_pair(start, stop, name) + def add_word_pair(start, stop, name, exclusive = false) raise ArgumentError, "Word flags may not start with '<'" if start[0,1] == '<' @@ -220,6 +276,8 @@ class RDoc::Markup::AttributeManager @protectable << start[0,1] @protectable.uniq! + + @exclusive_bitmap |= bitmap if exclusive end ## @@ -228,8 +286,10 @@ class RDoc::Markup::AttributeManager # # am.add_html 'em', :EM - def add_html(tag, name) - @html_tags[tag.downcase] = @attributes.bitmap_for name + def add_html(tag, name, exclusive = false) + bitmap = @attributes.bitmap_for name + @html_tags[tag.downcase] = bitmap + @exclusive_bitmap |= bitmap if exclusive end ## @@ -238,8 +298,10 @@ class RDoc::Markup::AttributeManager # # @am.add_regexp_handling(/((https?:)\S+\w)/, :HYPERLINK) - def add_regexp_handling pattern, name - @regexp_handlings << [pattern, @attributes.bitmap_for(name)] + def add_regexp_handling pattern, name, exclusive = false + bitmap = @attributes.bitmap_for(name) + @regexp_handlings << [pattern, bitmap] + @exclusive_bitmap |= bitmap if exclusive end ## @@ -250,8 +312,11 @@ class RDoc::Markup::AttributeManager mask_protected_sequences - @attrs = RDoc::Markup::AttrSpan.new @str.length + @attrs = RDoc::Markup::AttrSpan.new @str.length, @exclusive_bitmap + convert_attrs @str, @attrs, true + convert_html @str, @attrs, true + convert_regexp_handlings @str, @attrs, true convert_attrs @str, @attrs convert_html @str, @attrs convert_regexp_handlings @str, @attrs |