asciidoctor-p2e 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 0dff1d42b161edc86e587b3a7bd4f0dca6c994cf7ed46af097d42fafac99b63d
4
+ data.tar.gz: 7e810b224f6ceffde91e25fe6b5c9385a10dc03d36b6733834c778c37977d5dd
5
+ SHA512:
6
+ metadata.gz: 1b32aeead43be454ce70b9d4b503a90b16358527fef12475715d68526b334ecbe634cb70359ff93b55af7f88010f0f010150b0d26529ef6730d002ae7f971fdf
7
+ data.tar.gz: c575133c2f2bcb8051461aa79d6fe48f59e83ae1e06f57aa6eb533cdeab3e0a7fe82980a0b82c126165aec7c1c932c30f293df64f7800d74a994c803a64c9a74
data/README.adoc ADDED
@@ -0,0 +1,125 @@
1
+ = asciidoctor-p2e
2
+
3
+ You can find the git repo for this project on SourceHut:
4
+ https://git.sr.ht/~bosco/asciidoctor-p2e.
5
+
6
+ This https://docs.asciidoctor.org/asciidoctor/latest/extensions/[extension] for
7
+ https://asciidoctor.org/[Asciidoctor] is designed to make it easier to create
8
+ content to work with the https://paizo.com/pathfinder[Pathfinder Second Edition
9
+ roleplaying system]. Currently it only supports NPC/Creature stat blocks.
10
+
11
+ == Usage
12
+
13
+ Once the `asciidoctor-p2e` gem is installed you can run
14
+ `asciidoctor -r asciidoctor-p2e <input>` to create your output.
15
+
16
+ == Stat Blocks
17
+
18
+ A new block of type `stat` can be used to create a stat block from
19
+ https://toml.io/en/[TOML input]. For example the following TOML:
20
+
21
+ [source, asciidoc]
22
+ ----
23
+ [stat]
24
+ --
25
+ name = "Dragon Cultist"
26
+ level = "1"
27
+ tags = ["ne","medium","humaniod"]
28
+ perception = "+4"
29
+ senses = "low-light vision"
30
+ skills = ["Athletics +6","Intimidation +2","Survival +4"]
31
+
32
+ [attributes]
33
+ cha = "-1"
34
+ con = "+2"
35
+ dex = "+1"
36
+ int = "-2"
37
+ str = "+3"
38
+ wis = "+1"
39
+
40
+ [defense]
41
+ ac = "16"
42
+ fort = "+7"
43
+ ref = "+6"
44
+ will = "+4"
45
+ hp = "20"
46
+ immunities = ""
47
+ reactions = ["Attack of Opportunity"]
48
+
49
+ [offense]
50
+ speed = "25"
51
+ otherSpeeds = ""
52
+
53
+ [[offense.attacks]]
54
+ actions = 1
55
+ damage = "1d10+3 slashing"
56
+ name = "Melee"
57
+ text = "claws +8"
58
+
59
+ [[offense.attacks]]
60
+ actions = 2
61
+ name = "Special"
62
+ text = """\
63
+ (fire) The dragon cultist breathes flames in a 15-foot cone that deals 2d6 \
64
+ fire damage to each creature within the area (DC 14 basic Reflex save). \
65
+ The dragon cultist can't use Breath Weapon again for 1d4 rounds.\
66
+ """
67
+ --
68
+ ----
69
+
70
+ Will create the following output:
71
+
72
+ [stat]
73
+ --
74
+ name = "Dragon Cultist"
75
+ level = "1"
76
+ tags = ["ne","medium","humaniod"]
77
+ perception = "+4"
78
+ senses = "low-light vision"
79
+ skills = ["Athletics +6","Intimidation +2","Survival +4"]
80
+
81
+ [attributes]
82
+ cha = "-1"
83
+ con = "+2"
84
+ dex = "+1"
85
+ int = "-2"
86
+ str = "+3"
87
+ wis = "+1"
88
+
89
+ [defense]
90
+ ac = "16"
91
+ fort = "+7"
92
+ ref = "+6"
93
+ will = "+4"
94
+ hp = "20"
95
+ immunities = ""
96
+ reactions = ["Attack of Opportunity"]
97
+
98
+ [offense]
99
+ speed = "25"
100
+ otherSpeeds = ""
101
+
102
+ [[offense.attacks]]
103
+ actions = 1
104
+ damage = "1d10+3 slashing"
105
+ name = "Melee"
106
+ text = "claws +8"
107
+
108
+ [[offense.attacks]]
109
+ actions = 2
110
+ name = "Special"
111
+ text = """\
112
+ (fire) The dragon cultist breathes flames in a 15-foot cone that deals 2d6 \
113
+ fire damage to each creature within the area (DC 14 basic Reflex save). \
114
+ The dragon cultist can't use Breath Weapon again for 1d4 rounds.\
115
+ """
116
+ --
117
+
118
+ == Credits
119
+
120
+ * The layout, much of the styling, and the demonstration creature come from the
121
+ https://slanguage.github.io/pf2monster/[Pathfinder 2E Monster Creator]
122
+ * Action and reaction CSS icons come from
123
+ https://www.reddit.com/r/WorldAnvil/comments/kdzog2/css_for_pathfinder_2nd_edition/[CSS for Pathfinder 2nd Edition]
124
+ * https://github.com/asciidoctor/asciidoctor-extensions-lab[Asciidoctor Extensions Lab]
125
+ was used as a reference in creating this extension.
@@ -0,0 +1,6 @@
1
+ RUBY_ENGINE == 'opal' ? (require 'asciidoctor-p2e/extension') : (require_relative 'asciidoctor-p2e/extension')
2
+
3
+ Extensions.register do
4
+ docinfo_processor P2EDocinfoProcessor
5
+ block P2EStatblockProcessor
6
+ end
@@ -0,0 +1,40 @@
1
+ #Source: https://github.com/asciidoctor/asciidoctor-extensions-lab/blob/master/lib/emoji-inline-macro/extension.rb
2
+ #
3
+ require 'asciidoctor/extensions' unless RUBY_ENGINE == 'opal'
4
+ require 'erb'
5
+ require 'tomlrb'
6
+
7
+ include Asciidoctor
8
+
9
+ class P2EDocinfoProcessor < Extensions::DocinfoProcessor
10
+ use_dsl
11
+
12
+ def process doc
13
+ extdir = ::File.join(::File.dirname __FILE__)
14
+ stylesheet_name = 'p2e.css'
15
+ content = doc.read_asset %(#{extdir}/#{stylesheet_name})
16
+ ['<style>', content.chomp, '</style>'] * "\n"
17
+ end
18
+ end
19
+
20
+ class P2EStatblockProcessor < Extensions::BlockProcessor
21
+ use_dsl
22
+
23
+ named :stat
24
+ on_context :open
25
+ parse_content_as :raw
26
+
27
+ def process parent, reader, attrs
28
+ # parse TOML
29
+ lines = reader.lines
30
+ creature = Tomlrb.parse(lines * "\n")
31
+
32
+ # create HTML from template
33
+ extdir = ::File.join(::File.dirname __FILE__)
34
+ template_name = 'statblock.html.erb'
35
+ template = File.read("#{extdir}/#{template_name}")
36
+ html = ERB.new(template).result_with_hash(creature)
37
+ create_pass_block parent, html, attrs, subs: nil
38
+ end
39
+ end
40
+
@@ -0,0 +1,128 @@
1
+ .statblock {
2
+ width: 500px;
3
+ border: 1px solid black;
4
+ margin: 20px;
5
+ padding: 20px;
6
+ font-family: "Roboto", Geneva, sans-serif;
7
+ font-size: 16px;
8
+ line-height: 24px;
9
+ }
10
+ .statblock-title {
11
+ font-size: 23px;
12
+ font-weight: bold;
13
+ width: 100%;
14
+ text-transform: uppercase;
15
+ }
16
+ .statblock-name {
17
+ float: left;
18
+ }
19
+ .statblock-creature {
20
+ float: right;
21
+ text-align: right;
22
+ }
23
+ .statblock-tags {
24
+ height: 26px;
25
+ /*background-color: BurlyWood;*/
26
+ width: fit-content;
27
+ }
28
+ .statblock-info-block {
29
+ clear: both;
30
+ border-top: 2px solid black;
31
+ padding-top: 5px;
32
+ }
33
+ .statblock-tag-alignment,.statblock-tag-size,.statblock-tag-other,.statblock-tag-rarity-uncommon,.statblock-tag-rarity-rare,.statblock-tag-rarity-unique {
34
+ float: left;
35
+ height: 22px;
36
+ margin: 2px;
37
+ line-height: 22px;
38
+ font-family: Geneva, sans-serif;
39
+ font-size: 14px;
40
+ font-weight: bold;
41
+ color: white;
42
+ text-transform: uppercase;
43
+ }
44
+ .statblock-tag-rarity-uncommon,.statblock-tag-rarity-rare,.statblock-tag-rarity-unique {
45
+ padding-left: 5px;
46
+ padding-right: 5px;
47
+ }
48
+ .statblock-tag-rarity-uncommon {
49
+ background-color: Sienna;
50
+ }
51
+ .statblock-tag-rarity-rare {
52
+ background-color: DarkBlue;
53
+ }
54
+ .statblock-tag-rarity-unique {
55
+ background-color: Indigo;
56
+ }
57
+ .statblock-tag-alignment {
58
+ background-color: SteelBlue;
59
+ padding-left: 5px;
60
+ padding-right: 5px;
61
+ }
62
+ .statblock-tag-size {
63
+ background-color: SeaGreen;
64
+ padding-left: 10px;
65
+ padding-right: 10px;
66
+ }
67
+ .statblock-tag-other {
68
+ background-color: DarkRed;
69
+ padding-left: 20px;
70
+ padding-right: 20px;
71
+ }
72
+ .statblock-info-other {
73
+ clear: both;
74
+ }
75
+ .statblock-info-line {
76
+ padding-left: 18px;
77
+ text-indent: -18px;
78
+ }
79
+ .statblock-line-heavy {
80
+ font-weight: bold;
81
+ }
82
+
83
+ /* Source: https://www.reddit.com/r/WorldAnvil/comments/kdzog2/css_for_pathfinder_2nd_edition/ */
84
+ .statblock-reaction {
85
+ top: 3px;
86
+ border-radius: 0px;
87
+ display: inline-block;
88
+ width: 19px;
89
+ height: 16px;
90
+ background-repeat: no-repeat;
91
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAAQCAYAAAD0xERiAAAABHNCSVQICAgIfAhkiAAAAkRJREFUOI2dlM9rE0EUx9+bnf2ZTYLJZtMmVUS0x1ykxaP05kl61LsHpSgieKoHQfBkq/4HCgXxIMUiCIJQRAWhIOJBQdAiVRSzu2l2s5ndnRkvpiwxCdZ3+877vs+892AGYSgIIWbRLp7UNXVB1/QWEjJFKbVSxnxUlJ04jrd6/fhZFEVvAEDmazEHKTjV6kXbtC4gYjOfGxGcC/HO7wQ3drvddSml2IMZhnGsXnMfUEU5xJLkdZql7xOWdBCRGKYxo1I6pyBpIaI+DGVJ8vD7zx/nOOcRqqramGk07/uBf68bho8459GoVnRdP3KgXF6yrcKSlFLN55I03fj6bWcRHcc56/v+Y855OGYkzO+mUCicmHbrT6QQlZxHBt3ueUREKqXMJuznrygViwu1SvUpAOx1KKR8qwCA2A8IAIAlyWfbtucVQmYHZ5RSl+wXNIgw7G7mtUTs/zeMUrWY13Gv9/yfYJZlHW82GqsDjYhqwTJP5yws2O3cnAijCi1PufVb0zX3RZamyYBVqzrXFKK0/ugsjHvLYRS9ouNA5VJp0alU74CUBwEA+oxtEkL0muNct03rKgAgILa9wL/kB8EawIgnYxjGrFt1bquUnsqNxWLGVgxNOwMAhwFxO4yiNc/3VtIsa+/5cgVKveZesUxzGQGKQ3eABNjwAn89zbKtOI4/CCHYsEfJiyRNv2SCv+Q8+4SIjFJaBgANAIgQgvzyvMuMsW0pJR+1mkk/AyCiZhjGUcs05zVVnUvS7GPba98d5/8Nkc/n9eZdAXIAAAAASUVORK5CYII=);
92
+ }
93
+ .statblock-free-action {
94
+ top: 3px;
95
+ border-radius: 0px;
96
+ display: inline-block;
97
+ width: 16px;
98
+ height: 16px;
99
+ background-repeat: no-repeat;
100
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAl9JREFUOI19krFPFFEQxmfmvWXfvsMDBXZvF5Nb2D1yREFKrGhM6G1sBRMTG7CwAhErbFDDHyF2oDZGchTY0plYcdYIJrdcbo89jtt7FrdnFoJM8ZI3+b7ffJkMQKcQLhYiIrcta+NOcfwLY0xP+pTWdP+XzYCIzLas917ebXt5V40Xi9spSNfDIHkwBSFE5DnTeiuFsXjWOv8YRY0SR5qzLGuyEgRbSqk40as0DZPJ3LFyG17ebd92hjcRkQMADQ0Mrnt5tz3mFy4n6cRIzNSZLBYBAJvn57u1MPwKACpqRCXGeKaH83nTtCaCk2A7SdIBICLLmdY7KcSCUqoFANSjadPCENl6vV5SSrVPo9NdznmGE81ZlnWvEnQgLDGvSyGex0od/v5zPMsZG9Y0bUzjfFoX4kYYhjsAoBJIbwK5WwmCT8yx7Q2piwXGGBweHz2Iomj/NIo+92YyDxnRkMb5tDCEDMOwlEBKwhCjpOCRbTuThIABIkIcx9if7VtCRL0/2/eMc+Yn64kbjbMf3V1JQ05IXcwSUfus2dxHACAnZ69IIV4rpaAVxz8ZURERGQA0K9XqfHASfEjMU7Zp7hDRIDB6eVAurzEAoFoY7hmGBI3zGUI0EZEAoFWpVh8HJ8FmyvwtMb86KJfX0ncAAABOzl713RHluyNq4NbAk1TsKS/vHhVGvXbB85cu38E/QC0MvwvDUBrnM6AUhfX6lpRyMhV75eBX+c2Vh5SC7AlDohTiqZTy/s1s3wsiGkTGLsT+L6ADqe0Jw1CGrs8houwu7CrttTVsO6sF31++TvMXOj7bsM8roOMAAAAASUVORK5CYII=)
101
+ }
102
+ .statblock-one-action {
103
+ top: 3px;
104
+ border-radius: 0px;
105
+ display: inline-block;
106
+ width : 15px;
107
+ height: 16px;
108
+ background-repeat: no-repeat;
109
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAQCAYAAADJViUEAAAABHNCSVQICAgIfAhkiAAAAdNJREFUKJGNUz1vE0EQnd3Z27vbu5hgGzuXQ8EoKRAUiI8mQqKgQOmQKKjoEB0NDQ2BlgqJFkWiiGgSFEQqKBBCQuJv4Arh+GKUs3fXDnceihAUX86IV76ZNx+aeQBTIISozTWarxBxdlpOKRCxshCf/rp4pkXxXPSZcx6W5hUJzrmKo2hbCuf6nwlanude1tpsEVA2VcwYE3E0/8Z1nJWjvCPEkivleW3MOwDI/zY6mkRE4zzP2gBAxYmU799u1OtrjDFR7Mzr1dpqluftvTTdVMpfECguFQtIR14UwmloY94DACEAsHq19uzEzMxqGKgVbe3WXppuKBWcE4gXigVcKa8IgYGx9iPWTlafzlYqjwGAccZPBb66MTBmI+33N8MwvIqcLxX0zJXuMuecOABN7Mc59xhjEuj43kWgHQ6/IKLvue61MdG3750fN39lWSeO5l9LIW6VaCgd9J8nvd4TBAAw1n4SAtnuz96j0f5+O46iNU/Ku2Xd+lq/7O4mDwGAWCHGo2bzhfL8BwBQjMHA6PWdJLlHdPAsE3dmjCGiaJUJjbVvd5Lk/qEQ4Ph7jgdabweBWkaOZw9JOxp+6HS7d4hoVLbKBP7XGFNxYMnGPy35G5THnjF7a0U6AAAAAElFTkSuQmCC)
110
+ }
111
+ .statblock-two-actions {
112
+ top: 3px;
113
+ border-radius: 0px;
114
+ display: inline-block;
115
+ width: 24px;
116
+ height: 16px;
117
+ background-repeat: no-repeat;
118
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAQCAYAAAAMJL+VAAAABHNCSVQICAgIfAhkiAAAAuFJREFUOI2NlEtoU0EUhs+dmTv3nebdeJu21qoVBKlSK4qKIIJQxTcUXSjiRlBw48rHzr1LxS5atBSlVfEJakVduBNEEFy40tomaROT2/tM6h0XWrlNbzD/bs588//nnMUANBDGWNEzmRuEkEwjJiCuCWaJudyRzT7t7lzJOrPtHwnGyUZsMpE4o7dmRjiOI6Fe9QWEEM2u0O/yhOz7e84osrLbtK17jDE3yMZj8eOxSMsQIWSjQIUO07Ie/S8AZfW2UUrIIQiMjRHSZUneaVrWOGPMAwCIRaNHE9HobcYYDwDA83yvQGnatK3nAMAaTiCJwg7K036o2yvGuF2WpC2mbU0wxhayuj7GfKYHGcrzm3meKJZtv6oPQKlk8jJjrFCuVO4IAs1Snt9UH04w7pIlqc+0rXHTNO9HItp+AEgEGYHSbYRgajvO5GIAl0okrkVU7YqmqAccz31UMYxRKgidlPC9ISHdkihuKBvGsO04DyOqdhAAoktDhO0YY992nHc4GU9cbdG0SwCAAKBFU5QB23XGDcMYEwVxHU/I+mUhhPSIgthTNoxhx3WfqKp6lAPQAggnCsIuhJCBKKVa/b6bEAPuzxtKaTdCKBbCuJ7nfcamZU2KohTnCelnAN+nC/k9Vc+bak2nb8mSdCLM3fW8JzP5/KCmqtvTieQDxphch3iF4tygaVnPMAAw07JeCKIozJWKF13X/ZpJp28qknw6zNyrVV/O5PJHVEXpa02mHjPGtDqkOlsqnpw3zQmA5atBranUdVVWzoXcgVervp7O5Q74vm+tWdX9xf/1a+3SvbGFYunnqcq8MfrPsN5EkqTVYZ1Xa7X307ncId/3TQBgP3IzxziOmw0gfqlcPhs0Dwvwv01NHfYZexMs1hYWPkzncwO+7xuLNdu2P83MFvZyiCsBgF+qlC+UK5WhsOaWCWOsdXV0vm3ms1NVdWs8FjvflHFQhJCWrN420uR33VC/Aa8NFknPxGqgAAAAAElFTkSuQmCC)
119
+ }
120
+ .statblock-three-actions {
121
+ top: 3px;
122
+ border-radius: 0px;
123
+ display: inline-block;
124
+ width: 32px;
125
+ height: 16px;
126
+ background-repeat: no-repeat;
127
+ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAQCAYAAAB3AH1ZAAAABHNCSVQICAgIfAhkiAAAA8BJREFUSImdlUlsHEUUht/rWrp6lp7unnHPjJ2MgxNWgyKWA6AEC5BsQUBRpCAOKBcIAoGPIG7ABS4sEgpwgguXnBIPxgbFCOUQcQBFiVgiDnC3PYsjHHdVLzNdXGxr0p6QOP/x1d/1Vb3X7xXADYSI1HPcDznjB27kGbTfgmdXIhXPOzXRGE8bY2N/M8YmbmRkjO2tV2sLlNK9twMyhsXKrvuRXSi+iYjIKDtQH/EXGWONrJFSWqv71XM5IY7U/eoPhJD6MAgiskK+8NIwHskGPMf9wLHttxBxO62EkIolrGml1Hyapuub8OqoX/2RMTa56fFzljUdSHlGax0MwkfK5a/cUuk9NIycCsOf/jcD/X7/H611ko1zxiZrI/4ipbQKAFAsFF5kjN1/vYc/UPer3xNCKlv8ilf+spgvnEBEwynab7uO8z4M/DPbGSgV7dcBQQVSLmnQbWGaM4h4XYYIIVVLiCelUk2p5HnKqGNy/uighxIyKkwxFUh5Vmsd5S3rOc75Q7gpYZqHAbAfRuGF7QOUbHu27LmfFXL5YzJUC1LKJQC4KoSYRkRjJ8A8LJVqbgTBt4wz32T8kcFbUUr3WEIcCqQ8I5VqUkoanPGDA4eY0hrCMIp+JnaxeLLieacQkBqIdj6Xe14p9V2g5DkEDCwhZrLloJTuEab5uFTqbBAETcbYHZzxgxlPQ5jmY0EQnJZKzXPO7uGMTwIAIKJhCfFUmqZdA3b2MAcAsVXDLBwAQGutt5YMwygwxu4cZot7yZVU65AQUuaU3Z3Z41oUJ5dJFMeXUq2vWpaYTvtpZ7m1OhMnyZ+OXZp1HefjbAm01jqK419W2q2jWut4tFpbMDk/lIWvb1z7uttdm6WEVmq+v2hy/uDWYpqm6yvt1rEwCi9QAIB/19c/B4B+GEa/xnH8e8m2X3NLpU8NRJqFx0lyabXTPqq1VnW/2jQ5fyLr2ZDBN521tTcAQdf8kTmT84e34TrdWOm0j6swPA8w0AVRFF3s9/vLpaL9suc4XxiGwbM5TZLkj5V265ler9dyHeedYj5/MnvzQMrT7W73lc1W1ohG3xLiCCISrbVabbePK6WWtj7YMYjyudwLlhBTg4MIACBOkisr7dazvV5vGQAgjKKLpmnexyi7dwA+1+p2TgzOkSiOftMaVi0hnm51O68GUs5lmVkZZdf7ZKIxnu4f36cnGuNpY3Tsr2GjGBH5aK02v398X1ob8ZuIKIZtCADAOb/rZuBB3fJjZBiG5bnuu4iY2w3gptrlc3zb+g/DZ3c9xGiesQAAAABJRU5ErkJggg==)
128
+ }
@@ -0,0 +1,87 @@
1
+ <div class="statblock">
2
+ <div class="statblock-title">
3
+ <span class="statblock-name"><%= name %></span>
4
+ <span class="statblock-creature"> CREATURE <%= level %></span>
5
+ </div>
6
+ <div class="statblock-info-block">
7
+ <div class="statblock-tags">
8
+ <% tags.each do |tag| %>
9
+ <% if tag == "lg" or tag == "ng" or tag == "cg" or tag == "ln" or tag == "n" or tag == "cn" or tag == "le" or tag == "ne" or tag == "ce" %>
10
+ <div class="statblock-tag-alignment"><%= tag %></div>
11
+ <% elsif tag == "tiny" or tag == "small" or tag == "medium" or tag == "large" or tag == "huge" or tag == "gargantuan" %>
12
+ <div class="statblock-tag-size"><%= tag %></div>
13
+ <% elsif tag == "uncommon" %>
14
+ <div class="statblock-tag-rarity-uncommon"><%= tag %></div>
15
+ <% elsif tag == "rare" %>
16
+ <div class="statblock-tag-rarity-rare"><%= tag %></div>
17
+ <% elsif tag == "unique" %>
18
+ <div class="statblock-tag-rarity-unique"><%= tag %></div>
19
+ <% else %>
20
+ <div class="statblock-tag-other"><%= tag %></div>
21
+ <% end %>
22
+ <% end %>
23
+ </div>
24
+ <div class="statblock-info-other">
25
+ <div class="statblock-info-line">
26
+ <span class="statblock-line-heavy">Perception </span><%= perception %> <%= senses %>
27
+ </div>
28
+
29
+ <div class="statblock-info-line">
30
+ <span class="statblock-line-heavy">Skills </span><% skills * "," %>
31
+ </div>
32
+
33
+ <div class="statblock-info-line">
34
+ <span class="statblock-line-heavy">Str </span><%= attributes['str'] %>,
35
+ <span class="statblock-line-heavy">Dex </span><%= attributes['dex'] %>,
36
+ <span class="statblock-line-heavy">Con </span><%= attributes['con'] %>,
37
+ <span class="statblock-line-heavy">Int </span><%= attributes['int'] %>,
38
+ <span class="statblock-line-heavy">Wis </span><%= attributes['wis'] %>,
39
+ <span class="statblock-line-heavy">Cha </span><%= attributes['cha'] %>
40
+ </div>
41
+ </div>
42
+ </div> <!-- statistics -->
43
+ <div class="statblock-info-block">
44
+ <div class="statblock-info-line">
45
+ <span class="statblock-line-heavy">AC </span><%= defense['ac'] %>;
46
+ <span class="statblock-line-heavy">Fort </span><%= defense['fort'] %>,
47
+ <span class="statblock-line-heavy">Ref </span><%= defense['ref'] %>,
48
+ <span class="statblock-line-heavy">Will </span><%= defense['will'] %>
49
+ </div>
50
+
51
+ <div class="statblock-info-line">
52
+ <span class="statblock-line-heavy">HP </span><%= defense['hp'] %><%= defense['immunities'] %>
53
+ </div>
54
+
55
+ <% defense['reactions'].each do |reaction| %>
56
+ <div class="statblock-info-line">
57
+ <span class="statblock-line-heavy"><%= reaction %></span>
58
+ <span class="statblock-reaction"></span>
59
+ </div>
60
+ <% end %>
61
+
62
+ </div>
63
+ <div class="statblock-info-block">
64
+ <div class="statblock-info-line">
65
+ <span class="statblock-line-heavy">Speed </span><%= offense['speed'] %><%= offense['otherSpeeds'] %>
66
+ </div>
67
+
68
+ <% offense['attacks'].each do |attack| %>
69
+ <div class="statblock-info-line">
70
+ <span class="statblock-line-heavy"><%= attack[:name] %></span>
71
+ <% if attack['actions'] == 0 %>
72
+ <span class="statblock-free-action"></span>
73
+ <% elsif attack['actions'] == 1 %>
74
+ <span class="statblock-one-action"></span>
75
+ <% elsif attack['actions'] == 2 %>
76
+ <span class="statblock-two-actions"></span>
77
+ <% elsif attack['actions'] == 3 %>
78
+ <span class="statblock-three-actions"></span>
79
+ <% end %>
80
+ <%= attack['text'] %>
81
+ <% if attack.key?('damage') %>
82
+ <span class="statblock-line-heavy">Damage</span> <%= attack['damage'] %>
83
+ <% end %>
84
+ </div>
85
+ <% end %>
86
+ </div>
87
+ </div>
metadata ADDED
@@ -0,0 +1,64 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: asciidoctor-p2e
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Ryan Tolboom
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2021-02-19 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: tomlrb
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ description: Asciidoctor Pathfinder 2E Extension
28
+ email:
29
+ - ryan@using.tech
30
+ executables: []
31
+ extensions: []
32
+ extra_rdoc_files: []
33
+ files:
34
+ - README.adoc
35
+ - lib/asciidoctor-p2e.rb
36
+ - lib/asciidoctor-p2e/extension.rb
37
+ - lib/asciidoctor-p2e/p2e.css
38
+ - lib/asciidoctor-p2e/statblock.html.erb
39
+ homepage: https://sr.ht/bosco/asciidoctor-p2e
40
+ licenses:
41
+ - GPL-3.0
42
+ metadata: {}
43
+ post_install_message:
44
+ rdoc_options: []
45
+ require_paths:
46
+ - lib
47
+ required_ruby_version: !ruby/object:Gem::Requirement
48
+ requirements:
49
+ - - ">="
50
+ - !ruby/object:Gem::Version
51
+ version: '0'
52
+ required_rubygems_version: !ruby/object:Gem::Requirement
53
+ requirements:
54
+ - - ">="
55
+ - !ruby/object:Gem::Version
56
+ version: '0'
57
+ requirements: []
58
+ rubyforge_project:
59
+ rubygems_version: 2.7.6
60
+ signing_key:
61
+ specification_version: 4
62
+ summary: An Asciidoctor extension for creating content for the Pathfinder 2E roleplaying
63
+ system.
64
+ test_files: []