Class: Markbridge::Parsers::BBCode::HandlerRegistry
- Inherits:
-
Object
- Object
- Markbridge::Parsers::BBCode::HandlerRegistry
- Includes:
- Enumerable
- Defined in:
- lib/markbridge/parsers/bbcode/handler_registry.rb
Overview
Registry of BBCode tag handlers
Instance Attribute Summary collapse
-
#closing_strategy ⇒ Object
writeonly
Sets the attribute closing_strategy.
Class Method Summary collapse
-
.build_from_default {|HandlerRegistry| ... } ⇒ HandlerRegistry
Build a registry from the default configuration with optional customization.
-
.default(closing_strategy: nil) ⇒ HandlerRegistry
Create the default handler registry with common BBCode tags.
-
.default_closing_strategy(registry) ⇒ ClosingStrategies::Reordering
Create the default closing strategy for a registry.
Instance Method Summary collapse
-
#[](tag_name) ⇒ BaseHandler?
Get handler for a tag name.
-
#auto_closeable?(element_class) ⇒ Boolean
Check if an element class is auto-closeable.
-
#close_element(token:, context:, tokens: nil) ⇒ Object
Close an element using the closing strategy.
-
#each {|tag_name, handler| ... } ⇒ Enumerator
Iterate over registered (tag_name, handler) pairs.
-
#handler_for_element(element) ⇒ BaseHandler?
Get handler for an element instance.
-
#initialize(closing_strategy: nil) ⇒ HandlerRegistry
constructor
A new instance of HandlerRegistry.
-
#register(tag_names, handler) ⇒ Object
Register a handler for one or more tag names and associate it with an element class.
Constructor Details
#initialize(closing_strategy: nil) ⇒ HandlerRegistry
Returns a new instance of HandlerRegistry.
12 13 14 15 16 17 |
# File 'lib/markbridge/parsers/bbcode/handler_registry.rb', line 12 def initialize(closing_strategy: nil) @handlers = {} @element_handlers = {} @auto_closeable_elements = Set.new @closing_strategy = closing_strategy end |
Instance Attribute Details
#closing_strategy=(value) ⇒ Object (writeonly)
Sets the attribute closing_strategy
10 11 12 |
# File 'lib/markbridge/parsers/bbcode/handler_registry.rb', line 10 def closing_strategy=(value) @closing_strategy = value end |
Class Method Details
.build_from_default {|HandlerRegistry| ... } ⇒ HandlerRegistry
Build a registry from the default configuration with optional customization
159 160 161 162 163 |
# File 'lib/markbridge/parsers/bbcode/handler_registry.rb', line 159 def self.build_from_default registry = default yield(registry) if block_given? registry end |
.default(closing_strategy: nil) ⇒ HandlerRegistry
Create the default handler registry with common BBCode tags.
Each call returns a fresh instance — mutations made to one will not be visible to another. If you want a process-wide singleton, use Markbridge.default_handlers instead, which memoizes.
77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 |
# File 'lib/markbridge/parsers/bbcode/handler_registry.rb', line 77 def self.default(closing_strategy: nil) # Create registry - we'll set closing strategy after registering handlers registry = new # Simple formatting handlers (auto-closeable) registry.register( %w[b bold strong], Handlers::SimpleHandler.new(AST::Bold, auto_closeable: true), ) registry.register( %w[i italic em], Handlers::SimpleHandler.new(AST::Italic, auto_closeable: true), ) registry.register( %w[s strike del], Handlers::SimpleHandler.new(AST::Strikethrough, auto_closeable: true), ) registry.register( %w[u underline], Handlers::SimpleHandler.new(AST::Underline, auto_closeable: true), ) registry.register( "sup", Handlers::SimpleHandler.new(AST::Superscript, auto_closeable: true), ) registry.register( "sub", Handlers::SimpleHandler.new(AST::Subscript, auto_closeable: true), ) # Code handlers (raw content) registry.register(%w[code pre tt], Handlers::CodeHandler.new) # Image handler registry.register("img", Handlers::ImageHandler.new) # Attachment handler registry.register(%w[attach attachment], Handlers::AttachmentHandler.new) # URL handler registry.register(%w[url link iurl], Handlers::UrlHandler.new) # Email handler registry.register("email", Handlers::EmailHandler.new) # Quote handler registry.register("quote", Handlers::QuoteHandler.new) # Spoiler handler registry.register(%w[spoiler hide], Handlers::SpoilerHandler.new) # Color handler registry.register("color", Handlers::ColorHandler.new) # Size handler registry.register("size", Handlers::SizeHandler.new) # Alignment handlers (single instance - reads alignment from tag name) registry.register(%w[center left right justify], Handlers::AlignHandler.new) # Self-closing handlers registry.register("br", Handlers::SelfClosingHandler.new(AST::LineBreak)) registry.register("hr", Handlers::SelfClosingHandler.new(AST::HorizontalRule)) # List handlers registry.register(%w[list ul ol ulist olist], Handlers::ListHandler.new) registry.register(%w[* li .], Handlers::ListItemHandler.new) # Table handlers registry.register("table", Handlers::TableHandler.new) registry.register("tr", Handlers::TableRowHandler.new) registry.register(%w[td th], Handlers::TableCellHandler.new) # Set the closing strategy registry.closing_strategy = closing_strategy || default_closing_strategy(registry) registry end |
.default_closing_strategy(registry) ⇒ ClosingStrategies::Reordering
Create the default closing strategy for a registry
168 169 170 171 |
# File 'lib/markbridge/parsers/bbcode/handler_registry.rb', line 168 def self.default_closing_strategy(registry) reconciler = ClosingStrategies::TagReconciler.new(registry:) ClosingStrategies::Reordering.new(reconciler) end |
Instance Method Details
#[](tag_name) ⇒ BaseHandler?
Get handler for a tag name
43 44 45 |
# File 'lib/markbridge/parsers/bbcode/handler_registry.rb', line 43 def [](tag_name) @handlers[tag_name.to_s.downcase] end |
#auto_closeable?(element_class) ⇒ Boolean
Check if an element class is auto-closeable
57 58 59 |
# File 'lib/markbridge/parsers/bbcode/handler_registry.rb', line 57 def auto_closeable?(element_class) @auto_closeable_elements.include?(element_class) end |
#close_element(token:, context:, tokens: nil) ⇒ Object
Close an element using the closing strategy
65 66 67 |
# File 'lib/markbridge/parsers/bbcode/handler_registry.rb', line 65 def close_element(token:, context:, tokens: nil) @closing_strategy&.handle_close(token:, context:, registry: self, tokens:) end |
#each {|tag_name, handler| ... } ⇒ Enumerator
Iterate over registered (tag_name, handler) pairs. Useful for debugging custom registries — e.g. confirming an override has stuck. Iteration order matches registration order.
25 26 27 |
# File 'lib/markbridge/parsers/bbcode/handler_registry.rb', line 25 def each(&block) @handlers.each(&block) end |
#handler_for_element(element) ⇒ BaseHandler?
Get handler for an element instance
50 51 52 |
# File 'lib/markbridge/parsers/bbcode/handler_registry.rb', line 50 def handler_for_element(element) @element_handlers[element.class] end |
#register(tag_names, handler) ⇒ Object
Register a handler for one or more tag names and associate it with an element class
32 33 34 35 36 37 38 |
# File 'lib/markbridge/parsers/bbcode/handler_registry.rb', line 32 def register(tag_names, handler) element_class = handler.element_class Array(tag_names).each { |tag_name| @handlers[tag_name.to_s.downcase] = handler } @element_handlers[element_class] = handler @auto_closeable_elements << element_class if handler.auto_closeable? self end |