bbortcodes 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/CHANGELOG.md +38 -0
- data/LICENSE.txt +21 -0
- data/README.md +648 -0
- data/lib/bbortcodes/config.rb +42 -0
- data/lib/bbortcodes/context.rb +84 -0
- data/lib/bbortcodes/errors.rb +9 -0
- data/lib/bbortcodes/grammar.rb +81 -0
- data/lib/bbortcodes/parser.rb +224 -0
- data/lib/bbortcodes/registry.rb +95 -0
- data/lib/bbortcodes/shortcode.rb +166 -0
- data/lib/bbortcodes/transform.rb +101 -0
- data/lib/bbortcodes/version.rb +5 -0
- data/lib/bbortcodes.rb +57 -0
- metadata +158 -0
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "parslet"
|
|
4
|
+
|
|
5
|
+
module BBortcodes
|
|
6
|
+
class Transform < Parslet::Transform
|
|
7
|
+
# Transform plain text nodes
|
|
8
|
+
rule(text: simple(:text)) { {type: :text, value: text.to_s} }
|
|
9
|
+
|
|
10
|
+
# Transform attribute
|
|
11
|
+
rule(name: simple(:name), value: {string: simple(:value)}) do
|
|
12
|
+
{name.to_s => value.to_s}
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
# Transform self-closing shortcode
|
|
16
|
+
rule(name: simple(:name), attributes: subtree(:attrs)) do
|
|
17
|
+
attributes = Array(attrs).reduce({}, :merge)
|
|
18
|
+
{
|
|
19
|
+
type: :shortcode,
|
|
20
|
+
name: name.to_s,
|
|
21
|
+
attributes: attributes,
|
|
22
|
+
content: nil,
|
|
23
|
+
self_closing: true
|
|
24
|
+
}
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# Transform self-closing shortcode without attributes
|
|
28
|
+
rule(name: simple(:name)) do
|
|
29
|
+
{
|
|
30
|
+
type: :shortcode,
|
|
31
|
+
name: name.to_s,
|
|
32
|
+
attributes: {},
|
|
33
|
+
content: nil,
|
|
34
|
+
self_closing: true
|
|
35
|
+
}
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# Transform paired shortcode
|
|
39
|
+
rule(
|
|
40
|
+
opening: {tag_name: simple(:name), attributes: subtree(:attrs)},
|
|
41
|
+
closing: {tag_name: simple(:close_name)},
|
|
42
|
+
content: subtree(:content)
|
|
43
|
+
) do
|
|
44
|
+
attributes = Array(attrs).reduce({}, :merge)
|
|
45
|
+
{
|
|
46
|
+
type: :shortcode,
|
|
47
|
+
name: name.to_s,
|
|
48
|
+
attributes: attributes,
|
|
49
|
+
content: Array(content),
|
|
50
|
+
self_closing: false
|
|
51
|
+
}
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
# Transform paired shortcode without attributes
|
|
55
|
+
rule(
|
|
56
|
+
opening: {tag_name: simple(:name)},
|
|
57
|
+
closing: {tag_name: simple(:close_name)},
|
|
58
|
+
content: subtree(:content)
|
|
59
|
+
) do
|
|
60
|
+
{
|
|
61
|
+
type: :shortcode,
|
|
62
|
+
name: name.to_s,
|
|
63
|
+
attributes: {},
|
|
64
|
+
content: Array(content),
|
|
65
|
+
self_closing: false
|
|
66
|
+
}
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
# Transform paired shortcode without content
|
|
70
|
+
rule(
|
|
71
|
+
opening: {tag_name: simple(:name), attributes: subtree(:attrs)},
|
|
72
|
+
closing: {tag_name: simple(:close_name)}
|
|
73
|
+
) do
|
|
74
|
+
attributes = Array(attrs).reduce({}, :merge)
|
|
75
|
+
{
|
|
76
|
+
type: :shortcode,
|
|
77
|
+
name: name.to_s,
|
|
78
|
+
attributes: attributes,
|
|
79
|
+
content: [],
|
|
80
|
+
self_closing: false
|
|
81
|
+
}
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
# Transform paired shortcode without attributes and content
|
|
85
|
+
rule(
|
|
86
|
+
opening: {tag_name: simple(:name)},
|
|
87
|
+
closing: {tag_name: simple(:close_name)}
|
|
88
|
+
) do
|
|
89
|
+
{
|
|
90
|
+
type: :shortcode,
|
|
91
|
+
name: name.to_s,
|
|
92
|
+
attributes: {},
|
|
93
|
+
content: [],
|
|
94
|
+
self_closing: false
|
|
95
|
+
}
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
# Transform document
|
|
99
|
+
rule(document: subtree(:elements)) { Array(elements) }
|
|
100
|
+
end
|
|
101
|
+
end
|
data/lib/bbortcodes.rb
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "zeitwerk"
|
|
4
|
+
|
|
5
|
+
# Load version and errors manually
|
|
6
|
+
require_relative "bbortcodes/version"
|
|
7
|
+
require_relative "bbortcodes/errors"
|
|
8
|
+
|
|
9
|
+
loader = Zeitwerk::Loader.for_gem
|
|
10
|
+
loader.inflector.inflect("bbortcodes" => "BBortcodes")
|
|
11
|
+
loader.ignore("#{__dir__}/bbortcodes/version.rb")
|
|
12
|
+
loader.ignore("#{__dir__}/bbortcodes/errors.rb")
|
|
13
|
+
loader.setup
|
|
14
|
+
|
|
15
|
+
module BBortcodes
|
|
16
|
+
class << self
|
|
17
|
+
# Global registry instance
|
|
18
|
+
def registry
|
|
19
|
+
@registry ||= Registry.new
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# Global config instance
|
|
23
|
+
def config
|
|
24
|
+
@config ||= Config.new
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# Configure the gem
|
|
28
|
+
# @yield [Config] The global config instance
|
|
29
|
+
def configure
|
|
30
|
+
yield config
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# Register a shortcode class in the global registry
|
|
34
|
+
# @param shortcode_class [Class] A class that inherits from Shortcode
|
|
35
|
+
def register(shortcode_class)
|
|
36
|
+
registry.register(shortcode_class)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# Parse text with the global registry and config
|
|
40
|
+
# @param text [String] The text to parse
|
|
41
|
+
# @param context [Context, Hash, nil] The rendering context
|
|
42
|
+
# @param only [Array<String>, nil] Only process these shortcode types
|
|
43
|
+
# @return [Array<String, Array<Shortcode>>] The processed text and array of shortcode instances
|
|
44
|
+
def parse(text, context: nil, only: nil)
|
|
45
|
+
parser = Parser.new(registry: registry, config: config)
|
|
46
|
+
parser.parse(text, context: context, only: only)
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
# Create a new parser instance
|
|
50
|
+
# @param registry [Registry, nil] Custom registry (uses global if nil)
|
|
51
|
+
# @param config [Config, nil] Custom config (uses global if nil)
|
|
52
|
+
# @return [Parser]
|
|
53
|
+
def parser(registry: nil, config: nil)
|
|
54
|
+
Parser.new(registry: registry, config: config)
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
metadata
ADDED
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: bbortcodes
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 0.1.0
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- Stefan Exner
|
|
8
|
+
autorequire:
|
|
9
|
+
bindir: exe
|
|
10
|
+
cert_chain: []
|
|
11
|
+
date: 2025-10-16 00:00:00.000000000 Z
|
|
12
|
+
dependencies:
|
|
13
|
+
- !ruby/object:Gem::Dependency
|
|
14
|
+
name: anyway_config
|
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
|
16
|
+
requirements:
|
|
17
|
+
- - "~>"
|
|
18
|
+
- !ruby/object:Gem::Version
|
|
19
|
+
version: '2.0'
|
|
20
|
+
type: :runtime
|
|
21
|
+
prerelease: false
|
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
23
|
+
requirements:
|
|
24
|
+
- - "~>"
|
|
25
|
+
- !ruby/object:Gem::Version
|
|
26
|
+
version: '2.0'
|
|
27
|
+
- !ruby/object:Gem::Dependency
|
|
28
|
+
name: literal
|
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
|
30
|
+
requirements:
|
|
31
|
+
- - "~>"
|
|
32
|
+
- !ruby/object:Gem::Version
|
|
33
|
+
version: '1.0'
|
|
34
|
+
type: :runtime
|
|
35
|
+
prerelease: false
|
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
37
|
+
requirements:
|
|
38
|
+
- - "~>"
|
|
39
|
+
- !ruby/object:Gem::Version
|
|
40
|
+
version: '1.0'
|
|
41
|
+
- !ruby/object:Gem::Dependency
|
|
42
|
+
name: parslet
|
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
|
44
|
+
requirements:
|
|
45
|
+
- - "~>"
|
|
46
|
+
- !ruby/object:Gem::Version
|
|
47
|
+
version: '2.0'
|
|
48
|
+
type: :runtime
|
|
49
|
+
prerelease: false
|
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
51
|
+
requirements:
|
|
52
|
+
- - "~>"
|
|
53
|
+
- !ruby/object:Gem::Version
|
|
54
|
+
version: '2.0'
|
|
55
|
+
- !ruby/object:Gem::Dependency
|
|
56
|
+
name: zeitwerk
|
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
|
58
|
+
requirements:
|
|
59
|
+
- - "~>"
|
|
60
|
+
- !ruby/object:Gem::Version
|
|
61
|
+
version: '2.6'
|
|
62
|
+
type: :runtime
|
|
63
|
+
prerelease: false
|
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
65
|
+
requirements:
|
|
66
|
+
- - "~>"
|
|
67
|
+
- !ruby/object:Gem::Version
|
|
68
|
+
version: '2.6'
|
|
69
|
+
- !ruby/object:Gem::Dependency
|
|
70
|
+
name: rake
|
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
|
72
|
+
requirements:
|
|
73
|
+
- - "~>"
|
|
74
|
+
- !ruby/object:Gem::Version
|
|
75
|
+
version: '13.0'
|
|
76
|
+
type: :development
|
|
77
|
+
prerelease: false
|
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
79
|
+
requirements:
|
|
80
|
+
- - "~>"
|
|
81
|
+
- !ruby/object:Gem::Version
|
|
82
|
+
version: '13.0'
|
|
83
|
+
- !ruby/object:Gem::Dependency
|
|
84
|
+
name: rspec
|
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
|
86
|
+
requirements:
|
|
87
|
+
- - "~>"
|
|
88
|
+
- !ruby/object:Gem::Version
|
|
89
|
+
version: '3.0'
|
|
90
|
+
type: :development
|
|
91
|
+
prerelease: false
|
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
93
|
+
requirements:
|
|
94
|
+
- - "~>"
|
|
95
|
+
- !ruby/object:Gem::Version
|
|
96
|
+
version: '3.0'
|
|
97
|
+
- !ruby/object:Gem::Dependency
|
|
98
|
+
name: standard
|
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
|
100
|
+
requirements:
|
|
101
|
+
- - "~>"
|
|
102
|
+
- !ruby/object:Gem::Version
|
|
103
|
+
version: '1.0'
|
|
104
|
+
type: :development
|
|
105
|
+
prerelease: false
|
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
107
|
+
requirements:
|
|
108
|
+
- - "~>"
|
|
109
|
+
- !ruby/object:Gem::Version
|
|
110
|
+
version: '1.0'
|
|
111
|
+
description: Parse and render WordPress-like shortcodes with type safety, nested support,
|
|
112
|
+
and grammar-based parsing using Parslet
|
|
113
|
+
email:
|
|
114
|
+
- stex@stex.codes
|
|
115
|
+
executables: []
|
|
116
|
+
extensions: []
|
|
117
|
+
extra_rdoc_files: []
|
|
118
|
+
files:
|
|
119
|
+
- CHANGELOG.md
|
|
120
|
+
- LICENSE.txt
|
|
121
|
+
- README.md
|
|
122
|
+
- lib/bbortcodes.rb
|
|
123
|
+
- lib/bbortcodes/config.rb
|
|
124
|
+
- lib/bbortcodes/context.rb
|
|
125
|
+
- lib/bbortcodes/errors.rb
|
|
126
|
+
- lib/bbortcodes/grammar.rb
|
|
127
|
+
- lib/bbortcodes/parser.rb
|
|
128
|
+
- lib/bbortcodes/registry.rb
|
|
129
|
+
- lib/bbortcodes/shortcode.rb
|
|
130
|
+
- lib/bbortcodes/transform.rb
|
|
131
|
+
- lib/bbortcodes/version.rb
|
|
132
|
+
homepage: https://gitlab.com/lopo-tech/bbortcodes
|
|
133
|
+
licenses:
|
|
134
|
+
- MIT
|
|
135
|
+
metadata:
|
|
136
|
+
homepage_uri: https://gitlab.com/lopo-tech/bbortcodes
|
|
137
|
+
source_code_uri: https://gitlab.com/lopo-tech/bbortcodes
|
|
138
|
+
changelog_uri: https://gitlab.com/lopo-tech/bbortcodes/blob/main/CHANGELOG.md
|
|
139
|
+
post_install_message:
|
|
140
|
+
rdoc_options: []
|
|
141
|
+
require_paths:
|
|
142
|
+
- lib
|
|
143
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
144
|
+
requirements:
|
|
145
|
+
- - ">="
|
|
146
|
+
- !ruby/object:Gem::Version
|
|
147
|
+
version: 3.1.0
|
|
148
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
149
|
+
requirements:
|
|
150
|
+
- - ">="
|
|
151
|
+
- !ruby/object:Gem::Version
|
|
152
|
+
version: '0'
|
|
153
|
+
requirements: []
|
|
154
|
+
rubygems_version: 3.5.22
|
|
155
|
+
signing_key:
|
|
156
|
+
specification_version: 4
|
|
157
|
+
summary: A WordPress-like shortcode parser with grammar-based parsing
|
|
158
|
+
test_files: []
|