probably proper compatibility

This commit is contained in:
Yessiest 2025-03-01 23:13:30 +00:00
parent af93de6f4d
commit 7b8590b9c6
1 changed files with 65 additions and 34 deletions

View File

@ -114,7 +114,6 @@ module PointBlank
def read_properties(text)
properties = {}
remaining = text
warn text.inspect
if text.start_with? '[' # link label
properties[:label], remaining = read_return_label(remaining)
close_bracket = false
@ -258,6 +257,7 @@ module PointBlank
newblock = switchclass.new
newblock.content = block.content
newblock.parser = nil
newblock.parent = block.parent
block.parent[block.position] = newblock
newblock
end
@ -342,8 +342,8 @@ module PointBlank
def consume(line, parent = nil, lazy: false)
@lazy_triggered = lazy || @lazy_triggered
return [nil, nil] if line.match?(/\A {0,3}\Z/)
return [nil, nil] if check_candidates(line, parent)
return [nil, nil] if @closed
return [nil, nil] if check_candidates(line, parent)
push(line)
["", nil]
@ -365,6 +365,13 @@ module PointBlank
other = classes.filter do |cls|
!(once ||= (cls == ::PointBlank::DOM::Paragraph))
end
underlines_match = ::PointBlank::DOM::Paragraph.valid_children.any? do |x|
x.parser.begin?(line)
end
if underlines_match && !@lazy_triggered
@closed = true
return false
end
other.any? do |x|
x.parser.begin? line
end
@ -879,7 +886,8 @@ module PointBlank
obj = ::PointBlank::DOM::Text.new
string = string.gsub(/\\([!"\#$%&'()*+,\-.\/:;<=>?@\[\\\]\^_`{|}~])/,
'\\1')
obj.content = string.strip
string = string.gsub("\n", " ")
obj.content = string
obj
end
@ -924,7 +932,7 @@ module PointBlank
next unless part.last == :close
next unless part[1].respond_to?(:reverse_walk)
backlog = part[1].reverse_walk(backlog)
backlog = part[1].reverse_walk(backlog, doc: @doc)
end
backlog
end
@ -1041,6 +1049,7 @@ module PointBlank
obj = ::PointBlank::DOM::Text.new
string = string.gsub(/\\([!"\#$%&'()*+,\-.\/:;<=>?@\[\\\]\^_`{|}~])/,
'\\1')
string = string.gsub("\n", " ")
obj.content = string
obj
end
@ -1159,17 +1168,25 @@ module PointBlank
# Build object and apply link info to it
# @param capture [Array<String, Array(String, Class, Symbol)>]
# @param doc [::PointBlank::DOM::DOMObject]
# @return [::PointBlank::DOM::DOMObject]
def self.build_w_linkinfo(capture)
def self.build_w_linkinfo(capture, doc)
linkinfo = capture[-1][2]
obj = build(capture[1..-2])
if linkinfo[:label]
if (props = doc.root.properties[:linkdefs][linkinfo[:label]])
linkinfo = props
else
return nil
end
end
obj.properties = linkinfo
obj
end
# TODO: optimize, increase index instead of building buffers
# (see ::PointBlank::Parsing::NullInline#reverse_walk)
def self.reverse_walk(backlog)
def self.reverse_walk(backlog, doc:)
before = []
capture = []
open = true
@ -1184,7 +1201,8 @@ module PointBlank
end
return backlog if open
before + [cls.build_w_linkinfo(capture)]
block = cls.build_w_linkinfo(capture, doc)
block ? before + [block] : backlog
end
end
@ -1289,7 +1307,7 @@ module PointBlank
end
# (see ::PointBlank::Parsing::NullInline#reverse_walk)
def self.reverse_walk(backlog)
def self.reverse_walk(backlog, **_doc)
until backlog.last.first.empty?
capture = []
before = []
@ -1351,7 +1369,7 @@ module PointBlank
# (see ::PointBlank::Parsing::NullInline#tokenize)
def self.tokenize(string)
iterate_tokens(string, /(?: \n|\\\n)/) do |_before, token, matched|
next ["\n", self, :close] if token == " \\n"
next ["\n", self, :close] if token.start_with?(" \n")
next ["\n", self, :close] if matched
" "
@ -1359,7 +1377,7 @@ module PointBlank
end
# (see ::PointBlank::Parsing::NullInline#reverse_walk)
def self.reverse_walk(backlog)
def self.reverse_walk(backlog, **_doc)
backlog[-1] = build([])
backlog
end
@ -1507,6 +1525,14 @@ module PointBlank
@children.dup
end
# Get root element containing this child
# @return [::PointBlank::DOM::DOMObject]
def root
current_root = self
current_root = current_root.parent while current_root.parent
current_root
end
# Append child
# @param child [DOMObject]
def append_child(child)
@ -1519,14 +1545,9 @@ module PointBlank
@children.append(child)
end
# Append temp. child
# @param child [DOMObject, String]
def append_temp(child)
unless child.is_a?(::PointBlank::DOM::DOMObject) ||
child.is_a?(String)
raise DOMError, "invlaid temp class #{child.class}"
end
# Append temp child
# @param child [DOMObject]
def append_temp_child(child)
@temp_children.append(child)
end
@ -1547,7 +1568,7 @@ module PointBlank
define_parser ::PointBlank::Parsing::CodeInline
end
# Linebreak
# Hard Linebreak
class InlineBreak < DOMObject
define_parser ::PointBlank::Parsing::HardBreakInline
end
@ -1628,14 +1649,10 @@ module PointBlank
# Leaf block (virtual)
class LeafBlock < DOMObject
# Virtual hook to push inlines in place of leaf blocks
# Virtual hook to delay inline processing
def parse_inner
child = ::PointBlank::DOM::InlineRoot.new
child.content = content
scanner = ::PointBlank::Parsing::StackScanner.new(child)
scanner.scan
self.content = ""
child.each { |c| append_child(c) }
self.content = content.strip if content
root.append_temp_child(self)
end
end
@ -1651,6 +1668,24 @@ module PointBlank
# Document root
class Document < Block
# (see ::PointBlank::DOM::DOMObject#parse)
def self.parse(doc)
output = super(doc)
# This has to be done after the document gets processed due to the way link
# definitions have to be handled.
parse_inner = lambda do |block|
child = ::PointBlank::DOM::InlineRoot.new
child.parent = block.parent
child.content = block.content
scanner = ::PointBlank::Parsing::StackScanner.new(child)
scanner.scan
block.content = ""
child.each { |c| block.append_child(c) }
end
output.temp_children.each { |block| parse_inner.call(block) }
output.temp_children.clear
output
end
end
# Paragraph in a document (separated by 2 newlines)
@ -1659,14 +1694,10 @@ module PointBlank
define_overlay ::PointBlank::Parsing::ParagraphUnderlineOverlay, 0
define_overlay ::PointBlank::Parsing::LinkReferenceOverlay
# Virtual hook to parse inline contents of a finished paragraph
# Virtual hook to delay inline processing
def parse_inner
child = ::PointBlank::DOM::InlineRoot.new
child.content = content
scanner = ::PointBlank::Parsing::StackScanner.new(child)
scanner.scan
self.content = ""
child.each { |c| append_child(c) }
self.content = content.strip if content
root.append_temp_child(self)
end
end