Module: RailroadDiagrams

Defined in:
lib/railroad_diagrams.rb,
lib/railroad_diagrams/end.rb,
lib/railroad_diagrams/skip.rb,
lib/railroad_diagrams/block.rb,
lib/railroad_diagrams/group.rb,
lib/railroad_diagrams/rails.rb,
lib/railroad_diagrams/stack.rb,
lib/railroad_diagrams/start.rb,
lib/railroad_diagrams/style.rb,
lib/railroad_diagrams/theme.rb,
lib/railroad_diagrams/choice.rb,
lib/railroad_diagrams/errors.rb,
lib/railroad_diagrams/except.rb,
lib/railroad_diagrams/repeat.rb,
lib/railroad_diagrams/builder.rb,
lib/railroad_diagrams/command.rb,
lib/railroad_diagrams/comment.rb,
lib/railroad_diagrams/diagram.rb,
lib/railroad_diagrams/options.rb,
lib/railroad_diagrams/special.rb,
lib/railroad_diagrams/version.rb,
lib/railroad_diagrams/document.rb,
lib/railroad_diagrams/optional.rb,
lib/railroad_diagrams/sequence.rb,
lib/railroad_diagrams/terminal.rb,
lib/railroad_diagrams/char_class.rb,
lib/railroad_diagrams/one_or_more.rb,
lib/railroad_diagrams/diagram_item.rb,
lib/railroad_diagrams/non_terminal.rb,
lib/railroad_diagrams/zero_or_more.rb,
lib/railroad_diagrams/expanded_node.rb,
lib/railroad_diagrams/separated_list.rb,
lib/railroad_diagrams/transform/lint.rb,
lib/railroad_diagrams/complex_diagram.rb,
lib/railroad_diagrams/multiple_choice.rb,
lib/railroad_diagrams/horizontal_choice.rb,
lib/railroad_diagrams/optional_sequence.rb,
lib/railroad_diagrams/importers/w3c_ebnf.rb,
lib/railroad_diagrams/transform/auto_wrap.rb,
lib/railroad_diagrams/alternating_sequence.rb,
lib/railroad_diagrams/transform/simplifier.rb,
lib/railroad_diagrams/importers/yaml_grammar.rb,
sig/generated/railroad_diagrams.rbs,
sig/generated/railroad_diagrams/end.rbs,
sig/generated/railroad_diagrams/skip.rbs,
sig/generated/railroad_diagrams/block.rbs,
sig/generated/railroad_diagrams/group.rbs,
sig/generated/railroad_diagrams/stack.rbs,
sig/generated/railroad_diagrams/start.rbs,
sig/generated/railroad_diagrams/style.rbs,
sig/generated/railroad_diagrams/theme.rbs,
sig/generated/railroad_diagrams/choice.rbs,
sig/generated/railroad_diagrams/errors.rbs,
sig/generated/railroad_diagrams/except.rbs,
sig/generated/railroad_diagrams/repeat.rbs,
sig/generated/railroad_diagrams/command.rbs,
sig/generated/railroad_diagrams/comment.rbs,
sig/generated/railroad_diagrams/diagram.rbs,
sig/generated/railroad_diagrams/options.rbs,
sig/generated/railroad_diagrams/special.rbs,
sig/generated/railroad_diagrams/version.rbs,
sig/generated/railroad_diagrams/optional.rbs,
sig/generated/railroad_diagrams/sequence.rbs,
sig/generated/railroad_diagrams/terminal.rbs,
sig/generated/railroad_diagrams/char_class.rbs,
sig/generated/railroad_diagrams/one_or_more.rbs,
sig/generated/railroad_diagrams/diagram_item.rbs,
sig/generated/railroad_diagrams/non_terminal.rbs,
sig/generated/railroad_diagrams/zero_or_more.rbs,
sig/generated/railroad_diagrams/expanded_node.rbs,
sig/generated/railroad_diagrams/separated_list.rbs,
sig/generated/railroad_diagrams/complex_diagram.rbs,
sig/generated/railroad_diagrams/multiple_choice.rbs,
sig/generated/railroad_diagrams/horizontal_choice.rbs,
sig/generated/railroad_diagrams/optional_sequence.rbs,
sig/generated/railroad_diagrams/alternating_sequence.rbs

Overview

Build and render railroad diagrams for grammar rules.

Examples:

RailroadDiagrams::Diagram.new('SELECT').to_svg

Defined Under Namespace

Modules: DSL, Error, ExpandedNode, Importers, Rails, ResetChildrenOnFormat, Transform Classes: AlternatingSequence, Block, Builder, CharClass, Choice, Command, Comment, ComplexDiagram, Diagram, DiagramItem, Document, End, Except, Group, HorizontalChoice, InvalidArgument, MultipleChoice, NonTerminal, OneOrMore, Optional, OptionalSequence, Options, ParseError, RenderError, Repeat, SeparatedList, Sequence, Skip, Special, Stack, Start, Style, Terminal, Theme, ZeroOrMore

Constant Summary collapse

