Class: Markbridge::Parsers::BBCode::HandlerRegistry
- Inherits:
-
Object
- Object
- Markbridge::Parsers::BBCode::HandlerRegistry
- 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.
-
#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.
10 11 12 13 14 15 16 |
# File 'lib/markbridge/parsers/bbcode/handler_registry.rb', line 10 def initialize(closing_strategy: nil) @handlers = {} @normalized_tag_cache = {} @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
8 9 10 |
# File 'lib/markbridge/parsers/bbcode/handler_registry.rb', line 8 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
149 150 151 152 153 |
# File 'lib/markbridge/parsers/bbcode/handler_registry.rb', line 149 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
67 68 69 70 71 72 73 74 75 76 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 |
# File 'lib/markbridge/parsers/bbcode/handler_registry.rb', line 67 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::RawHandler.new(AST::Code)) # 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
158 159 160 161 |
# File 'lib/markbridge/parsers/bbcode/handler_registry.rb', line 158 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
36 37 38 39 40 |
# File 'lib/markbridge/parsers/bbcode/handler_registry.rb', line 36 def [](tag_name) tag_str = tag_name.to_s normalized = @normalized_tag_cache[tag_str] || tag_str.downcase @handlers[normalized] end |
#auto_closeable?(element_class) ⇒ Boolean
Check if an element class is auto-closeable
52 53 54 |
# File 'lib/markbridge/parsers/bbcode/handler_registry.rb', line 52 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
60 61 62 |
# File 'lib/markbridge/parsers/bbcode/handler_registry.rb', line 60 def close_element(token:, context:, tokens: nil) @closing_strategy&.handle_close(token:, context:, registry: self, tokens:) end |
#handler_for_element(element) ⇒ BaseHandler?
Get handler for an element instance
45 46 47 |
# File 'lib/markbridge/parsers/bbcode/handler_registry.rb', line 45 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
21 22 23 24 25 26 27 28 29 30 31 |
# File 'lib/markbridge/parsers/bbcode/handler_registry.rb', line 21 def register(tag_names, handler) element_class = handler.element_class Array(tag_names).each do |tag_name| normalized = tag_name.to_s.downcase @handlers[normalized] = handler @normalized_tag_cache[tag_name.to_s] = normalized end @element_handlers[element_class] = handler @auto_closeable_elements << element_class if handler.auto_closeable? self end |