class Tags
Represents a collection of documentation tags and their parsing logic.
Definitions
def self.build
Build a tags parser with directive mappings.
Signature
-
yields
{|directives| directives['directive'] = Class} -
parameter
directivesHash(String, _Directive) The directive mappings hash to configure.
-
parameter
-
returns
Tags A new tags parser with the configured directives.
- rbs
()
(Hash[String, Class]) -> void-> Tags
Implementation
def self.build
directives = Hash.new
yield directives
return self.new(directives)
end
def initialize(directives)
Initialize a new tags parser.
Signature
-
parameter
directivesHash(String, _Directive) The directive mappings.
Implementation
def initialize(directives)
@directives = directives
end
def valid_indentation?(line, level)
Check if a line has valid indentation for the given level.
Signature
-
parameter
lineString The line to check.
-
parameter
levelInteger The expected indentation level.
Implementation
def valid_indentation?(line, level)
line.start_with?(" " * level) || line.start_with?("\t" * level)
end
PATTERN = /\A\s*@(?<directive>.*?)(\s+(?<remainder>.*?))?\Z/
Signature
- constant
Pattern for matching tag directives in comment lines.
def parse(lines, level = 0, &block)
Parse documentation tags from lines.
Signature
-
parameter
linesArray(String) The lines to parse.
-
parameter
levelInteger The indentation level.
-
yields
{|node| process parsed node} -
parameter
nodeNode | Text The parsed node (either a structured tag or plain text).
-
parameter
-
returns
void Parses tags from lines and yields them to the block.
- rbs
(Array[String] lines, ?Integer level)
(Node | Text) -> void-> void
Implementation
def parse(lines, level = 0, &block)
while line = lines.first
# Is it at the right indentation level:
return unless valid_indentation?(line, level)
# We are going to consume the line:
lines.shift
# Match it against a tag:
if match = PATTERN.match(line)
directive = match[:directive] #: String
remainder = match[:remainder] #: String
# @type var klass: _Directive?
if klass = @directives[directive]
yield klass.parse(
directive, remainder,
lines, self, level
)
else
# Ignore unknown directive.
end
# Or it's just text:
else
yield Text.new(line)
end
end
end
def ignore(lines, level = 0)
Ignore lines at the specified indentation level.
Signature
-
parameter
linesArray(String) The lines to ignore.
-
parameter
levelInteger The indentation level.
Implementation
def ignore(lines, level = 0)
if line = lines.first
# Is it at the right indentation level:
return unless valid_indentation?(line, level)
lines.shift
end
end