VS =

minimum vertical separation between things. For a 3px stroke, must be at least 4

Returns:

  • (Integer)
8
AR =

radius of arcs

Returns:

  • (Integer)
10
DIAGRAM_CLASS =

class to put on the root

Returns:

  • (String)
'railroad-diagram'
STROKE_ODD_PIXEL_LENGTH =

is the stroke width an odd (1px, 3px, etc) pixel length?

Returns:

  • (Boolean)
true
INTERNAL_ALIGNMENT =

how to align items when they have extra space. left/right/center

Returns:

  • (String)
'center'
CHAR_WIDTH =

width of each monospace character. play until you find the right value for your font

Returns:

  • (Float)
8.5
COMMENT_CHAR_WIDTH =

comments are in smaller text by default

Returns:

  • (Integer)
7
DEFAULT_OPTIONS =

Returns:

  • (Object)
Options.new(
  vertical_separation: VS, arc_radius: AR, diagram_class: DIAGRAM_CLASS,
  stroke_odd_pixel_length: STROKE_ODD_PIXEL_LENGTH,
  internal_alignment: INTERNAL_ALIGNMENT.to_sym,
  char_width: CHAR_WIDTH, comment_char_width: COMMENT_CHAR_WIDTH,
  ambiguous_width: 1, measurer: nil, text_charset: :unicode, escape_html: false,
  precision: nil, optimize_paths: false, href_mode: :xlink, link_policy: :safe, link_policy_violation: :warn,
  link_target: nil, link_rel: nil, id_prefix: nil, debug: false, locale: :en,
  theme: :default, inline_styles: false, max_width: nil, show_start: true, show_end: true, coerce: nil
).freeze
VERSION =

: String

Returns:

  • (String)
'1.1.0'

Class Method Summary collapse

Class Method Details

.build(coerce: nil, &block) ⇒ Object

Evaluate a DSL block and return its root node.

Examples:

RailroadDiagrams.build { seq('SELECT', :column) }

Raises:



204
205
206
207
208
209
210
# File 'lib/railroad_diagrams/builder.rb', line 204

def self.build(coerce: nil, &block)
  raise InvalidArgument, 'a block is required' unless block

  builder = Builder.new(coerce: coerce)
  value = block.arity.zero? ? builder.instance_eval(&block) : block.call(builder)
  Coercion.call(value, builder.coercion)
end

.configure ⇒ Object

Update the default rendering settings for future diagrams.

Examples:

RailroadDiagrams.configure { |options| options[:theme] = :dark }

Returns:

  • (Object)


49
50
51
52
53
# File 'lib/railroad_diagrams/options.rb', line 49

def configure
  values = default_options.to_h
  yield values
  @default_options = DEFAULT_OPTIONS.merge(**values)
end

.default_options ⇒ Object

Return the current default rendering settings.

Examples:

RailroadDiagrams.default_options.href_mode #=> :xlink

Returns:

  • (Object)


42
43
44
# File 'lib/railroad_diagrams/options.rb', line 42

def default_options
  @default_options || DEFAULT_OPTIONS
end

.diagram(**options, &block) ⇒ Object

Evaluate a DSL block and wrap it in a complete diagram.

Examples:

RailroadDiagrams.diagram(theme: :dark) { seq('SELECT', :column) }


215
216
217
218
# File 'lib/railroad_diagrams/builder.rb', line 215

def self.diagram(**options, &block)
  coerce = options.delete(:coerce)
  Diagram.new(build(coerce: coerce, &block), **options)
end

.escape_attr(val) ⇒ String

Examples:

RailroadDiagrams.escape_attr('A&B') #=> "A&B"

Parameters:

  • val (String, Numeric)

Returns:

  • (String)


33
34
35
36
37
# File 'lib/railroad_diagrams.rb', line 33

def self.escape_attr(val)
  return val.gsub('&', '&amp;').gsub('<', '&lt;').gsub('>', '&gt;').gsub("'", '&apos;').gsub('"', '&quot;') if val.is_a?(String)

  format_number(val)
end

.escape_html(val) ⇒ String

Examples:

RailroadDiagrams.escape_html('<term>') #=> "&lt;term&gt;"

Parameters:

  • val (String)

Returns:

  • (String)


43
44
45
# File 'lib/railroad_diagrams.rb', line 43

def self.escape_html(val)
  escape_attr(val)
end

.format_number(val) ⇒ String

指数表記を使わず、Integer はそのまま、Float は小数6桁で丸めて末尾の0を除く

Examples:

RailroadDiagrams.format_number(2.0) #=> "2"

Parameters:

  • val (Numeric)

Returns:

  • (String)


52
53
54
55
56
57
58
59
# File 'lib/railroad_diagrams.rb', line 52

def self.format_number(val)
  return val.to_s if val.is_a?(Integer) || !val.finite?

  rounded = val.round(6)
  return rounded.to_i.to_s if rounded == rounded.to_i

  Kernel.format('%.6f', rounded).sub(/0+\z/, '')
end