Showing preview only (3,599K chars total). Download the full file or copy to clipboard to get everything.
Repository: ebullient/ttrpg-convert-cli
Branch: main
Commit: 7b9197004459
Files: 541
Total size: 3.3 MB
Directory structure:
gitextract_5u3vgqt7/
├── .editorconfig
├── .github/
│ ├── CODEOWNERS
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug_report.yaml
│ │ └── feature_request.md
│ ├── actions/
│ │ ├── data-cache/
│ │ │ └── action.yml
│ │ └── native-data-cache/
│ │ └── action.yml
│ ├── augment-release.sh
│ ├── dependabot.yml
│ ├── project.yml
│ └── workflows/
│ ├── cache.yml
│ ├── maven.yml
│ ├── pull-request.yml
│ ├── release.yml
│ ├── scorecard.yml
│ ├── test-data.yml
│ └── website.yml
├── .gitignore
├── .markdownlint.yaml
├── .mvn/
│ └── wrapper/
│ ├── .gitignore
│ └── maven-wrapper.properties
├── AGENTS.md
├── CHANGELOG.md
├── CLAUDE.md
├── CONTRIBUTING.md
├── LICENSE
├── README-WINDOWS.md
├── README.md
├── SECURITY.md
├── dco.txt
├── docs/
│ ├── README.md
│ ├── alternateRun.md
│ ├── configuration.md
│ ├── sourceMap.md
│ └── templates/
│ ├── ImageRef.md
│ ├── NamedText.md
│ ├── QuteAltNames.md
│ ├── QuteBase.md
│ ├── QuteNote.md
│ ├── README.md
│ ├── Reprinted.md
│ ├── SourceAndPage.md
│ ├── TtrpgTemplateExtension.md
│ ├── dnd5e/
│ │ ├── AbilityScores/
│ │ │ ├── AbilityScore.md
│ │ │ └── README.md
│ │ ├── AbilityScores.md
│ │ ├── AcHp.md
│ │ ├── ImmuneResist.md
│ │ ├── QuteBackground.md
│ │ ├── QuteBastion/
│ │ │ ├── Hireling.md
│ │ │ ├── README.md
│ │ │ └── Space.md
│ │ ├── QuteClass/
│ │ │ ├── HitPointDie.md
│ │ │ ├── Multiclassing.md
│ │ │ ├── README.md
│ │ │ └── StartingEquipment.md
│ │ ├── QuteClass.md
│ │ ├── QuteDeck/
│ │ │ ├── Card.md
│ │ │ └── README.md
│ │ ├── QuteDeity.md
│ │ ├── QuteFeat.md
│ │ ├── QuteHazard.md
│ │ ├── QuteItem/
│ │ │ ├── README.md
│ │ │ └── Variant.md
│ │ ├── QuteMonster/
│ │ │ ├── Initiative.md
│ │ │ ├── InitiativeMode.md
│ │ │ ├── README.md
│ │ │ ├── SavesAndSkills.md
│ │ │ ├── SavingThrow.md
│ │ │ ├── SkillModifier.md
│ │ │ ├── Spellcasting.md
│ │ │ ├── Spells.md
│ │ │ ├── TraitDescription.md
│ │ │ └── Traits.md
│ │ ├── QuteObject.md
│ │ ├── QutePsionic.md
│ │ ├── QuteRace.md
│ │ ├── QuteReward.md
│ │ ├── QuteSpell.md
│ │ ├── QuteSubclass.md
│ │ ├── QuteVehicle/
│ │ │ ├── README.md
│ │ │ ├── ShipAcHp.md
│ │ │ ├── ShipCrewCargoPace.md
│ │ │ └── ShipSection.md
│ │ ├── README.md
│ │ ├── Tools5eQuteBase.md
│ │ └── Tools5eQuteNote.md
│ └── pf2e/
│ ├── Pf2eQuteBase.md
│ ├── Pf2eQuteNote.md
│ ├── QuteAbility.md
│ ├── QuteAbilityOrAffliction.md
│ ├── QuteAction/
│ │ ├── ActionType.md
│ │ └── README.md
│ ├── QuteAffliction/
│ │ ├── QuteAfflictionSave.md
│ │ ├── QuteAfflictionStage.md
│ │ └── README.md
│ ├── QuteArchetype.md
│ ├── QuteBackground.md
│ ├── QuteBook/
│ │ ├── BookInfo.md
│ │ └── README.md
│ ├── QuteCreature/
│ │ ├── CreatureAbilities.md
│ │ ├── CreatureLanguages.md
│ │ ├── CreatureRitualCasting.md
│ │ ├── CreatureSense.md
│ │ ├── CreatureSkills.md
│ │ ├── CreatureSpellReference.md
│ │ ├── CreatureSpellcasting.md
│ │ ├── CreatureSpells.md
│ │ ├── README.md
│ │ ├── SpellcastingPreparation.md
│ │ └── SpellcastingTradition.md
│ ├── QuteDataActivity.md
│ ├── QuteDataArmorClass.md
│ ├── QuteDataDefenses/
│ │ ├── QuteSavingThrows.md
│ │ └── README.md
│ ├── QuteDataDuration.md
│ ├── QuteDataFrequency.md
│ ├── QuteDataGenericStat/
│ │ ├── QuteDataNamedBonus.md
│ │ ├── README.md
│ │ └── SimpleStat.md
│ ├── QuteDataHpHardnessBt/
│ │ ├── HpStat.md
│ │ └── README.md
│ ├── QuteDataRange/
│ │ ├── README.md
│ │ └── RangeUnit.md
│ ├── QuteDataSpeed.md
│ ├── QuteDataTimedDuration/
│ │ ├── DurationUnit.md
│ │ └── README.md
│ ├── QuteDeity/
│ │ ├── QuteDeityCleric.md
│ │ ├── QuteDivineAvatar.md
│ │ ├── QuteDivineIntercession.md
│ │ └── README.md
│ ├── QuteFeat.md
│ ├── QuteHazard/
│ │ ├── QuteHazardStealth.md
│ │ └── README.md
│ ├── QuteInlineAttack/
│ │ ├── AttackRangeType.md
│ │ └── README.md
│ ├── QuteItem/
│ │ ├── QuteItemActivate.md
│ │ ├── QuteItemArmorData.md
│ │ ├── QuteItemShieldData.md
│ │ ├── QuteItemVariant.md
│ │ ├── QuteItemWeaponData.md
│ │ └── README.md
│ ├── QuteRitual/
│ │ ├── QuteRitualCasting.md
│ │ ├── QuteRitualChecks.md
│ │ └── README.md
│ ├── QuteSpell/
│ │ ├── QuteSpellAmp.md
│ │ ├── QuteSpellDuration.md
│ │ ├── QuteSpellSave.md
│ │ ├── QuteSpellTarget.md
│ │ └── README.md
│ ├── QuteTrait.md
│ ├── QuteTraitIndex.md
│ └── README.md
├── examples/
│ ├── README.md
│ ├── admonitions/
│ │ ├── README.md
│ │ ├── admonitions-5e.json
│ │ ├── admonitions-pf2e-v3.json
│ │ └── other-admonitions.json
│ ├── config/
│ │ ├── README.md
│ │ ├── config.5e.json
│ │ ├── config.5e.yaml
│ │ ├── config.pf2e.json
│ │ ├── config.pf2e.yaml
│ │ └── config.schema.json
│ ├── css-snippets/
│ │ ├── README.md
│ │ ├── dnd5e-compendium.css
│ │ ├── dnd5e-float-images.css
│ │ ├── dnd5e-only-admonitions.css
│ │ ├── dnd5e-only-statblock.css
│ │ ├── hide-markdown-link-url.css
│ │ ├── pf2-compendium.css
│ │ └── pf2-only-statblocks.css
│ └── templates/
│ ├── README.md
│ └── tools5e/
│ ├── README.md
│ ├── images-background2md.txt
│ ├── images-class2md.txt
│ ├── images-item2md.txt
│ ├── images-monster2md.txt
│ ├── images-object2md.txt
│ ├── images-race2md.txt
│ ├── images-spell2md.txt
│ ├── images-subclass2md.txt
│ ├── images-vehicle2md.txt
│ ├── mixed/
│ │ ├── README.md
│ │ ├── mixed-background2md.txt
│ │ ├── mixed-class2md.txt
│ │ ├── mixed-deck2md.txt
│ │ ├── mixed-deity2md.txt
│ │ ├── mixed-feat2md.txt
│ │ ├── mixed-hazard2md.txt
│ │ ├── mixed-item2md.txt
│ │ ├── mixed-monster2md.txt
│ │ ├── mixed-object2md.txt
│ │ ├── mixed-race2md.txt
│ │ ├── mixed-reward2md.txt
│ │ ├── mixed-spell2md.txt
│ │ ├── mixed-subclass2md.txt
│ │ └── mixed-vehicle2md.txt
│ ├── monster2md-2024.txt
│ ├── monster2md-scores.txt
│ ├── monster2md-yamlStatblock-body.txt
│ ├── monster2md-yamlStatblock-header.txt
│ ├── object2md-yamlStatblock-body.txt
│ └── object2md-yamlStatblock-header.txt
├── jreleaser.yml
├── migration/
│ ├── json5e-cli-renameFiles-1.0.12.md
│ ├── ttrpg-cli-renameFiles-2.0.0.md
│ └── ttrpg-cli-renameFiles-5e-2.1.0.md
├── mvnw
├── mvnw.cmd
├── pom.xml
└── src/
├── ide-config/
│ ├── eclipse-format.xml
│ └── eclipse.importorder
├── main/
│ ├── java/
│ │ └── dev/
│ │ └── ebullient/
│ │ └── convert/
│ │ ├── Completion.java
│ │ ├── RpgDataConvertCli.java
│ │ ├── StringUtil.java
│ │ ├── VersionProvider.java
│ │ ├── config/
│ │ │ ├── CompendiumConfig.java
│ │ │ ├── Datasource.java
│ │ │ ├── ReprintBehavior.java
│ │ │ ├── TemplatePaths.java
│ │ │ ├── TtrpgConfig.java
│ │ │ └── UserConfig.java
│ │ ├── io/
│ │ │ ├── FontRef.java
│ │ │ ├── JavadocIgnore.java
│ │ │ ├── JavadocVerbatim.java
│ │ │ ├── MarkdownDoclet.java
│ │ │ ├── MarkdownWriter.java
│ │ │ ├── Msg.java
│ │ │ ├── NoStackTraceException.java
│ │ │ ├── Templates.java
│ │ │ └── Tui.java
│ │ ├── qute/
│ │ │ ├── ImageRef.java
│ │ │ ├── NamedText.java
│ │ │ ├── QuteAltNames.java
│ │ │ ├── QuteBase.java
│ │ │ ├── QuteNote.java
│ │ │ ├── QuteUtil.java
│ │ │ ├── Reprinted.java
│ │ │ ├── SourceAndPage.java
│ │ │ ├── TtrpgTemplateExtension.java
│ │ │ └── package-info.java
│ │ └── tools/
│ │ ├── CompendiumSources.java
│ │ ├── IndexType.java
│ │ ├── JsonCopyException.java
│ │ ├── JsonNodeReader.java
│ │ ├── JsonSourceCopier.java
│ │ ├── JsonTextConverter.java
│ │ ├── MarkdownConverter.java
│ │ ├── ParseState.java
│ │ ├── Tags.java
│ │ ├── ToolsIndex.java
│ │ ├── dnd5e/
│ │ │ ├── BackgroundTraits2Note.java
│ │ │ ├── HomebrewIndex.java
│ │ │ ├── ItemMastery.java
│ │ │ ├── ItemProperty.java
│ │ │ ├── ItemTag.java
│ │ │ ├── ItemType.java
│ │ │ ├── ItemTypeGroup.java
│ │ │ ├── Json2QuteBackground.java
│ │ │ ├── Json2QuteBastion.java
│ │ │ ├── Json2QuteBook.java
│ │ │ ├── Json2QuteClass.java
│ │ │ ├── Json2QuteCommon.java
│ │ │ ├── Json2QuteCompose.java
│ │ │ ├── Json2QuteDeck.java
│ │ │ ├── Json2QuteDeity.java
│ │ │ ├── Json2QuteFeat.java
│ │ │ ├── Json2QuteHazard.java
│ │ │ ├── Json2QuteItem.java
│ │ │ ├── Json2QuteLegendaryGroup.java
│ │ │ ├── Json2QuteMonster.java
│ │ │ ├── Json2QuteNote.java
│ │ │ ├── Json2QuteObject.java
│ │ │ ├── Json2QuteOptionalFeature.java
│ │ │ ├── Json2QuteOptionalFeatureType.java
│ │ │ ├── Json2QutePsionicTalent.java
│ │ │ ├── Json2QuteRace.java
│ │ │ ├── Json2QuteReward.java
│ │ │ ├── Json2QuteSpell.java
│ │ │ ├── Json2QuteSpellIndex.java
│ │ │ ├── Json2QuteTable.java
│ │ │ ├── Json2QuteVehicle.java
│ │ │ ├── JsonSource.java
│ │ │ ├── JsonTextReplacement.java
│ │ │ ├── MagicVariant.java
│ │ │ ├── OptionalFeatureIndex.java
│ │ │ ├── PsionicType.java
│ │ │ ├── SkillOrAbility.java
│ │ │ ├── SpellEntry.java
│ │ │ ├── SpellIndex.java
│ │ │ ├── SpellSchool.java
│ │ │ ├── Tools5eIndex.java
│ │ │ ├── Tools5eIndexType.java
│ │ │ ├── Tools5eJsonSourceCopier.java
│ │ │ ├── Tools5eLinkifier.java
│ │ │ ├── Tools5eMarkdownConverter.java
│ │ │ ├── Tools5eSources.java
│ │ │ └── qute/
│ │ │ ├── AbilityScores.java
│ │ │ ├── AcHp.java
│ │ │ ├── ImmuneResist.java
│ │ │ ├── QuteBackground.java
│ │ │ ├── QuteBastion.java
│ │ │ ├── QuteClass.java
│ │ │ ├── QuteDeck.java
│ │ │ ├── QuteDeity.java
│ │ │ ├── QuteFeat.java
│ │ │ ├── QuteHazard.java
│ │ │ ├── QuteItem.java
│ │ │ ├── QuteMonster.java
│ │ │ ├── QuteObject.java
│ │ │ ├── QutePsionic.java
│ │ │ ├── QuteRace.java
│ │ │ ├── QuteReward.java
│ │ │ ├── QuteSpell.java
│ │ │ ├── QuteSubclass.java
│ │ │ ├── QuteVehicle.java
│ │ │ ├── Tools5eQuteBase.java
│ │ │ ├── Tools5eQuteNote.java
│ │ │ └── package-info.java
│ │ └── pf2e/
│ │ ├── Json2QuteAbility.java
│ │ ├── Json2QuteAction.java
│ │ ├── Json2QuteAffliction.java
│ │ ├── Json2QuteArchetype.java
│ │ ├── Json2QuteBackground.java
│ │ ├── Json2QuteBase.java
│ │ ├── Json2QuteBook.java
│ │ ├── Json2QuteCompose.java
│ │ ├── Json2QuteCreature.java
│ │ ├── Json2QuteDeity.java
│ │ ├── Json2QuteFeat.java
│ │ ├── Json2QuteHazard.java
│ │ ├── Json2QuteItem.java
│ │ ├── Json2QuteRitual.java
│ │ ├── Json2QuteSpell.java
│ │ ├── Json2QuteTable.java
│ │ ├── Json2QuteTrait.java
│ │ ├── JsonSource.java
│ │ ├── JsonTextReplacement.java
│ │ ├── Pf2eActivity.java
│ │ ├── Pf2eIndex.java
│ │ ├── Pf2eIndexType.java
│ │ ├── Pf2eJsonNodeReader.java
│ │ ├── Pf2eJsonSourceCopier.java
│ │ ├── Pf2eMarkdown.java
│ │ ├── Pf2eSources.java
│ │ ├── Pf2eTypeReader.java
│ │ └── qute/
│ │ ├── Pf2eQuteBase.java
│ │ ├── Pf2eQuteNote.java
│ │ ├── QuteAbility.java
│ │ ├── QuteAbilityOrAffliction.java
│ │ ├── QuteAction.java
│ │ ├── QuteAffliction.java
│ │ ├── QuteArchetype.java
│ │ ├── QuteBackground.java
│ │ ├── QuteBook.java
│ │ ├── QuteCreature.java
│ │ ├── QuteDataActivity.java
│ │ ├── QuteDataArmorClass.java
│ │ ├── QuteDataDefenses.java
│ │ ├── QuteDataDuration.java
│ │ ├── QuteDataFrequency.java
│ │ ├── QuteDataGenericStat.java
│ │ ├── QuteDataHpHardnessBt.java
│ │ ├── QuteDataRange.java
│ │ ├── QuteDataSpeed.java
│ │ ├── QuteDataTimedDuration.java
│ │ ├── QuteDeity.java
│ │ ├── QuteFeat.java
│ │ ├── QuteHazard.java
│ │ ├── QuteInlineAttack.java
│ │ ├── QuteItem.java
│ │ ├── QuteRitual.java
│ │ ├── QuteSpell.java
│ │ ├── QuteTrait.java
│ │ ├── QuteTraitIndex.java
│ │ └── package-info.java
│ └── resources/
│ ├── application.properties
│ ├── convertData.json
│ ├── sourceMap.yaml
│ └── templates/
│ ├── README.md
│ ├── tools5e/
│ │ ├── README.md
│ │ ├── background2md.txt
│ │ ├── bastion2md.txt
│ │ ├── class2md.txt
│ │ ├── css-font.txt
│ │ ├── deck2md.txt
│ │ ├── deity2md.txt
│ │ ├── feat2md.txt
│ │ ├── hazard2md.txt
│ │ ├── index.txt
│ │ ├── item2md.txt
│ │ ├── monster2md.txt
│ │ ├── note2md.txt
│ │ ├── object2md.txt
│ │ ├── psionic2md.txt
│ │ ├── race2md.txt
│ │ ├── reward2md.txt
│ │ ├── spell2md.txt
│ │ ├── subclass2md.txt
│ │ └── vehicle2md.txt
│ └── toolsPf2e/
│ ├── README.md
│ ├── ability2md.txt
│ ├── action2md.txt
│ ├── affliction2md.txt
│ ├── archetype2md.txt
│ ├── background2md.txt
│ ├── book2md.txt
│ ├── creature2md.txt
│ ├── deity2md.txt
│ ├── feat2md.txt
│ ├── hazard2md.txt
│ ├── index.txt
│ ├── indexTrait.txt
│ ├── inline-ability2md.txt
│ ├── inline-affliction2md.txt
│ ├── inline-attack2md.txt
│ ├── item2md.txt
│ ├── note2md.txt
│ ├── ritual2md.txt
│ ├── spell2md.txt
│ └── trait2md.txt
├── scss/
│ ├── dnd5e/
│ │ ├── _admonitions.scss
│ │ ├── _float-images-mixin.scss
│ │ ├── _float-images.scss
│ │ ├── _no-inline-title.scss
│ │ └── _statblock.scss
│ ├── dnd5e-compendium.scss
│ ├── dnd5e-float-images.scss
│ ├── dnd5e-only-admonitions.scss
│ ├── dnd5e-only-statblock.scss
│ ├── hide-markdown-link-url.scss
│ ├── pf2-compendium.scss
│ ├── pf2-only-statblocks.scss
│ └── pf2e/
│ ├── _pf2e-variables.scss
│ ├── callmonitions/
│ │ ├── _00-callmonitions-index.scss
│ │ ├── _00-pf2e-maps.scss
│ │ ├── _01-callmonition-core.scss
│ │ ├── _02-pf2-beige.scss
│ │ ├── _02-pf2-brown.scss
│ │ ├── _02-pf2-example.scss
│ │ ├── _02-pf2-inset.scss
│ │ ├── _02-pf2-key-box.scss
│ │ ├── _02-pf2-note.scss
│ │ ├── _02-pf2-red.scss
│ │ ├── _02-pf2-sidebar.scss
│ │ ├── _02-pf2-summary.scss
│ │ ├── _02-pf2-tip.scss
│ │ ├── _02-success-degree.scss
│ │ ├── _03-ad-pf2-note.scss
│ │ ├── _03-embed-ability.scss
│ │ ├── _03-embed-action.scss
│ │ ├── _03-embed-avatar.scss
│ │ ├── _03-embed-disease.scss
│ │ ├── _03-embed-feat.scss
│ │ ├── _03-embed-item.scss
│ │ ├── _03-embed-ritual.scss
│ │ ├── _03-inline-affliction.scss
│ │ ├── _03-inline-attack.scss
│ │ ├── _04-statblock-pf2e.scss
│ │ └── shake-ins/
│ │ ├── _admon-content-styling.scss
│ │ ├── _ca-content.scss
│ │ ├── _ca-misc.scss
│ │ ├── _ca-root.scss
│ │ └── _ca-title.scss
│ ├── patches/
│ │ ├── _ITS-Theme.scss
│ │ └── _index.scss
│ └── styling/
│ ├── _action-icons.scss
│ ├── _embeds.scss
│ ├── _index.scss
│ ├── _link-text.scss
│ ├── _pathfinder-font-classes.scss
│ ├── _scrollbars.scss
│ ├── _sub-sup.scss
│ ├── _table.scss
│ └── _trait-box-shadows.scss
└── test/
├── java/
│ └── dev/
│ └── ebullient/
│ └── convert/
│ ├── CustomTemplatesIT.java
│ ├── CustomTemplatesTest.java
│ ├── Pf2eDataConvertIT.java
│ ├── Pf2eDataConvertTest.java
│ ├── TestUtils.java
│ ├── Tools5eDataConvertIT.java
│ ├── Tools5eDataConvertTest.java
│ ├── config/
│ │ ├── ConfiguratorTest.java
│ │ ├── ConfiguratorUtil.java
│ │ └── ExportDocsTest.java
│ ├── docs/
│ │ └── TemplateDocTest.java
│ ├── qute/
│ │ ├── ImageRefTest.java
│ │ └── TtrpgTemplateExtensionTest.java
│ └── tools/
│ ├── TokenizerTest.java
│ ├── dnd5e/
│ │ ├── CommonDataTests.java
│ │ ├── FilterAllNewestTest.java
│ │ ├── FilterAllTest.java
│ │ ├── FilterNoneTest.java
│ │ ├── FilterSrd2014Test.java
│ │ ├── FilterSrd2024Test.java
│ │ ├── FilterSrdEditionsTest.java
│ │ ├── FilterSubset2014Test.java
│ │ ├── FilterSubset2024Test.java
│ │ ├── FilterSubsetMixedTest.java
│ │ └── TextReplacementTest.java
│ └── pf2e/
│ ├── CommonDataTests.java
│ ├── Pf2eJsonDataNoneTest.java
│ ├── Pf2eJsonDataSubsetTest.java
│ └── Pf2eJsonDataTest.java
└── resources/
├── 5e/
│ ├── ermis-bg.json
│ ├── images-from-local.json
│ ├── images-remote.json
│ ├── psion.json
│ ├── sample.yaml
│ ├── sources-2014-book-adventure.json
│ ├── sources-2014-no-phb.yaml
│ ├── sources-2014-srd.yaml
│ ├── sources-2014-subset.json
│ ├── sources-2024-srd.yaml
│ ├── sources-2024-subset.yaml
│ ├── sources-changeDefaultSources.yaml
│ ├── sources-homebrew.json
│ ├── sources-images.yaml
│ ├── sources-single.yaml
│ ├── sources-templates.json
│ ├── sources-ua.json
│ └── sources.json
├── 5e-sourceTypes.json
├── dice-roller-fs.json
├── dice-roller.json
├── other/
│ ├── background.txt
│ ├── class.txt
│ ├── deity.txt
│ ├── feat.txt
│ ├── index.txt
│ ├── item.txt
│ ├── monster-all.txt
│ ├── note.txt
│ ├── race.txt
│ ├── spell.txt
│ └── subclass.txt
├── paths.json
├── pf2e.json
├── sourcemap.txt
├── sources-bad-template.json
└── sources-from-all.json
================================================
FILE CONTENTS
================================================
================================================
FILE: .editorconfig
================================================
# EditorConfig helps developers define and maintain consistent
# coding styles between different editors and IDEs
# editorconfig.org
root = true
[*]
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
indent_style = space
indent_size = 2
[*.{md,txt}]
indent_size = 4
trim_trailing_whitespace = false
[*.{java,xml,xslt}]
indent_size = 4
================================================
FILE: .github/CODEOWNERS
================================================
* @ebullient
================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.yaml
================================================
name: Bug Report
description: File a bug report
title: "🐛 "
labels: ["type: bug"]
body:
- type: markdown
attributes:
value: |
## Before you start
- [Check for updates](https://github.com/ebullient/ttrpg-convert-cli/releases) and make sure you're running the latest version.
- Look at existing bug reports to see if your issue has already been reported.
- Is this actually a bug?
- [Get Help](https://github.com/ebullient/ttrpg-convert-cli/tree/main#where-to-find-help) if you aren't confident you're doing things right.
- If this is something that you wish the tool could do, start a discussion or create a feature request instead.
> [!TIP]
>
> - 🚜 [**Review the changelog**](https://github.com/ebullient/ttrpg-convert-cli/blob/main/CHANGELOG.md) for new capabilities (✨) and breaking changes (🔥💥).
> - 🔮 Check out [**Conventions**](https://github.com/ebullient/ttrpg-convert-cli/blob/main/README.md#conventions) and [**Recommendations**](https://github.com/ebullient/ttrpg-convert-cli/blob/main/README.md#recommendations-for-using-the-cli).
- type: textarea
id: the-problem
attributes:
label: Describe the bug
description: |
A clear and concise summary of what the bug is.
Include an example and/or specific details about the resource in question.
validations:
required: true
- type: markdown
attributes:
value: |
Please provide a log file.
Run the command that exibits this bug as you usually would, but add the `--log` option.
[Attach the `ttrpg-convert.out.txt` file](https://docs.github.com/en/get-started/writing-on-github/working-with-advanced-formatting/attaching-files) that is created as a result.
- type: textarea
id: expected
attributes:
label: Expected Behavior
description: What did you expect to happen instead?
validations:
required: true
- type: input
id: cli-version
attributes:
label: TTRPG CLI Version
description: Which version are you using? (paste the output of [`--version`](https://github.com/ebullient/ttrpg-convert-cli/tree/7650c2785f05051fa64d95ec1f49d664ce4c2805#convert-5etools-json-data))
placeholder: 2.3.18
validations:
required: true
- type: checkboxes
id: operating-systems
attributes:
label: Which Operating Systems have you experienced this on?
description: You may select more than one.
options:
- label: Android
- label: iPhone/iPad
- label: Linux
- label: macOS
- label: Windows
================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.md
================================================
---
name: Feature request
about: 'It would be nice if... '
title: "✨ "
labels: enhancement
assignees: ''
---
**Describe the solution you'd like**
A clear and concise description of what you want to happen.
**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.
**Additional context**
Add any other context or screenshots about the feature request here.
================================================
FILE: .github/actions/data-cache/action.yml
================================================
name: 'Tools data cache'
description: 'find latest release; construct cache key; fetch/build cache'
inputs:
failIfMissing:
description: "Should the job fail if missing"
default: "false"
outputs:
cache_key:
description: Cache retrieval key
value: ${{ steps.test_data.outputs.cache_key }}
runs:
using: "composite"
steps:
- name: 5eTools release cache key
id: test_data
shell: bash
run: |
LATEST_5E_VERSION=$(curl -sLH 'Accept: application/json' https://api.github.com/repos/5etools-mirror-3/5etools-src/releases/latest | jq -r .tag_name)
LATEST_PF2E_VERSION=$(curl -sLH 'Accept: application/json' https://api.github.com/repos/Pf2eToolsOrg/Pf2eTools/releases/latest | jq -r .tag_name)
LATEST_VERSION=5e.${LATEST_5E_VERSION}-Pf2e.${LATEST_PF2E_VERSION}
PREFIX="TestData-"
KEY=${PREFIX}${LATEST_VERSION}
echo "🔹 Use 5eTools $LATEST_5E_VERSION and Pf2eTools $LATEST_PF2E_VERSION"
echo "cache_key_prefix=${PREFIX}" >> $GITHUB_OUTPUT
echo "cache_key=${KEY}" >> $GITHUB_OUTPUT
echo "version_5e=${LATEST_5E_VERSION}" >> $GITHUB_OUTPUT
echo "version_pf2e=${LATEST_PF2E_VERSION}" >> $GITHUB_OUTPUT
- name: Check Cache Data
id: test_data_check
uses: actions/cache@1bd1e32a3bdc45362d1e726936510720a7c30a57 # v4.2.0
with:
path: sources
key: ${{ steps.test_data.outputs.cache_key }}
fail-on-cache-miss: ${{ inputs.failIfMissing == 'true' }}
enableCrossOsArchive: true
- name: Download Test Data
id: test-data-download
if: steps.test_data_check.outputs.cache-hit != 'true'
shell: bash
env:
LATEST_5E_VERSION: ${{ steps.test_data.outputs.version_5e }}
LATEST_PF2E_VERSION: ${{ steps.test_data.outputs.version_pf2e }}
GITHUB_TOKEN: ${{ github.token }}
run: |
echo "🔹 Download 5e $LATEST_5E_VERSION"
# sparse clone of src
mkdir -p sources/5etools-src
git clone --quiet --depth=1 -b ${LATEST_5E_VERSION} \
-c advice.detachedHead=false \
--no-checkout \
https://github.com/5etools-mirror-3/5etools-src.git sources/5etools-src
pushd sources/5etools-src
git sparse-checkout init
git sparse-checkout set data
git checkout ${LATEST_5E_VERSION}
rm -rf .git
rm -f *.png
rm -f *.html
rm -f *.zip
popd
mkdir -p sources/5etools-img
git clone -b ${LATEST_5E_VERSION} \
--single-branch --depth=1 \
-c advice.detachedHead=false \
https://github.com/5etools-mirror-3/5etools-img.git sources/5etools-img
pushd sources/5etools-img
du -sh .
# replace all images w/ empty files. We don't care about image content for test purposes
find . -type f -not -path '*/.git*' | while read FILE; do echo > "$FILE"; done
du -sh .
popd
echo "🔹 5eTools: Download Homebrew"
# Don't grab all of homebrew. Too big
mkdir -p sources/5e-homebrew/adventure
mkdir -p sources/5e-homebrew/background
mkdir -p sources/5e-homebrew/book
mkdir -p sources/5e-homebrew/class
mkdir -p sources/5e-homebrew/collection
mkdir -p sources/5e-homebrew/creature
mkdir -p sources/5e-homebrew/deity
mkdir -p sources/5e-homebrew/optionalfeature
mkdir -p sources/5e-homebrew/race
mkdir -p sources/5e-homebrew/spell
mkdir -p sources/5e-homebrew/subclass
paths=(
"collection/MCDM Productions; Strongholds and Followers.json"
"adventure/Anthony Joyce; The Blood Hunter Adventure.json"
"adventure/Arcanum Worlds; Odyssey of the Dragonlords.json"
"adventure/JVC Parry; Call from the Deep.json"
"adventure/Kobold Press; Book of Lairs.json"
"background/D&D Wiki; Featured Quality Backgrounds.json"
"book/Ghostfire Gaming; Grim Hollow Campaign Guide.json"
"book/Ghostfire Gaming; Stibbles Codex of Companions.json"
"book/MCDM Productions; Arcadia Issue 3.json"
"class/D&D Wiki; Swashbuckler.json"
"class/Foxfire94; Vampire.json"
"class/KibblesTasty; Inventor.json"
"class/LaserLlama; Alternate Barbarian.json"
"class/Matthew Mercer; Blood Hunter (2022).json"
"class/badooga; Badooga's Psion.json"
"collection/Arcana Games; Arkadia.json"
"collection/Darrington Press; Tal’Dorei Campaign Setting Reborn.json"
"collection/Ghostfire Gaming; Grim Hollow - The Monster Grimoire.json"
"collection/Jasmine Yang; Hamund's Herbalism Handbook.json"
"collection/Keith Baker; Exploring Eberron.json"
"collection/Kobold Press; Deep Magic 14 Elemental Magic.json"
"collection/Kobold Press; Deep Magic.json"
"collection/Loot Tavern; Heliana's Guide To Monster Hunting.json"
"collection/MCDM Productions; The Talent and Psionics Open Playtest Round 2.json"
"collection/Mage Hand Press; Valda's Spire of Secrets.json"
"creature/Dragonix; Monster Manual Expanded III.json"
"creature/Kobold Press; Creature Codex.json"
"creature/Kobold Press; Tome of Beasts 2.json"
"creature/Kobold Press; Tome of Beasts.json"
"creature/MCDM Productions; Flee, Mortals! preview.json"
"creature/MCDM Productions; Flee, Mortals!.json"
"creature/Nerzugal Role-Playing; Nerzugal's Extended Bestiary.json"
"deity/Frog God Games; The Lost Lands.json"
"optionalfeature/laserllama; Laserllama's Exploit Compendium.json"
"race/Middle Finger of Vecna; Archon.json"
"spell/LaserLlama; LaserLlama's Compendium of Spells.json"
"subclass/LaserLlama; Druid Circles.json"
)
for i in "${paths[@]}"; do
echo "$i"
url=${i// /%20}
echo "$url"
curl -s -S -L -o "sources/5e-homebrew/$i" "https://raw.githubusercontent.com/TheGiddyLimit/homebrew/refs/heads/master/${url}"
done
echo "🔹 5eTools: Download Unearthed Arcana"
# Don't grab all of unearthed arcana
mkdir -p sources/5e-unearthed-arcana/collection
paths=(
"collection/Unearthed Arcana - Downtime.json"
"collection/Unearthed Arcana - Encounter Building.json"
"collection/Unearthed Arcana - Into the Wild.json"
"collection/Unearthed Arcana - Quick Characters.json"
"collection/Unearthed Arcana - Traps Revisited.json"
"collection/Unearthed Arcana - When Armies Clash.json"
"collection/Unearthed Arcana 2022 - Character Origins.json"
"collection/Unearthed Arcana 2022 - Expert Classes.json"
"collection/Unearthed Arcana 2022 - The Cleric and Revised Species.json"
"collection/Unearthed Arcana 2023 - Bastions and Cantrips.json"
"collection/Unearthed Arcana 2023 - Druid & Paladin.json"
"collection/Unearthed Arcana 2023 - Player's Handbook Playtest 5.json"
"collection/Unearthed Arcana 2023 - Player's Handbook Playtest 6.json"
"collection/Unearthed Arcana 2023 - Player's Handbook Playtest 7.json"
)
for i in "${paths[@]}"; do
echo "$i"
url=${i// /%20}
echo "$url"
curl -s -S -L -o "sources/5e-unearthed-arcana/$i" "https://raw.githubusercontent.com/TheGiddyLimit/unearthed-arcana/refs/heads/master/${url}"
done
echo "🔹 Pf2eTools Download ${LATEST_PF2E_VERSION}"
# sparse clone of src
mkdir -p sources/Pf2eTools
git clone --quiet --depth=1 -b ${LATEST_PF2E_VERSION} \
-c advice.detachedHead=false \
--no-checkout \
https://github.com/Pf2eToolsOrg/Pf2eTools.git sources/Pf2eTools
pushd sources/Pf2eTools
git sparse-checkout init
git sparse-checkout set data img
git checkout ${LATEST_VERSION}
rm -rf .git
rm -f *.png
rm -f *.html
rm -f *.xml
find img -type f | while read FILE; do echo > "$FILE"; done
popd
ls -al sources
du -sh sources
- name: Always Save Cache
id: test_data_save
if: always() && steps.test_data_check.outputs.cache-hit != 'true'
uses: actions/cache/save@0400d5f644dc74513175e3cd8d07132dd4860809 # v4.2.4
with:
key: ${{ steps.test_data.outputs.cache_key }}
path: sources
================================================
FILE: .github/actions/native-data-cache/action.yml
================================================
name: 'Fetch Tools data cache'
description: 'Fetch cache using known key'
inputs:
cache_key:
description: Key for data cache
required: true
runs:
using: "composite"
steps:
- id: cache_restore
uses: actions/cache/restore@1bd1e32a3bdc45362d1e726936510720a7c30a57 # v4.2.0
with:
path: sources
key: ${{ inputs.cache_key }}
fail-on-cache-miss: true
enableCrossOsArchive: true
restore-keys: |
"TestData-"
================================================
FILE: .github/augment-release.sh
================================================
#!/usr/bin/env bash
if [ -z "$1" ]; then
echo "Specify target version"
exit 1
fi
if [ -z "$JRELEASER_GITHUB_TOKEN" ]; then
echo "Specify JRELEASER_GITHUB_TOKEN"
exit 1
fi
export JRELEASER_PROJECT_VERSION=$1
git fetch --all
git checkout ${JRELEASER_PROJECT_VERSION}
./mvnw clean package -Dnative -DskipTests -DskipITs
jreleaser assemble -s archive --select-current-platform --output-directory target
jreleaser release --output-directory target --select-current-platform --exclude-distribution ttrpg-convert
================================================
FILE: .github/dependabot.yml
================================================
# Please see the documentation for all configuration options:
# https://help.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
version: 2
updates:
- package-ecosystem: "maven"
directory: "/" # Location of package manifests
schedule:
interval: "weekly"
open-pull-requests-limit: 3
cooldown:
default-days: 30
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "weekly"
cooldown:
default-days: 30
================================================
FILE: .github/project.yml
================================================
name: TTRPG Convert CLI
release:
current-version: 3.3.1
next-version: 3.3.1
snapshot-version: 399-SNAPSHOT
build:
artifact: ttrpg-convert-cli
jitpack:
group: com.github.ebullient
artifact: ttrpg-convert-cli
toggle: false
================================================
FILE: .github/workflows/cache.yml
================================================
name: Refresh cache
on:
schedule:
- cron: '0 2 * * 1' # Mondays at 2 AM UTC
workflow_dispatch:
jobs:
clear_cache:
runs-on: ubuntu-latest
permissions:
actions: write
steps:
- name: Delete old caches (except TestData)
env:
GH_TOKEN: ${{ github.token }}
run: |
cutoff=$(date -d '14 days ago' +%s)
gh api \
-H "Accept: application/vnd.github+json" \
"/repos/${{ github.repository }}/actions/caches?per_page=100" \
--paginate \
--jq '.actions_caches[]' | \
jq -r --arg cutoff "$cutoff" '
select(.key | startswith("TestData-") | not) |
select((.last_accessed_at | sub("\\..*Z$"; "Z") | fromdateiso8601) < ($cutoff | tonumber)) |
"\(.id) \(.key)"
' | while read cache_id cache_key; do
if [ -n "$cache_id" ]; then
echo "Deleting cache $cache_id ($cache_key)"
gh api --method DELETE \
-H "Accept: application/vnd.github+json" \
"/repos/${{ github.repository }}/actions/caches/$cache_id" || true
fi
done
cache:
runs-on: ubuntu-latest
outputs:
cache_key: ${{ steps.data_cache.outputs.cache_key }}
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- id: data_cache
uses: ./.github/actions/data-cache
- uses: ./.github/actions/native-data-cache
with:
cache_key: ${{ steps.data_cache.outputs.cache_key }}
================================================
FILE: .github/workflows/maven.yml
================================================
name: Main Maven build
on:
workflow_dispatch:
push:
branches:
- main
paths:
- .github/workflows/maven.yml
- .github/project.yml
- "**.xml"
- "*.yml"
- "src/**"
- "ide-config"
env:
JAVA_VERSION: 17
JAVA_DISTRO: temurin
NATIVE_JAVA_VERSION: 24
GRAALVM_DIST: graalvm-community
GH_BOT_EMAIL: "41898282+github-actions[bot]@users.noreply.github.com"
GH_BOT_NAME: "GitHub Action"
permissions: read-all
jobs:
main_root:
runs-on: ubuntu-latest
outputs:
is_main: ${{ steps.is_main_root.outputs.is_main }}
steps:
- name: Echo a message
id: is_main_root
if: github.ref == 'refs/heads/main' && github.repository == 'ebullient/ttrpg-convert-cli'
run: |
echo "This is the main branch of 'ebullient/ttrpg-convert-cli'"
echo "is_main=true" >> $GITHUB_OUTPUT
metadata:
uses: ebullient/workflows/.github/workflows/java-snap-metadata.yml@65cfcd66420f2a8032c82e84bd6688a1a64713a9 # 2.0.1
build:
runs-on: ubuntu-latest
needs: [main_root, metadata]
outputs:
cache_key: ${{ steps.data_cache.outputs.cache_key }}
permissions:
contents: write
actions: write
security-events: write
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
fetch-depth: 0
fetch-tags: false
- uses: ./.github/actions/data-cache
id: data_cache
- name: Build with Maven
uses: ebullient/workflows/.github/actions/maven-build@65cfcd66420f2a8032c82e84bd6688a1a64713a9 # 2.0.1
with:
artifact: ${{ needs.metadata.outputs.artifact }}
version: ${{ needs.metadata.outputs.snapshot }}
java-version: ${{ env.JAVA_VERSION }}
java-distribution: ${{ env.JAVA_DISTRO }}
- name: Push changes to files
if: needs.main_root.outputs.is_main
uses: ebullient/workflows/.github/actions/push-changes@65cfcd66420f2a8032c82e84bd6688a1a64713a9 # 2.0.1
with:
files: "README.md README-WINDOWS.md docs"
native-build:
needs: [metadata, build]
name: Build ${{ matrix.os }} binary
runs-on: ${{ matrix.os }}
concurrency:
group: native-${{ matrix.os }}-${{ github.ref }}
cancel-in-progress: true
strategy:
fail-fast: false
max-parallel: 3
matrix:
os: [macos-15-intel, macos-latest, windows-latest, ubuntu-latest]
permissions:
contents: read
actions: write
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
fetch-depth: 1
- uses: ./.github/actions/native-data-cache
with:
cache_key: ${{ needs.build.outputs.cache_key }}
- name: Native build with Maven
uses: ebullient/workflows/.github/actions/native-build@65cfcd66420f2a8032c82e84bd6688a1a64713a9 # 2.0.1
with:
artifact: ${{ needs.metadata.outputs.artifact }}
version: ${{ needs.metadata.outputs.snapshot }}
native-java-version: ${{ env.NATIVE_JAVA_VERSION }}
distribution: ${{ env.GRAALVM_DIST }}
matrix-os: ${{ matrix.os }}
snap-release:
needs: [main_root, metadata, build, native-build]
if: needs.main_root.outputs.is_main
uses: ebullient/workflows/.github/workflows/java-snapshot.yml@65cfcd66420f2a8032c82e84bd6688a1a64713a9 # 2.0.1
permissions:
contents: write
with:
artifact: ${{ needs.metadata.outputs.artifact }}
snapshot: ${{ needs.metadata.outputs.snapshot }}
secrets: inherit
================================================
FILE: .github/workflows/pull-request.yml
================================================
name: PR Maven Build
on:
pull_request:
paths:
- "**.xml"
- "*.yml"
- "src/**"
- "ide-config"
env:
JAVA_VERSION: 17
JAVA_DISTRO: temurin
NATIVE_JAVA_VERSION: 23
GRAALVM_DIST: graalvm-community
GH_BOT_EMAIL: "41898282+github-actions[bot]@users.noreply.github.com"
GH_BOT_NAME: "GitHub Action"
permissions:
contents: read
actions: read
jobs:
metadata:
uses: ebullient/workflows/.github/workflows/java-snap-metadata.yml@65cfcd66420f2a8032c82e84bd6688a1a64713a9 # 2.0.1
build:
runs-on: ubuntu-latest
needs: [metadata]
outputs:
cache_key: ${{ steps.data_cache.outputs.cache_key }}
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- uses: ./.github/actions/data-cache
id: data_cache
with:
failIfMissing: true
- name: Build with Maven
uses: ebullient/workflows/.github/actions/maven-build@65cfcd66420f2a8032c82e84bd6688a1a64713a9 # 2.0.1
with:
artifact: ${{ needs.metadata.outputs.artifact }}
version: ${{ needs.metadata.outputs.snapshot }}
java-version: ${{ env.JAVA_VERSION }}
java-distribution: ${{ env.JAVA_DISTRO }}
native-build:
runs-on: ubuntu-latest
needs: [metadata, build]
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
fetch-depth: 1
- uses: ./.github/actions/native-data-cache
with:
cache_key: ${{ needs.build.outputs.cache_key }}
- name: Native build with Maven
uses: ebullient/workflows/.github/actions/native-build@65cfcd66420f2a8032c82e84bd6688a1a64713a9 # 2.0.1
with:
artifact: ${{ needs.metadata.outputs.artifact }}
version: ${{ needs.metadata.outputs.snapshot }}
native-java-version: ${{ env.NATIVE_JAVA_VERSION }}
distribution: ${{ env.GRAALVM_DIST }}
matrix-os: ubuntu-latest
================================================
FILE: .github/workflows/release.yml
================================================
name: Create a release
on:
workflow_dispatch:
inputs:
semver:
description: "New version or major, minor, patch, project"
default: "patch"
required: true
type: string
retry:
description: "Retry release (clear created tag)"
default: false
required: true
type: boolean
dry_run:
description: "Test capabilities, do not release"
default: false
required: true
type: boolean
env:
JAVA_VERSION: 17
JAVA_DISTRO: temurin
GRAALVM_DIST: graalvm-community
GH_BOT_EMAIL: "41898282+github-actions[bot]@users.noreply.github.com"
GH_BOT_NAME: "GitHub Action"
CI: true
permissions: read-all
jobs:
main-root:
runs-on: ubuntu-latest
if: github.ref == 'refs/heads/main' && github.repository == 'ebullient/ttrpg-convert-cli'
steps:
- name: Echo a message
id: is-main-root
run: echo "This is the main branch of 'ebullient/ttrpg-convert-cli'"
build_tag:
runs-on: ubuntu-latest
needs: main-root
outputs:
artifact: ${{ steps.git-commit-tag.outputs.artifact }}
snapshot: ${{ steps.git-commit-tag.outputs.snapshot }}
version: ${{ steps.git-commit-tag.outputs.next }}
current: ${{ steps.git-commit-tag.outputs.current }}
permissions:
contents: write
actions: write
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
# Fetches all tags for the repo
- name: Fetch tags
run: git fetch --depth=1 origin +refs/tags/*:refs/tags/*
- name: Set up JDK ${{ env.JAVA_VERSION }}
uses: actions/setup-java@be666c2fcd27ec809703dec50e508c2fdc7f6654 # v5.2.0
with:
java-version: ${{ env.JAVA_VERSION }}
distribution: ${{ env.JAVA_DISTRO }}
cache: maven
- name: Commit and Tag release
id: git-commit-tag
env:
INPUT: ${{ inputs.semver }}
RETRY: ${{ inputs.retry }}
DRY_RUN: ${{ inputs.dry_run }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
COMMIT_PATHS: "README-WINDOWS.md docs examples"
TEXT_REPLACE: "README.md README-WINDOWS.md docs/alternateRun.md"
run: |
gh repo clone ebullient/workflows shared-workflows -- --depth=1
git config user.name ${{ env.GH_BOT_NAME }}
git config user.email ${{ env.GH_BOT_EMAIL }}
## Check and update version, build, and create tag
## outputs: CURRENT SNAPSHOT ARTIFACT NEXT
. ./shared-workflows/version-build-tag.sh
cp -R src/main/resources/templates default
zip -r target/${ARTIFACT}-${NEXT}-examples.zip docs examples default
- name: Upload ${{ steps.git-commit-tag.outputs.artifact }}-${{ steps.git-commit-tag.outputs.next }}-runner.jar
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
id: upload-jar
with:
name: artifacts-runner
path: target/${{ steps.git-commit-tag.outputs.artifact }}-${{ steps.git-commit-tag.outputs.next }}-runner.jar
- name: Upload ${{ steps.git-commit-tag.outputs.artifact }}-${{ steps.git-commit-tag.outputs.next }}-examples.zip
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
id: upload-zip
with:
name: artifacts-examples
path: target/${{ steps.git-commit-tag.outputs.artifact }}-${{ steps.git-commit-tag.outputs.next }}-examples.zip
native-binaries:
needs: build_tag
uses: ebullient/workflows/.github/workflows/java-release-native-binaries.yml@65cfcd66420f2a8032c82e84bd6688a1a64713a9 # 2.0.1
permissions:
contents: read
actions: write
with:
version: ${{ needs.build_tag.outputs.version }}
secrets: inherit
release:
needs: [build_tag, native-binaries]
uses: ebullient/workflows/.github/workflows/jreleaser-release.yml@65cfcd66420f2a8032c82e84bd6688a1a64713a9 # 2.0.1
permissions:
contents: write
actions: write
discussions: write
with:
dry_run: ${{ inputs.dry_run }}
extras: "${{ needs.build_tag.outputs.artifact }}-${{ needs.build_tag.outputs.version }}-examples.zip"
version: ${{ needs.build_tag.outputs.version }}
secrets: inherit
release-prep-next:
needs: [build_tag, release]
uses: ebullient/workflows/.github/workflows/java-release-prep-next.yml@65cfcd66420f2a8032c82e84bd6688a1a64713a9 # 2.0.1
permissions:
contents: write
with:
dry_run: ${{ inputs.dry_run }}
snapshot: ${{ needs.build_tag.outputs.snapshot }}
secrets: inherit
================================================
FILE: .github/workflows/scorecard.yml
================================================
# This workflow uses actions that are not certified by GitHub. They are provided
# by a third-party and are governed by separate terms of service, privacy
# policy, and support documentation.
name: Scorecard supply-chain security
on:
workflow_dispatch:
# For Branch-Protection check. Only the default branch is supported. See
# https://github.com/ossf/scorecard/blob/main/docs/checks.md#branch-protection
branch_protection_rule:
# To guarantee Maintained check is occasionally updated. See
# https://github.com/ossf/scorecard/blob/main/docs/checks.md#maintained
schedule:
- cron: '31 10 * * 4'
push:
branches: [ "main" ]
# Declare default permissions as read only.
permissions: read-all
jobs:
analysis:
name: Scorecard analysis
runs-on: ubuntu-latest
permissions:
# Needed to upload the results to code-scanning dashboard.
security-events: write
# Needed to publish results and get a badge (see publish_results below).
id-token: write
# Uncomment the permissions below if installing in a private repository.
# contents: read
# actions: read
steps:
- name: "Checkout code"
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false
- name: "Run analysis"
uses: ossf/scorecard-action@4eaacf0543bb3f2c246792bd56e8cdeffafb205a # v2.4.3
with:
results_file: results.sarif
results_format: sarif
# (Optional) "write" PAT token. Uncomment the `repo_token` line below if:
# - you want to enable the Branch-Protection check on a *public* repository, or
# - you are installing Scorecard on a *private* repository
# To create the PAT, follow the steps in https://github.com/ossf/scorecard-action#authentication-with-pat.
# repo_token: ${{ secrets.SCORECARD_TOKEN }}
# Public repositories:
# - Publish results to OpenSSF REST API for easy access by consumers
# - Allows the repository to include the Scorecard badge.
# - See https://github.com/ossf/scorecard-action#publishing-results.
# For private repositories:
# - `publish_results` will always be set to `false`, regardless
# of the value entered here.
publish_results: true
# Upload the results as artifacts (optional). Commenting out will disable uploads of run results in SARIF
# format to the repository Actions tab.
- name: "Upload artifact"
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
with:
name: SARIF file
path: results.sarif
retention-days: 5
# Upload the results to GitHub's code scanning dashboard.
- name: "Upload to code-scanning"
uses: github/codeql-action/upload-sarif@c10b8064de6f491fea524254123dbe5e09572f13 # v4.35.1
with:
sarif_file: results.sarif
================================================
FILE: .github/workflows/test-data.yml
================================================
name: Test with data (scheduled)
on:
schedule:
- cron: "7 9 * * */5"
workflow_dispatch:
env:
JAVA_VERSION: 17
JAVA_DISTRO: temurin
NATIVE_JAVA_VERSION: 23
GRAALVM_DIST: graalvm-community
FAIL_ISSUE: 140
permissions: read-all
jobs:
metadata:
uses: ebullient/workflows/.github/workflows/java-snap-metadata.yml@65cfcd66420f2a8032c82e84bd6688a1a64713a9 # 2.0.1
build:
runs-on: ubuntu-latest
needs: [metadata]
outputs:
cache_key: ${{ steps.data_cache.outputs.cache_key }}
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- id: data_cache
uses: ./.github/actions/data-cache
- name: Build with Maven
uses: ebullient/workflows/.github/actions/maven-build@65cfcd66420f2a8032c82e84bd6688a1a64713a9 # 2.0.1
with:
artifact: ${{ needs.metadata.outputs.artifact }}
version: ${{ needs.metadata.outputs.snapshot }}
java-version: ${{ env.JAVA_VERSION }}
java-distribution: ${{ env.JAVA_DISTRO }}
native-build:
runs-on: ubuntu-latest
needs: [metadata, build]
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
fetch-depth: 1
- uses: ./.github/actions/native-data-cache
with:
cache_key: ${{ needs.build.outputs.cache_key }}
- name: Native build with Maven
uses: ebullient/workflows/.github/actions/native-build@65cfcd66420f2a8032c82e84bd6688a1a64713a9 # 2.0.1
with:
artifact: ${{ needs.metadata.outputs.artifact }}
version: ${{ needs.metadata.outputs.snapshot }}
native-java-version: ${{ env.NATIVE_JAVA_VERSION }}
distribution: ${{ env.GRAALVM_DIST }}
matrix-os: ubuntu-latest
report-native-build:
name: Report errors
runs-on: ubuntu-latest
if: ${{ failure() }}
needs: [build, native-build]
permissions:
contents: read
issues: write
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
fetch-depth: 1
- id: gh-issue
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
gh issue comment ${{ env.FAIL_ISSUE }} --body "[Maven build failed: ${{ github.run_id }}](https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }})"
gh issue reopen ${{ env.FAIL_ISSUE }}
================================================
FILE: .github/workflows/website.yml
================================================
name: Update docs
on:
workflow_dispatch:
push:
branches:
- main
paths:
- "**.md"
permissions: read-all
jobs:
bump:
runs-on: ubuntu-latest
if: github.ref == 'refs/heads/main' && github.repository == 'ebullient/ttrpg-convert-cli'
steps:
- name: Bump website
env:
GH_TOKEN: ${{ secrets.EBULLIENT_PAT }}
run: |
gh workflow run -R ebullient/ebullient.github.io gh-pages.yml
================================================
FILE: .gitignore
================================================
sources
excludes.json
publish
compendium
artifacts
default
#Maven
target/
pom.xml.tag
pom.xml.releaseBackup
pom.xml.versionsBackup
release.properties
# Eclipse
.project
.classpath
.settings/
bin/
# IntelliJ
.idea
*.ipr
*.iml
*.iws
# NetBeans
nb-configuration.xml
# Visual Studio Code
.vscode
.factorypath
# OSX
.DS_Store
# Vim
*.swp
*.swo
# patch
*.orig
*.rej
# Local environment
.env
tmp*
.flattened*
pom.xml.tag
pom.xml.releaseBackup
pom.xml.versionsBackup
release.properties
*.log
JRELEASER_VERSION
jreleaser-cli.jar
native-image-Linux-logs
native-image-Windows-logs
native-image-macOS-logs
.quarkus/cli/plugins/quarkus-cli-catalog.json
# Javadoc things
/javadoc.*
/options
/packages
ttrpg-convert.out.*
.claude/settings.local.json
================================================
FILE: .markdownlint.yaml
================================================
MD007:
indent: 4
MD013: false
MD033:
allowed_elements:
- blockquote
================================================
FILE: .mvn/wrapper/.gitignore
================================================
maven-wrapper.jar
================================================
FILE: .mvn/wrapper/maven-wrapper.properties
================================================
wrapperVersion=3.3.4
distributionType=only-script
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.11/apache-maven-3.9.11-bin.zip
================================================
FILE: AGENTS.md
================================================
This file provides guidance to AI Agents working with code in this repository.
**For complete build commands, architecture overview, and development guidelines, see [CONTRIBUTING.md](CONTRIBUTING.md).**
## Your Role
Act as a pair programming partner with these responsibilities:
- **REVIEW THOROUGHLY**: Use file system access when available
- Analyze information flow and cross-module interactions
- ASK FOR CLARIFICATION if implementation choices are unclear
- **BE EFFICIENT**: Be succinct and concise, don't waste tokens
- **RESPECT PRIVACY**: Do not read .env* files unless instructed to do so
- **NO SPECULATION**: Never make up code unless asked
## Project Overview
This is a Quarkus-based CLI tool that converts TTRPG JSON data (from 5eTools and Pf2eTools) into markdown files optimized for Obsidian.md.
## Essential Commands
**Build and format code (required before commits):**
```bash
./mvnw install
```
**Run tests:**
```bash
./mvnw test
```
**Run a specific test:**
```bash
./mvnw test -Dtest=ClassName#methodName
```
**Format code only:**
```bash
./mvnw process-sources
```
## Understanding the Codebase
**Before making changes, read:**
- Architecture and control flow: [CONTRIBUTING.md § Notes on control flow](CONTRIBUTING.md#notes-on-control-flow)
- Unconventional conventions: [CONTRIBUTING.md § Unconventional conventions](CONTRIBUTING.md#unconventional-conventions)
**Key points:**
- This project uses Jackson with raw types (`JsonNode`, `ArrayNode`, `ObjectNode`) intentionally
- Parsing uses interface hierarchies with default methods
- Prefer enum-based field access (Pf2e pattern) over string keys
- Data flow: Index → Prepare → Render
- Templates use Qute engine
## Key Development Principles
- **Follow existing patterns**: Find similar functions in the same module (5e vs Pf2e) and emulate them
- **Understand the JSON quirks**: Source data has union types and dynamic structures from JavaScript
- **Test with live data**: Add 5eTools/Pf2eTools to `sources/` directory for testing
- **Respect architectural boundaries**: Use interface default methods to share parsing logic
## Testing
Key test files to understand:
- `Tools5eDataConvertTest` - CLI launch tests with different parameters
- `dev.ebullient.convert.tools.dnd5e.CommonDataTests` - Shared test cases
- `JsonDataNoneTest` (SRD), `JsonDataSubsetTest`, `JsonDataTest` (all data)
- `*IT` tests run against final artifact (not from IDE)
## Commit Guidelines
- Rebase commits (no merge commits)
- Use [gitmoji](https://gitmoji.dev/) at the beginning (actual emoji, not text)
- Be strict about: 🐛 (bugs), ✨ (new features), ♻️ (refactoring), 👷 (CI/build)
- Use ✨ for features that should be in CHANGELOG
- Use 🔥💥 for breaking changes that should be in CHANGELOG
================================================
FILE: CHANGELOG.md
================================================
# Changelog
[examples/config]: examples/config
[ex-snippets]: examples/css-snippets
[ex-templates]: examples/templates
[def-templates]: src/main/resources/templates/
**Note:** Entries marked with "🔥" indicate crucial or breaking changes that might affect your current setup.
## 3.3.0 Reference-based filtering and split rules
- ✨ Filter table notes by reference: only emit tables linked from included content (`onlyReferencedTables`); resolves #862
- ✨ Filter legendary groups by monster references; resolves #718
- ✨ Option to break rules into separate documents (`splitRules`); resolves #781
- 🐛 Use HTML to render complex tables; resolves #811
- 🐛 Resolve reprint aliases before adding spell references; resolves #857
- 🐛 Fix reprinted subclass spell list merging and wrong qualifiers; resolves #859
- 🐛 Resolve reprinted class source in subclass link generation; refs #779
- 🐛 Render psionic focus and modes in template; resolves #839
- 🐛 Fix image floating (center, left); resolves #853
- 🐛 Fix duplicated item properties
- 🐛 Remove length limit for captions; resolves #762
## 3.2.5 Races or species?
- ✨ Add option to emit races as species
- ✨ Lots of extra spell fields added to templates
- 🐛 Resolve {{resist}} template values in bestiary
- 🐛 Add subclass references for dunamancy spells
- 🐛 Fix template vaultPath (#837)
- 🐛 Handle alternate casting times (#827)
## 3.2.2 New template extensions
- 🎨 Additional template extensions; recompiled/updated CSS for images
- `{resource.<attribute>.first}` -- retrieve the first element in a list
- `{resource.<attribute>.skipFirst}` -- skip the first element of a list
- `{resource.<attribute>.size}` -- return the size of a list
- `{resource.<attribute>.quotedEscaped}` -- Escape double quotes in a string (YAML/frontmatter safe)
- ✨ Add featCategory prerequisite
- 🐛 Fix handling of special AC, spellcasting, and cult links
## 3.2.1 Airships and gear
- ✨ 5e: Elemental Airship support
- ✨ Added gear to the 5e monster template
## 3.1.6 / 3.2.0: 🔥 Changes to template aliases
- 🐛 5e: Add membership prerequisite (feats, etc.)
- 🔥 `aliases` template attribute: new for 5e, changed for Pf2e
Instead of using `{resource.name}` as a single alias, iterate over the group:
```md
aliases:
{#each resource.aliases}
- {it}
{/each}
```
## 3.1.5: Lots of goodies
- ✨ Add feat categories handling
- ✨ Sort class lists for spells; add feats, races, and backgrounds lists
- ✨ Linkify senses in monster statblocks (#754)
- ✨ Mythic Actions; Gear attributes; Trait entries in statblocks
- ✨ Additional template extensions for case munging
- ✨ Template methods for 2024 template
- 🐛 Include group name for additional spells (#784)
- 🐛 No table roll string when dice disabled (#761)
- 🐛 Make singular dice roll formats consistent with source material
- 🐛 Fix footnotes in class progression (#747)
- 🐛 Remove duplicate optional features (#744)
- 🎨 cssclasses as array; two-column layout for indexes
- ♻️ Use full feature type titles for homebrew optional features
## 🔥💥 3.1.0: Accommodating 2024 rules (XMM and SRD)
- 💥 **Monster spellcasting traits**: 2024 monster statblocks interleave spellcasting behaviors in trait categories.
- trait-like attributes (`trait`, `action`, `bonusAction`, `reaction`, `legendary`) will already include spellcasting information. For 2014 rules, the information will be included in the trait attribute.
- `spellcasting` will now always return empty (no breakage, but also no output)
- `rawSpellcasting` can be used to retrieve raw [SpellCasting attributes](./docs/templates/dnd5e/QuteMonster/Spellcasting.md).
- `fixed` defines spells with a fixed duration (simple list): `constant`, `ritual` and `will`
- `variable` (varying frequencies): `charges`, `daily`, `legendary`, `monthly`, `recharge`, `rest`, `restLong`, `weekly`, `yearly`
- `daily` and `will` have been removed (incorporated in `variable` and `fixed`, respectively).
- ✨ **Additional item fields**: Item variants have a fistful of additional fields: `bonusAc`, `bonusWeapon`, `bonusWeaponAttack`, `bonusWeaponDamage`, `bonusWeaponCritDamage`, `bonusSpellAttack`, `bonusSpellDamage`, `bonusSpellSaveDc`, `bonusSavingThrow`, `bonusAbilityCheck`, `bonusProficiencyBonus`, `bonusSavingThrowConcentration`
## 🔥✨ 3.0.0: Moving the things
Support for the 2024 ruleset caused a lot of ripples. There is nothing small about this release.
- *Specifying Sources*
- Removed `-s` option. Sources must be specified in config files.
- The [Source Map](./docs/sourceMap.md) for 5e sources now includes `book` or `adventure` status
- Combined `from` and `full-source` into unified `sources` key with four types:
```json
{
"sources": {
"reference": [...], // Reference-only content
"book": [...], // Complete book content
"adventure": [...], // Complete adventure content
"homebrew": [...] // Custom content
}
}
```
- *Reprint handling*: CLI will default to the most recent version available for your selected sources.
- Use `include`/`exclude` config to override.
- For SRD/Basic rules for 2014 content, use: "srd", "basicrules"
- For SRD/Basic rules for 2024 content, use: "srd52", "freerules2024"
- *Generated content*
- Changed Players Handbook directory to `players-handbook-2014`
- Dice roller uses the `|text` flag to make text more consistent
and readable (dice roll occurs on hover)
- Added a `lists` folder in the compendium:
- Lists of optional features
- Lists of spells by class, school, subclass, background, feat...
- **5e Template updates**
- All templates:
- Added `books`: Abbreviated source book list
- Added `sourcesWithFootnote`: Primary source with additional sources as footnotes
- Image display (see [image examples](examples/templates/tools5e))
- hasImages - true if any images are present
- hasMoreImages - true if more than one image is present
- showAllImages - rendered wikilinks for all images. If there is more than one, they will be shown as a gallery.
- showMoreImages - rendered wikilinks for all but the first image. If there is more than one, they will be shown as a gallery.
- showPortraitImage - rendered wikilink for the first image with the '#right' anchor tag to float it to the right side.
- Added [Bastion template](docs/templates/dnd5e/QuteBastion/) (2024 rules)
- Class updates:
- Unified class progression tables
- [Hit Point Die](docs/templates/dnd5e/QuteClass/HitPointDie.md)
- [Starting Equipment](docs/templates/dnd5e/QuteClass/StartingEquipment.md)
- Improved [Multiclassing](docs/templates/dnd5e/QuteClass/Multiclassing.md)
- isClassic/classic: true if 2014 class
- isSidekick/sidekick: true if sidekick class
- Spells: Added `references` list linking to related content
Note: Path changes may affect existing content links. All path updates support dual-edition content structure.
## 🔖 ✨ 2.3.14: Improvements to Pathfinder rendering
@miscoined has made significant contributions to improve support for Pf2e creatures (the bestiary). 🙏🎉💖
## 🔖 🐛 2.3.13: Fallback paths for images
In the event you have a bad image reference and the copy fails, you can set a [fallback path](./docs/configuration.md#fallback-paths) for an image that should be used instead.
```json
"images": {
"fallbackPaths": {
"img/bestiary/MM/Green Hag.jpg": "img/bestiary/MM/Green Hag.webp"
},
}
```
- The key (original path) must match what is used by the JSON Source.
- The value (replacement path) should be either: a valid path to a local file or a valid URL to a remote file.
## 🔖 🐛 2.3.11: Fixes for downloading images
Downloading and/or copying [internal](./docs/configuration.md#copying-internal-images) or [external](./docs/configuration.md#copying-external-images) images has been a whack-a-mole exercise with path encodings across platforms and sources. Everything should finally be fixed now.
## 🔖 ✨ 2.3.9: Fixes for Dice Roller and Statblock
If you use the Dice Roller plugin, `useDiceRoller: true` will add dice rolls to tables and in text.
If you are using the Fantasy Statblocks plugin to render your statblocks, you can now add `yamlStatblocks: true` to your configuration. This will strip backticks and other formatting related to dice rolls from statblock text (which will make Fantasy Statblocks happier), whether you have dice roller plugin enabled or not.
## 🔖 ✨ 2.3.0: 5eTools moving to mirror2
The 5eTools Mirror now uses a separate repository for images. When you run `ttrpg-convert` against 5eTools content, images will not be copied into your vault by default. Links to external images will be used instead. This can greatly reduce the size of your vault, but you will need to be connected to the internet for images to render.
See [Copying "internal" images](./docs/configuration.md#copying-internal-images) for options on how to copy tokens and other item/spell/monster fluff images into your vault.
See [Copying "external" images](./docs/configuration.md#copying-external-images) to copy additional images referenced in general text into your vault.
## 🔖 ✨ 2.2.12: 5e support for generic and magic item variants
Items may have variants, which are defined as a list in the `variants` attribute.
- Use `resource.variantAliases` to get a list of aliases for variants
- Use `resource.variantSectionLinks` to get a list of links to variant sections
- Iterate over the section list to generate sections (`##`) for each variant
See the following examples:
- [Default `item2md.txt`](src/main/resources/templates/tools5e/item2md.txt)
- [Example `examples/templates/tools5e/images-item2md.txt`](examples/templates/tools5e/images-item2md.txt)
## 🔖 ✨ 2.2.5: New templates for decks (and cards), legendary groups, and psionics
- **New templates**: `deck2md.txt`, `legendaryGroup2md.txt`, `psionic2md.txt`
- Decks, when present, will be generated under `compendium/decks`. Cards are part of decks.
- Legendary groups, when present, will be generated under `bestiary/legendary-groups`
- Psionics, when present, will be generated under `compendium/psionics`.
- `feat2md.txt` is now also used for optional features.
- The default `monster2md.txt` template has been updated to embed the legendary group.
- CSS snippets have been updated to support legendary groups embedded in statblocks.
## 🔖 🔥 2.1.0: File name and path changes, template docs and attribute changes
1. 🔥 **Variant rules include the source in the file name**: this avoids duplicates (and there were some).
2. 🔥 **5eTools changed the classification for some creatures**, which moves them in the bestiary. Specifically: the Four-armed troll is a giant (and not an npc), a river serpent is a monstrosity rather than a beast, and ogre skeletons and red dracoliches are both undead.
3. 🔥 Better support for table rendering has superceded dedicated/hand-tended random name tables. All of the tables are still present, just in different units more directly related to source material.
4. 🔥 **Change to monster template attributes:** Legendary group attributes have been simplified to `name` and `desc`, just like other traits. See the [default monster template](https://github.com/ebullient/ttrpg-convert-cli/blob/0736c3929a6d90fe01860692f487b8523b57e60d/src/main/resources/templates/tools5e/monster2md.txt#L80) for an example.
> ***If you use the Templater plugin***, you can use [a templater script](https://github.com/ebullient/ttrpg-convert-cli/blob/main/migration/ttrpg-cli-renameFiles-5e-2.1.0.md) to **rename files in your vault before merging** with freshly generated content. View the contents of the template before running it, and adjust parameters at the top to match your Vault.
✨ **New template documentation** is available in [docs](docs). Content is generated from javadoc in the various *.qute packages (for template-accessible fields and methods). It may not be complete.. PRs to improve it are welcome.
## 🔖 🔥 2.0.0: File name and path changes, and styles
1. 🔥 **A leading slash (`/`) is no longer used at the beginning of compendium and root paths**. This should allow you to move these two directories around more easily.
- I recommend that you keep the compendium and rules sections together as big balls of mud.
- If you do want to further move files around, do so from within obsidian, so obsidian can update its links.
2. 🔥 **D&D 5e subclasses now use the source of the subclass in the file name**.
> ***If you use the Templater plugin***, you can use [a templater script](https://github.com/ebullient/ttrpg-convert-cli/blob/main/migration/ttrpg-cli-renameFiles-2.0.0.md) to rename files in your vault before merging with freshly generated content. View the contents of the template before running it, and adjust parameters at the top to match your Vault.
3. 🎨 CSS styles for D&D 5e and Pathfinder are now available in `examples/css-snippets`.
4. 📝 Admonitions are also available for import:
- 🎨 [admonitions-5e.json](examples/admonitions/admonitions-5e.json)
- [admonitions-pf2e-v3.json](examples/admonitions/admonitions-pf2e-v3.json)
- 🎨 [other-admonitions.json](examples/admonitions/other-admonitions.json)
Note: `admonitions-5e.json` and `other-admonitions.json` use colors from CSS snippets to adjust for light and dark mode.
## 🔖 1.1.1: Dice roller in statblocks and text
If you are using the default templates and want to render dice rolls, set
`useDiceRoller` to true to use dice roller strings when replacing dice `{@dice
}`, and `{@damage }` strings. This can be set differently for either "5e" or
"pf2e" configurations. Please note that if you are using a custom template
and fantasy statblocks, you do **not** need to set the dice roller in your
config. Fantasy statblocks will take care of the rendering itself.
See [examples/config][] for the general structure of config.
## 🔖 1.1.0: Images for backgrounds, items, monsters, races, and spells
The conversion tool downloads fluff images into `img` directories within each type, e.g. `backgrounds/img` or `bestiary/aberration/img`. These images are unordered, and are not referenced in entry text. Templates must be modified to include them.
To display all images, you can do something like this:
```md
{#each resource.fluffImages}
{/each}
```
Note that the line above ends with two spaces, which serves as a line break when you have strict line endings enabled. You may need something a little different to get things to wrap the way you want in the case that there are multiple images (which is infrequent for these types).
You can also use two separate blocks, such that the first image is used at the top of the document, and any others are included later:
```md
{#if resource.fluffImages && resource.fluffImages.size > 0 }{#let first=resource.fluffImages.get(0)}

{/let}{/if}
...
{#each resource.fluffImages}{#if it_index != 0}
{/if}{/each}
```
Notice the `#right` and `#center` anchor tags in the example above. The following CSS snippet defines formatting for two anchor tags: `#right` (which will float the image to the right) and `#center` (which will display the image as a centered block).
```css
.json5e-background div[src$="#center"],
.json5e-item div[src$="#center"],
.json5e-monster div[src$="#center"],
.json5e-race div[src$="#center"],
.json5e-spell div[src$="#center"] {
text-align: center;
}
.json5e-background div[src$="#center"] img,
.json5e-item div[src$="#center"] img,
.json5e-monster div[src$="#center"] img,
.json5e-race div[src$="#center"] img,
.json5e-spell div[src$="#center"] img {
height: 300px;
}
.json5e-background div[src$="#right"],
.json5e-item div[src$="#right"],
.json5e-monster div[src$="#right"],
.json5e-race div[src$="#right"],
.json5e-spell div[src$="#right"] {
float: right;
margin-left: 5px;
}
.json5e-background div[src$="#right"] img,
.json5e-item div[src$="#right"] img,
.json5e-monster div[src$="#right"] img,
.json5e-race div[src$="#right"] img,
.json5e-spell div[src$="#right"] img {
height: 300px;
}
.rendered-widget .admonition-statblock-parent,
.markdown-rendered .admonition-statblock-parent,
.markdown-preview-section .admonition-statblock-parent {
clear: both;
}
```
Notes:
- I recommend constraining the image height (rather than the width) in your CSS snippet for images.
- The above snippet also adds a `clear` setting to the admonition parent. Some text descriptions are shorter than the constrained image height. Setting `clear: both` on `admonition-parent` ensures that images floated to the right do not impact the `statblock` display.
- This configuration is in the [compendium.css snippet][ex-snippets].
- There is an example for each type in the [example templates directory][ex-templates] directory. Relevant file names start with `images-`.
## 🔖 1.0.18: You can put more things in json input now
Use `convert` to import source text for books and adventures that you own:
```json
"convert": {
"adventure": [
"WBtW"
],
"book": [
"PHB"
]
}
```
Specify templates in json:
```json
"template": {
"background": "path/to/template.txt",
}
```
Be careful of paths here. Relative paths will be resolved depending on where the command is run from. Absolute paths will be machine specific (most likely). Use forward slashes for path segments, even if you're working on windows.
You can place this configuration one file or several, your choice.
## 🔖 1.0.16: Sections in Spell text
Text for changes to spells at higher levels is added to spells a little differently depending on how complicated the spell is.
Some spells effectively have subsections. Create or Destroy Water, from the PHB, has one subsection describing how water is created, and another describing how it is destroyed. In many layouts, there is just a bit of bold text to visually highlight this information. I've opted to make these proper sections (with a heading) instead, because you can then embed/transclude just the variant you want into your notes where that is relevant.
If a spell has sections, then "At Higher Levels" will be added as an additional section. Otherwise, it will be appended with `**At Higher Levels.**` as leading eyecatcher text.
The [default spell template (spell2md.txt)][def-templates] will test for sections in the spell text, and if so, now inserts a `## Summary` header above the Classes/Sources information, to ensure that the penultimate section can be embedded cleanly.
## 🔖 1.0.15: Flowcharts, optfeature in text, styled rows
- `optfeature` text is rendered (Tortle package)
- `flowcharts` is rendered as a series of `flowchart` callouts
Use the admonition plugin to create a custom `flowchart` callout with an icon of your choice.
- The adventuring gear tables from the PHB have been corrected
## 🔖 1.0.14: Ability Scores
As shown in [monster2md-scores.txt][ex-templates], you can now access ability scores directly to achieve alternate layouts in templates, for example:
```md
- STR: {resource.scores.str} `dice: 1d20 {resource.scores.strMod}`
- DEX: {resource.scores.dex} `dice: 1d20 {resource.scores.dexMod}`
- CON: {resource.scores.con} `dice: 1d20 {resource.scores.conMod}`
- INT: {resource.scores.int} `dice: 1d20 {resource.scores.intMod}`
- WIS: {resource.scores.wis} `dice: 1d20 {resource.scores.wisMod}`
- CHA: {resource.scores.cha} `dice: 1d20 {resource.scores.chaMod}`
```
## 🔖 1.0.13: Item property tags are now sorted
Property tags on items are now sorted (not alphabetically) to stabilize their order in generated files. This should be a one-time bit of noise as you cross this release (using a version before to using some version after).
## 🔖 🔥 1.0.12: File name and image reference changes
### 🔥 File name changes
Each file name will now contain an abbreviation of the primary source to avoid conflicts (for anything that does not come from phb, mm, dmg).
***If you use the Templater plugin***, you can use [a templater script](https://github.com/ebullient/ttrpg-convert-cli/blob/main/migration/json5e-cli-renameFiles-1.0.12.md) to rename files in your vault before merging with freshly generated content. View the contents of the template before running it, and adjust parameters at the top as necessary.
### 🔥 1.0.12: Deity symbols and Bestiary tokens
Symbols and tokens have changed in structure. Custom templates will need a bit of adjustment.
For bestiary tokens:
```md
{#if resource.token}
{/if}
```
For deities:
```md
{#if resource.image}
{/if}
```
================================================
FILE: CLAUDE.md
================================================
@AGENTS.md
================================================
FILE: CONTRIBUTING.md
================================================
# Contributing
I am always thrilled to receive pull requests, and I do my best to process them as fast as possible. Not sure if that typo is worth a pull request? Do it! I appreciate it.
If your pull request is not accepted on the first try, don't be discouraged. We can work together to improve the PR so it can be accepted.
## Legal
All original contributions are licensed under the ASL - Apache License, version 2.0 or later, or, if another license is specified as governing the file or directory being modified, such other license.
All contributions are subject to the [Developer Certificate of Origin (DCO)](https://developercertificate.org/). The DCO text is also included verbatim in [dco.txt](dco.txt).
## Please open an issue first
Take a moment to check that an issue doesn't already exist for the behavior or output you're seeing.
If it does, please add a quick thumbs up reaction.
This will help prioritize the most common problems and requests.
If there isn't an issue yet, open one! Be as specific as you can, and include the tool version.
## Build and test the CLI
[Install Java](https://adoptium.net/installation/). This project requires Java 17.
- **Use maven:** `./mvnw install`
- **Use the Quarkus CLI**: `quarkus build`
To test with actual/live data, add 5eTools and/or PF2eTools into a `sources` directory.
Using the GitHub CLI:
```shell
mkdir -p sources
# PF2eTools
gh repo clone Pf2eToolsOrg/Pf2eTools sources/Pf2eTools -- --depth=1
```
> [!NOTE]
> Java 17 and Java 21 will work without issue.
> There are known issues with picocli and Java 24; avoid it.
### Building native images
A Pull Request build will automatically build a native image for Linux. Building a native image requires a few more steps (GraalVM, native-image, etc). See the [Quarkus documentation](https://quarkus.io/guides/building-native-image) for more information.
### Build CSS only
- **build css**: `./mvnw sass-cli:run`
- **watch**: `./mvnw sass-cli:watch`
- **package**: `./mvnw sass-cli:run -Dsass.watch`
## Running tests in the IDE
I'll just talk about VS Code here. IntelliJ has similar features.
To run tests, you need to have live data in the `sources` directory as described above.
1. Install and enable the following extensions:
- Language support for Java
- Debugger for Java
- Test Runner for Java
Installing these projects will add a few icons to the activity bar on the left:
- A beaker: that's the Test Explorer view.
- A play button with a bug: that's the Run/Debug view.
2. Open the Test Explorer view. You will see a hierarchical view of all the tests in the project.
- You can run individual tests, or run all the tests in a package or class.
- Tests of note:
- `dev.ebullient.convert.Tools5eDataConvertTest`: this tests runs against a launch of the CLI. There are different methods here for different input parameters (SRD-only, constrained input, all input, collection of homebrew).
- `dev.ebullient.convert.tools.dnd5e.*`: This is a collection of tests (`JsonDataNoneTest` is SRD-only, `JsonDataSubsetTest` uses a subset of the data, `JsonDataTest` uses all the data) that all share a common set of test cases defined here: `src/test/java/dev/ebullient/convert/tools/dnd5e/CommonDataTests.java`. There is a method for each type of data, which makes it a bit easier to debug how a certain type is rendered.
Notes:
- You will never run \*IT tests from the Test Explorer. These are run by the maven build against the constructed final artifact.
## Coding standards and Conventions
There are two tasks in the Maven build that will format code and sort imports to reduce whitespace/ordering churn in PRs and commits.
Make sure to run `./mvnw package` or `./mvnw process-sources` before you commit, and everything will be formatted correctly.
This project also has a `.editorconfig` file that defines expected behavior for whitespace and line endings.
Most IDEs have an editorconfig plugin that will automatically format your code to match these settings.
### IDE Config and Code Style
If you want your IDE to format your code for you, use the files in the `src/ide-config` directory.
#### Eclipse Setup
Open the *Preferences* window, and then navigate to *Java* -> *Code Style* -> *Formatter*.
- Click *Import* and then select `src/ide-config/eclipse-format.xml`.
- Choose the `ttrpg-convert-cli` profile.
Next navigate to *Java* -> *Code Style* -> *Organize Imports*. Click *Import* and select `src/ide-config/eclipse.importorder`.
#### VS Code
1. Install and enable the "Language Support for Java by Red Hat" extension.
2. Open settings (use the gear icon in the lower left corner of the window), and click the "Workspace" link in the header under the search box to open the workspace settings.
3. Type `eclipse` in the search box, you should see two: `Java > Format: Eclipse` and `Java > Format: Eclipse Export Profile`.
4. Set *Java* -> *Format* -> *Settings URL* to `https://raw.githubusercontent.com/ebullient/ttrpg-convert-cli/main/src/ide-config/eclipse-format.xml`
5. Set *Java* -> *Format* -> *Profile* to `ttrpg-convert-cli`
6. Click "Edit in settings.json" under *Java* -> *Completion* -> *Import Order* and paste the following into the `java.format.imports.order` setting:
```json
"java.completion.importOrder": [
"#",
"java",
"javax",
"jakarta",
"org",
"com",
""
],
```
#### IntelliJ
1. Open the *Settings* window
2. Navigate to *Editor* -> *Code Style* -> *Java*
3. Click on the little cog near the top of the dialogue box, next to the *Scheme* text box. Click on *Import Scheme* -> *Eclipse XML Profile* from the dropdown.
4. Navigate to `src/ide-config/eclipse-format.xml` in the project directory and click *Ok*, and *Ok* again on the next dialogue box
5. Click on the *Imports* tab
6. Ensure that the *Layout static imports separately* checkbox is checked
7. Underneath that, change the entries so that they look like this:
```shell
import static all other imports
<blank line>
import java.*
import javax.*
import jakarta.*
import org.*
import com.*
<blank line>
import all other imports
```
## Notes on control flow
- `src/main/java/dev/ebullient/convert/RpgDataConvertCli.java` is the entry point for the CLI.
- `src/main/java/dev/ebullient/convert/config` has classes for handling config
- `src/main/java/dev/ebullient/convert/io` has classes for handling input and output.
- `MarkdownDoclet` renders Javadoc in \*.qute.\* packages.
- `MarkdownWriter` writes markdown files using configured templates.
- `Tui` is the "text user interface" and deals with writing things to the console.
- `src/main/java/dev/ebullient/convert/qute` has base/common model/POJO[^1] classes for rendering templates
- `src/main/java/dev/ebullient/convert/tools` has the main logic for converting data
- There are some common interfaces and classes for handling data, and then there are subpackages for each tool.
[^1]: Plain Old Java Object
### Unconventional conventions
This project is parsing JSON built for JavaScript that has a lot of Union types and other things that are not easily represented in Java. Some of the typical kinds of adapters are not used here: it's too much magic that becomes too hard to read.
This project does use Jackson, but sticks with raw types (`JsonNode`, `ArrayNode`, `ObjectNode`) to a large extent. There are some cases where direct mapping to an object is used, but it's not the norm.
As happens with many projects, I've somewhat changed my approach to things over time. When I first started, it was a lot of strings, which lead to a lot of bugs. When working with Pf2e, I stumbled on an approach that is cleaner, but definitely non-standard.
Flow goes something like this:
- `Index`: CLI is launched. Index is created (`Tools5eIndex` or `Pf2eIndex`). Files are read, with json data parsed and indexed as `JsonNode` data.
- `Prepare`: After all data is read, it is "prepared" (for example, fix missing linkages between types after everything has been indexed)
- `Render`: Selected types are then converted to Markdown using `Json2\*` classes. These classes parse the type-specific data, and construct a `Qute` model used when rendering templates.
Parsing is based on a hierarchy of interfaces with default methods
- 5e: `JsonTextConverter` <- `JsonTextReplacement` <- `JsonSource` <- `Json2QuteCommon` <- `Json2QuteBackground`
- Pf2e: `JsonTextConverter` <- `JsonTextReplacement` <- `JsonSource`<- `Pf2eTypeReader` <- `Json2QuteBase` <- `Json2QuteBackground`
Fields in these Json objects are also read through an enum type hierarchy. These enums allow fields to be defined and typed once (no finger checks) without requiring strict object typing (given union types). This is the preferred practice (for this project), but is not uniformly followed on the (older) 5e side. As I go through things, I'm trying to clean up the 5e side to match the Pf2e side. It's a bit of a mess, but it's a mess that's getting better.
## Commits and pull requests
- Rebase your commits (no merge commits)
- Use one or more [gitmoji](https://gitmoji.dev/) (the actual emoji, not text) at the beginning of your commits.
There are gitmoji plugins/extensions for vscode and intellij, and those help with "pick the right emoji for this commit" prompting.
```txt
🔥🤯 Support 2024 rule changes💥
🤖 update generated content
🚚 Rename pf2e/JsonSourceCopier to Pf2eJsonSourceCopier
🐛✨💥 Make spell durations and cast durations rich data objects
```
- I'm strict/careful about bugs (🐛), new/shiny things (✨), refactoring (♻️), and CI/build things (👷).
- Do not use lipstick; use 🎨 instead.
- Use sparkles (✨) if you are adding something new that should be noted in the [CHANGELOG](./CHANGELOG.md)
- Use something fiery (🔥💥) if the commit includes breaking changes that should be noted in the [CHANGELOG](./CHANGELOG.md)
================================================
FILE: LICENSE
================================================
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
================================================
FILE: README-WINDOWS.md
================================================
# Running on Windows
> [!TIP]
> See also Obsidian TTRPG Tutorials: [TTRPG-Convert-CLI 5e][] or [TTRPG-Convert-CLI PF2e][]
[TTRPG-Convert-CLI 5e]: https://obsidianttrpgtutorials.com/Obsidian+TTRPG+Tutorials/Plugin+Tutorials/TTRPG-Convert-CLI/TTRPG-Convert-CLI+5e
[TTRPG-Convert-CLI PF2e]: https://obsidianttrpgtutorials.com/Obsidian+TTRPG+Tutorials/Plugin+Tutorials/TTRPG-Convert-CLI/TTRPG-Convert-CLI+PF2e
## Requirements
- [Git][] is recommended to easily download and update the JSON sources
- Existing experience with using a command line isn't required, but may be useful. These instructions should be
sufficient, but you can look at the following resources for additional background on how to use the Windows
command line:
- [A Beginner's Guide to the Windows Command Line](https://www.makeuseof.com/tag/a-beginners-guide-to-the-windows-command-line/)
- [How to Open Command Prompt in a Folder](https://www.lifewire.com/open-command-prompt-in-a-folder-5185505)
## Instructions
> [!TIP]
> There are actually three(ish) different kinds of command line programs on Windows. Command Prompt, PowerShell
> and Terminal. For our purposes they're mostly interchangeable, but the default program is different
> depending on what version of Windows you have, so if you see e.g. "PowerShell" mentioned, but you have
> "Command Prompt", don't worry - they should all work the same for the instructions here.
1. From the [latest release][1], download the following files:
- `ttrpg-convert-cli-3.3.1-windows-x86_64.zip`
- `ttrpg-convert-cli-3.3.1-examples.zip`
2. Unzip the downloaded files into a place you'll remember. For example, `Downloads`.
3. Navigate to the `bin` directory inside the unzipped files. It might be nested within another folder. You should see a `ttrpg-convert` EXE file in the folder - see the screenshot below.
4. In Explorer, hold **Shift** and **Right Click** within the folder (not on any particular file). Select
*Open in Terminal* (this may also be *Open PowerShell window here*, or *Open command window here* if you
have an older version of Windows)

5. A new window should open up, showing something like this. The path to the left of the cursor should match
wherever you extracted the files to:

6. Run the tool to check that it works. Enter `./ttrpg-convert --version` following into the terminal and press Enter
to run the command. You should see something like the following:
```shell
PS C:\Users\Kelly\Downloads\ttrpg-convert-cli-2.3.14-windows-x86_64\bin> .\ttrpg-convert --version
ttrpg-convert version 2.3.14
Git commit: 6ecb310
```
If this works, then you're good to run the command to generate your notes. Otherwise, look below
for troubleshooting instructions
7. Run the tool to generate your notes. What this looks like depends on what you want the tool to do
and is described more in detail elsewhere in the README. For example, to generate notes from the
D&D5e SRD into a folder called `dm`, run:
```shell
./ttrpg-convert --index -o dm
```
- You should see output like the following, listing out how many notes of each type were generated, and a new `dm` folder should be in that directory.

8. To use additional sources, templates, or books, or for more configuration options,
[create a config file][3] and [see the main README][4].
- For example, assuming you have a custom configuration located in a file called `dm-sources.json`, you can use this command to generate notes using that configuration:
```shell
./ttrpg-convert --index -o dm -c dm-sources.json
```
[1]: https://github.com/ebullient/ttrpg-convert-cli/releases/latest
[3]: docs/configuration.md
[4]: README.md
## Uh oh, something went wrong
### What are the weird characters in the output?
On Windows, the command output will look like this, with weird characters at the start of lines.
```shell
[ ✅ OK] Finished reading config.
⏱️ Reading C:\Users\Kelly\Downloads\ttrpg-convert-cli-3.3.1-windows-x86_64\ttrpg-convert-cli-3.3.1-windows-x86_64\bin\5etools-mirror-2.github.io\data
[ ✅ OK] Finished reading data.
```
These are emoji that Windows is having trouble displaying. This doesn't affect the functionality at all, but
if you want to see these properly, choose a font with emoji support in the command line, and run the following:
```shell
chcp 65001
```
You should then start seeing the emoji correctly:
```shell
[ ✅ OK] Finished reading config.
⏱️ Reading C:\Users\Kelly\Downloads\ttrpg-convert-cli-3.3.1-windows-x86_64\ttrpg-convert-cli-3.3.1-windows-x86_64\bin\5etools-mirror-2.github.io\data
[ ✅ OK] Finished reading data.
```
### 'ttrpg-convert' is not recognized
If you see the following:
```shell
'ttrpg-convert' is not recognized as an internal or external command,
operable program or batch file.
```
or
```shell
ttrpg-convert : The term 'ttrpg-convert' is not recognized as the name of a cmdlet, function, script file, or operable
program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
At line:1 char:1
+ ttrpg-convert
+ ~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (ttrpg-convert:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
```
This means that the command line can't find the program. This is usually because you're running the command in
the wrong directory, or there's a typo somewhere in the name of the command.
Type in `dir` and press **Enter**. You should see output similar to this:
```shell
Directory:
C:\Users\Kelly\Downloads\ttrpg-convert-cli-3.3.1-windows-x86_64\ttrpg-convert-cli-3.3.1-windows-x86_64\bin
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 29/06/2024 6:51 PM 5etools-mirror-2.github.io
-a---- 29/06/2024 4:17 PM 58880000 ttrpg-convert.exe
```
If there is no `ttrpg-convert.exe` in the list, then you're either in the wrong directory or have unzipped the
file to the wrong directory. Make sure that you're opening the command line in the directory that contains
`ttrpg-convert.exe`.
If there *is* a `ttrpg-convert.exe` in the list, then the next most likely culprit is a typo. Make sure that the
command starts with `./ttrpg-convert`. Try copy/pasting this command:
```shell
./ttrpg-convert --help
```
If everything is set up correctly, you should see output starting with the following:
```shell
Convert TTRPG JSON data to markdown
Usage: ttrpg-convert [-dhlvV] [--index] [-c=<configPath>] [-g=<datasource>]
-o=<outputPath> [] [<input>...] [COMMAND]
```
### No output at all
If you don't get any output at all when running the `ttrpg-convert` command, try running
`./ttrpg-convert --help`. If you still get no output, like this:
```shell
C:\Users\Kelly\Downloads\ttrpg-convert-cli-2.3.14-windows-x86_64\bin>.\ttrpg-convert --help
C:\Users\Kelly\Downloads\ttrpg-convert-cli-2.3.14-windows-x86_64\bin>
```
Then you probably have an anti-virus software that is blocking command line EXE files. The standard Windows
Defender doesn't do this, so it's probably some third-party anti-virus software you have installed. Try
disabling it temporarily, or allow-listing the `ttrpg-convert.exe` file.
Note that this is often different from the Firewall settings and is often listed as a different feature with
with a different name, depending on what anti-virus software you're using. Sometimes this is called
*Realtime Protection*, or *Deep Behavioral Inspection*.
### The current machine does not support all of the following CPU features that are required by the image
If you see the following:
> The current machine does not support all of the following CPU features that are required by the image:
> \[CX8, CMOV, FXSR, MMX, SSE, SSE2, SSE3, SSSE3, SSE4_1, SSE4_2, POPCNT, LZCNT, AVX, AVX2, BMI1, BMI2, FMA].
> Please rebuild the executable with an appropriate setting of the -march option.
You have an older version of Windows. You'll need to use the [Java version](docs/alternateRun.md#use-java-to-run-the-jar) of the CLI instead.
[Git]: https://git-scm.com/download/win
================================================
FILE: README.md
================================================
# TTRPG convert CLI

A Command-Line Interface designed to convert TTRPG data from 5eTools and Pf2eTools into crosslinked, tagged, and formatted markdown optimized for [Obsidian.md](https://obsidian.md).
<!-- markdownlint-disable no-inline-html -->
<table><tr>
<td>Jump</td>
<td><a href="#install-the-ttrpg-convert-cli">⬇ Download</a></td>
<td><a href="docs/configuration.md">⚙️ Configuration</a></td>
<td><a href="examples/">🎨 Examples</a></td>
<td><a href="examples/templates">🎨 Templates</a></td>
</tr><tr>
<td><a href="CHANGELOG.md">🚜 Changelog</a></td>
<td><a href="docs/sourceMap.md">🗺️ Source Map</a></td>
<td><a href="#convert-5etools-json-data">📖 5eTools</a></td>
<td><a href="#convert-pf2etools-json-data">📖 Pf2eTools</a></td>
<td><a href="#convert-homebrew-json-data">📖 Homebrew</a></td>
</tr></table>
I use [Obsidian](https://obsidian.md) to keep track of my campaign notes. This project parses JSON sources for materials that I own from the 5etools mirror to create linked and formatted markdown that I can reference in my notes.
> [!TIP]
>
> - 🚜 [**Review the changelog**](CHANGELOG.md) for new capabilities (✨) and breaking changes (🔥💥).
> - 🔮 Check out [**Conventions**](#conventions) and [**Recommendations**](#recommendations-for-using-the-cli).
## Using the Command Line
This tool works in the command line, which is a text-based way to give instructions to your computer.
If you're new to it, we have resources to help you get started below.
If you don't have a favorite method already, or you don't know what those words mean, here are some resources to get you started:
- For macOS / OSX users:
- Start with the built-in `Terminal` application.
- [Learn the macOS Command Line][]
- For Windows users:
- [A Beginner's Guide to the Windows Command Line][]
- See the [Windows README](README-WINDOWS.md)
[Learn the macOS Command Line]: https://blog.teamtreehouse.com/introduction-to-the-mac-os-x-command-line
[A Beginner's Guide to the Windows Command Line]: https://www.makeuseof.com/tag/a-beginners-guide-to-the-windows-command-line/
## Install the TTRPG Convert CLI
There are several options for running `ttrpg-convert`.
Choose the one you are most comfortable with:
- **Using Windows?** See the [Windows README](README-WINDOWS.md).
- `jbang`: [Use JBang!][jbang] (hides Java; sets up command aliases).
- `brew`: [Use Homebrew (macOS or Linux)][brew] (uses platform binaries).
- `bin`: [Use a pre-built platform binary][bin] (no Java required).
- `jar`: [Use Java to run the jar][jar].
- `src`: [Build from source][src].
| Platform | Options |
|----------------|----------|
| Linux | [jbang][], [brew][], [bin][], [jar][], [src][] |
| Mac (Arm) | [brew][], [jbang][], [bin][], [jar][], [src][] |
| Mac (Intel) | [brew][], [jbang][], [bin][], [jar][], [src][] |
| Windows | [📝](README-WINDOWS.md), [jbang][], [bin][], [jar][], [src][] |
| Windows (Old) | [📝](README-WINDOWS.md), [jbang][], [jar][], [src][] |
| Windows (WSL) | [brew][], [jbang][], [jar][], [src][] |
[jbang]: ./docs/alternateRun.md#use-jbang
[brew]: ./docs/alternateRun.md#use-homebrew
[bin]: ./docs/alternateRun.md#use-pre-built-platform-binary
[jar]: ./docs/alternateRun.md#use-java-to-run-the-jar
[src]: ./docs/alternateRun.md#build-and-run-from-source
## Recommendations for using the CLI
- 🔐 Treat generated content as a big ball of mud. Stick it in a corner of your vault and *treat it as read-only*.
Trust us, you will want to regenerate content from time to time. It is cheap and easy to do if you don't have your own edits to worry about.
- 🔎 Have the CLI generate output into a separate directory and use a comparison tool to preview changes.
You can use `git diff` to compare arbitrary directories. For example:
```bash
git diff --no-index vault/compendium/bestiary generated/compendium/bestiary
```
- 📑 Use a copy tool that only updates modified files, like [rsync][], to avoid unnecessary file copying when updating your vault. Use the checksum option (`-c`) to compare file contents; the file modification date is meaningless given generated files are recreated when the tool is run. We have some suggestions in [discussion #220][sync-discussion], but it is very much a work in progress.
[rsync]: https://stackoverflow.com/a/19540611
[sync-discussion]: https://github.com/ebullient/ttrpg-convert-cli/discussions/220
### Required Plugins
- **Admonitions** ([git](https://github.com/javalent/admonitions)/[obsidian](obsidian://show-plugin?id=obsidian-admonition)): The Admonitions plugin supports a codeblock style admonition used for more complex embedded content. See [Admonition plugin notes](docs/README.md#admonitions) for more recommendations.
### Recommended Plugins
- **Force Note View Mode by Front Matter** ([git](https://github.com/bwydoogh/obsidian-force-view-mode-of-note)/[obsidian](obsidian://show-plugin?id=obsidian-view-mode-by-frontmatter)): I use this plugin to treat these generated notes as essentially read-only. See [Force Note View Mode plugin settings](docs/README.md#force-note-view-mode-by-front-matter) for recommendations.
- **Fantasy Statblocks** ([git](https://github.com/javalent/fantasy-statblocks)/[obsidian](obsidian://show-plugin?id=obsidian-5e-statblocks)): Templates for rendering monsters can define a `statblock` in the document body or provide a full or abridged YAML monster in the document header to update monsters in the plugin's bestiary.
- See [Fantasy Statblocks plugin settings](docs/README.md#fantasy-statblocks) for recommendations.
- See [Templates](examples/templates) for related template customization.
- **Initiative Tracker** ([git](https://github.com/javalent/initiative-tracker)/[obsidian](obsidian://show-plugin?id=initiative-tracker)): Templates for rendering monsters can include information in the header to define monsters that the Initiative Tracker can use when constructing encounters. See [Initiative Tracker plugin settings](docs/README.md#initiative-tracker) for recommendations.
## Conventions
- **Links.** Documents generated by this plugin will use markdown links rather than wiki links. A [CSS snippet](examples/css-snippets/hide-markdown-link-url.css) can make these links less intrusive in edit mode by hiding the URL portion of the string.
- **File names.** To avoid conflicts and issues with different operating systems, all file names are slugified (all lowercase, symbols stripped, and spaces replaced by dashes). This is a familiar convention for those used to Jekyll, Hugo, or other blogging systems.
- File names for resources outside of the core books (PHB, MM, and DMG) have the abbreviated source name appended to the end to avoid file name collisions.
- All files have an `aliases` attribute that contains the original name of the resource.
- **Organization.** Files are generated in two roots: `compendium` and `rules`. The location of these roots is [configurable](docs/configuration.md#specify-target-paths-paths-key). These directories will be populated based on the sources you have enabled.
- `compendium` contains files for items, spells, monsters, etc. The `compendium` directory is further organized into subdirectories for each type of content. For example, all items are in the `compendium/items` directory.
- `rules` contains files for conditions, weapon properties, variant rules, etc.
- `css-snippets` will contain **CSS files for special fonts** used by some content. You will need to copy these snippets into your vault (`.obsidian/snippets`) and enable them (`Appearance -> Snippets`) to ensure all content in your vault is styled correctly.
- **Styles.** Every document has a `cssclasses` attribute that assigns a CSS class. We have some [CSS snippets](examples/css-snippets/) that you can use to customize elements of the compendium.
- 5eTools: `json5e-background`, `json5e-class`, `json5e-deck`, `json5e-deity`, `json5e-feat`, `json5e-hazard`, `json5e-item`, `json5e-monster`, `json5e-note`, `json5e-object`, `json5e-psionic`, `json5e-race`, `json5e-reward`, `json5e-species`, `json5e-spell`, and `json5e-vehicle`.
- Pf2eTools: `pf2e`, `pf2e-ability`, `pf2e-action`, `pf2e-affliction`, `pf2e-archetype`, `pf2e-background`, `pf2e-book`, `pf2e-deity`, `pf2e-feat`, `pf2e-hazard`, `pf2e-index`, `pf2e-item`, `pf2e-note`, `pf2e-ritual`, `pf2e-spell`, `pf2e-trait`.
- **Admonitions.** Generated content uses code-block-style [Admonitions](docs/README.md#admonitions) in addition to Obsidian callouts. We have [Admonition definitions](examples/admonitions/) that you can import to ensure these admonition/callout types are defined.
- `ad-statblock`
- 5eTools: `ad-flowchart`, `ad-gallery`, `ad-embed-action`, `ad-embed-feat`, `ad-embed-monster`, `ad-embed-object`, `ad-embed-race`, `ad-embed-spell`, `ad-embed-table`
- Pf2eTools: `ad-embed-ability`, `ad-embed-action`, `ad-embed-affliction`, `ad-embed-avatar`, `ad-embed-disease`, `ad-embed-feat`, `ad-embed-item`, `ad-pf2-note`, `ad-pf2-ritual`.
## Convert 5eTools JSON data
> [!NOTE]
> Instructions here use backslashes to wrap lines for readability (a common practice for Linux-based command shells).
>
> *If you are using Windows*, you will need to remove the backslashes and put the command on a single line. You may also need to append `.exe` to the command name (though it should work without).
1. Invoke the CLI with the `--version` option.
```shell
ttrpg-convert --version
```
You should see output similar to the following:
```shell
ttrpg-convert version 2.3.18
Git commit: ed56f76
```
If you do, we know that the CLI is working!
If you don't, there may be something wrong with your installation. Windows users, see the [Windows README for help](./README-WINDOWS.md#uh-oh-something-went-wrong).
2. Invoke the CLI to generate indexes and markdown for SRD content:
```shell
ttrpg-convert \
--index \
-o dm \
<5etools-data-dir>
```
- `--index` generates two index files: `all-index.json` and `src-index.json`.
> 🚀 TIP:
> - Use `all-index.json` to see the reference keys for all discovered content. This can confirm that an included source was actually read.
> - Use `src-index.json` to see the reference keys for content that was included in the generated output. Use this to confirm that your source selection is working as expected.
- `-o dm` The target output directory (`dm` in this case). Files will be created in this directory.
- `<5etools-data-dir>` is a placeholder for the location of downloaded 5eTools source data directory.
This should produce a set of markdown files in the `dm` directory that contains only SRD content.
3. Next, you'll want to create a [configuration file](docs/configuration.md) to set up your sources.
The configuration is provided to the CLI using the `-c` option:
```shell
ttrpg-convert \
--index \
-o dm \
-c my-config.json \
<5etools-data-dir>
```
> 🚀 Note: Only include content you own. Find the identifier for your sources in the [Source Map](./docs/sourceMap.md#source-name-mapping-for-5etools).
Next step:
- Create your own [configuration file](docs/configuration.md).
## Convert Pf2eTools JSON data
🚜 🚧 🚜 🚧 🚜 🚧 🚜 🚧
> [!NOTE]
> Instructions here use backslashes to wrap lines for readability (a common practice for Linux-based command shells).
>
> *If you are using Windows*, you will need to remove the backslashes and put the command on a single line. You may also need to append `.exe` to the command name (though it should work without).
1. Invoke the CLI with the `--version` option:
```shell
ttrpg-convert --version
```
You should see output similar to the following:
```shell
ttrpg-convert version 2.3.18
Git commit: ed56f76
```
If you do, we know that the CLI is working!
If you don't, there may be something wrong with your installation. Windows users, see the [Windows README for help](./README-WINDOWS.md#uh-oh-something-went-wrong).
2. Invoke the CLI. In this first example, let's generate indexes and markdown for default content:
```shell
ttrpg-convert \
-g pf2e \
--index \
-o dm \
<Pf2eTools-data-dir>
```
- `-g pf2e` The game system! Pathfinder 2e!
- `--index` generates two index files: `all-index.json` and `src-index.json`.
> 🚀 TIP:
> - Use `all-index.json` to see the reference keys for all discovered content. This can confirm that an included source was actually read.
> - Use `src-index.json` to see the reference keys for content that was included in the generated output. Use this to confirm that your source selection is working as expected.
- `-o dm` The target output directory. Files will be created in this directory.
- `<Pf2eTools-data-dir>` is a placeholder for the location of downloaded 5eTools source data directory.
3. Next, you'll want to create a [configuration file](docs/configuration.md) to set up your sources.
The configuration is provided to the CLI using the `-c` option:
```shell
ttrpg-convert \
-g pf2e \
--index \
-o dm \
-c my-config.json
<Pf2eTools-data-dir>
```
> 🚀 Note: Only include content you own. Find the identifier for your sources in the [Source Map](./docs/sourceMap.md#source-name-mapping-for-pf2etools).
Next step:
- Create your own [configuration file](docs/configuration.md).
## Convert Homebrew JSON data
The CLI tool can also import homebrewed content, though this content must still fit the JSON standards set by the [5eTools JSON spec][5etools JSON] or the PF2eTools JSON spec (coming soon, similar to 5eTools).
Perhaps the simplest way to import homebrew is to use existing homebrew data from the 5eTools homebrew GitHub repo: <https://github.com/TheGiddyLimit/homebrew>.
> [!TIP]
> 🍺 *You only need the specific file you wish to import*.
>
> Homebrew data is different from the 5eTools data. Each homebrew file is a complete reference. If you compare it to cooking: the 5eTools mirror repo is organized by ingredient (all of the carrots, all of the onions, ...); homebrew data is organized by prepared meal / complete recipe.
Adding homebrew content is easiest if you use a [configuration file](./docs/configuration.md). We will assume a file named `my-config.json` for the example below, but you can use any name you like.
> [!IMPORTANT]
> 🚀 Respect copyrights and support content creators; use only the sources you own.
For example, if you want to use Benjamin Huffman's popular homebrewed [Pugilist class](https://www.dmsguild.com/product/184921/The-Pugilist-Class):
1. Download a copy of the [Pugilist JSON file](https://github.com/TheGiddyLimit/homebrew/blob/master/class/Benjamin%20Huffman%3B%20Pugilist.json).
Save this file to a well-known location on your computer. It is probably easiest if it sits next to your 5eTools or Pf2eTools directory.
2. Update your [configuration file](docs/configuration.md) to add a `homebrew` section under `sources`:
```json
{
"sources": {
...
"homebrew": [
"path/to/Benjamin Huffman; Pugilist.json"
]
}
}
```
- `path/to/` is a placeholder for a relative or absolute path to the file[^1]. Here are a few ways to determine the path to a file:
- You may be able to drag and drop the file into the terminal window.
- You may be able to right-click on the file and select "Copy Path".
- *Windows users*: When pasting the path into a text editor, use find/replace to replace all `\` with `/`.
3. Run the command like so (for 5e homebrew):
```shell
ttrpg-convert \
--index \
-o hb-compendium \
-c my-config.json \
<5etools-data-dir>
```
- `-o hb-compendium` specifies the output directory for generated content.
- `-c my-config.json` specifies the name and/or path to your configuration file.
- `<5etools-data-dir>` is a placeholder for the 5eTools source data directory.
See [configuration](docs/configuration.md) for more details on how to configure the CLI.
The process is similar for other homebrew, including your own, as long as it is broadly compatible with the [5eTools JSON spec](https://wiki.tercept.net/en/Homebrew/FromZeroToHero).
## Where to find help
- There is a `#cli-support` thread in the `#tabletop-games` channel of the [Obsidian Discord](https://discord.gg/veuWUTm).
- There is a `TTRPG-convert-help` post in the `obsidian-support` forum of the [Obsidian TTRPG Community Discord](https://discord.gg/Zpmr37Uv).
- There is a TTRPG-convert tutorial (currently aimed at Windows users, but much of it is helpful no matter your OS) at [Obsidian TTRPG Tutorials](https://obsidianttrpgtutorials.com/Obsidian+TTRPG+Tutorials/Plugin+Tutorials/TTRPG-Convert-CLI/TTRPG-Convert-CLI+5e).
- If you open an issue for an error, run with the `--debug` and `--log` options, and attach the log file to the issue.
### Want to help fix it?
- If you're familiar with the command line and are comfortable running the tool, please consider running [unreleased snapshots](docs/alternateRun.md#using-unreleased-snapshots) and reporting issues.
- If you want to contribute, I'll take help of all kinds: documentation, examples, sample templates, and stylesheets are just as important as Java code. See [CONTRIBUTING](CONTRIBUTING.md).
## Other notes
This project uses Quarkus, the Supersonic Subatomic Java Framework. To learn more about Quarkus, please visit its website: <https://quarkus.io/>.
This project is a derivative of [fc5-convert-cli](https://github.com/ebullient/fc5-convert-cli), which focused on working with FightClub5 Compendium XML files. It has also borrowed some bits and pieces from [pockets-cli](https://github.com/ebullient/pockets-cli).
[5eTools JSON]: https://wiki.tercept.net/en/Homebrew/FromZeroToHero
<a href="https://www.buymeacoffee.com/ebullient" target="_blank"><img src="https://cdn.buymeacoffee.com/buttons/v2/default-blue.png" alt="Buy Me A Coffee" style="height: 60px !important;width: 217px !important;"></a>
[^1]: Description of relative vs absolute file paths: <https://stackoverflow.com/a/10288252>. If you use a relative path, it will be resolved relative to the current working directory, as described here: <https://en.wikipedia.org/wiki/Working_directory>.
================================================
FILE: SECURITY.md
================================================
# Security Policy
I only support the latest version of the CLI. Given changes to source data, running/maintaining older versions isn't feasible.
## Reporting a Vulnerability
Please report suspected security issues privately using GitHub’s “Report a vulnerability” link in the repository sidebar.
Do **not** open a public issue for suspected vulnerabilities.
When reporting, please include:
- A description of the issue and affected versions
- Steps to reproduce (ideally a minimal proof-of-concept)
- Assessment of potential impact
- Your contact information
- Any specific requests, such as anonymity for you and/or the organization you represent
================================================
FILE: dco.txt
================================================
Developer Certificate of Origin
Version 1.1
Copyright (C) 2004, 2006 The Linux Foundation and its contributors.
1 Letterman Drive
Suite D4700
San Francisco, CA, 94129
Everyone is permitted to copy and distribute verbatim copies of this
license document, but changing it is not allowed.
Developer's Certificate of Origin 1.1
By making a contribution to this project, I certify that:
(a) The contribution was created in whole or in part by me and I
have the right to submit it under the open source license
indicated in the file; or
(b) The contribution is based upon previous work that, to the best
of my knowledge, is covered under an appropriate open source
license and I have the right under that license to submit that
work with modifications, whether created in whole or in part
by me, under the same open source license (unless I am
permitted to submit under a different license), as indicated
in the file; or
(c) The contribution was provided directly to me by some other
person who certified (a), (b) or (c) and I have not modified
it.
(d) I understand and agree that this project and the contribution
are public and that a record of the contribution (including all
personal information I submit with it, including my sign-off) is
maintained indefinitely and may be redistributed consistent with
this project or the open source license(s) involved.
================================================
FILE: docs/README.md
================================================
# Documentation
- [Other ways to run the CLI](./alternateRun.md)
- [Create a config file](./configuration.md)
- [Configuration Examples][ex-config]
- [Template Reference][templates]
- [Default templates][def-templates]
- [Example templates][ex-templates]
- [Source Map][]
[ex-ad]: ../examples/admonitions
[ex-config]: ../examples/config
[ex-templates]: ../examples/templates
[def-templates]: ../src/main/resources/templates
[templates]: ./templates/README.md
[Source Map]: ./sourceMap.md
## Recommended Obsidian plugin configuration
- [Admonitions](#admonitions)
- [Force note view mode by front matter](#force-note-view-mode-by-front-matter)
- [Fantasy Statblocks](#fantasy-statblocks)
- [Initiative Tracker](#initiative-tracker)
- [Working with Dataview](#working-with-dataview)
### Admonitions
The [Admonition plugin](https://github.com/javalent/admonitions) provides additional support for codeblock-style admonitions in addition to callouts.
Import one or more admonition json files in [examples/admonitions][ex-ad] to create the custom admonition types used for converted content:
- [admonitions-5e.json](../examples/admonitions/admonitions-5e.json) for 5e tools
- [admonitions-pf2e.json](../examples/admonitions/admonitions-pf2e-v3.json) for pf2e tools
- [other-admonitions.json](../examples/admonitions/other-admonitions.json) if they are interesting
### Force note view mode by front matter
Use this plugin to treat these generated notes as essentially read-only.
Ensure the plugin has the following options enabled (for the most consistent and least invasive experience):
- *"Ignore force view when not in front matter"*: the plugin will only change the view mode if `obsidianUIMode` is defined in the front matter.
- *"Ignore open files"*: the plugin won't try to change the view mode if the file is already open.
### Fantasy Statblocks
[Fantasy Statblocks](https://github.com/javalent/fantasy-statblocks) maintains a bestiary of monsters. It has its own (handlebars-based) templates for monster statblocks.
To populate *Fantasy Statblocks* from your notes, use the following settings:
- General Settings:
- *Optional*: Disable the 5e SRD
- Note Parsing:
- Enable Parse Frontmatter for Creatures
- *Optional*: Add bestiary folders to constrain where the plugin looks for monsters
You also need to generate content using [templates][5eTools templates] that will populate the bestiary.
### Initiative Tracker
The [Initiative Tracker](https://github.com/javalent/initiative-tracker) plugin for Obsidian allows you to keep track of initiative and turn order during combat encounters in tabletop role-playing games.
- Basic Settings
- *Optional*: Embed statblock-link content in the creature view.
Enable this if you use markdown statblocks and want to see the statblock content in the creature view.
`statblock-link` must be set in the frontmatter.
- Plugin Integrations
- *Optional*: Sync monsters from TTRPG Statblocks
Enable this if you use the Fantasy Statblocks plugin and want to sync monsters from your notes to the Initiative Tracker.
- See [Fantasy Statblocks](#fantasy-statblocks) section for recommended settings.
- Make sure you're using compatible [templates][5eTools templates] for your monsters.
[5eTools templates]: ../examples/templates/tools5e/README.md#5etools-alternate-monster-templates
### Working with Dataview
Notes use lower-kebab-case for filenames. While that works very well for data portability and avoiding
filename collisions, it doesn't look very pretty.
Dataview queries can create entries in tables that use the file's alias instead of the filename, like this:
```md
~~~dataview
TABLE without ID link(file.name, aliases) from "compendium/classes"
FLATTEN aliases
~~~
```
================================================
FILE: docs/alternateRun.md
================================================
# Other ways to run the CLI
- [Use JBang](#use-jbang)
- [Use Homebrew](#use-homebrew)
- [Use pre-built platform binary](#use-pre-built-platform-binary)
- [Use Java to run the jar](#use-java-to-run-the-jar)
- [Build and run from source](#build-and-run-from-source)
- [Using unreleased snapshots](#using-unreleased-snapshots)
[conventions]: ../README.md#conventions
[5etools-data]: ../README.md#convert-5etools-json-data
[pf2e-data]: ../README.md#convert-pf2etools-json-data
[homebrew]: ../README.md#convert-homebrew-json-data
[config]: ./configuration.md
[_unreleased snapshot_]: #using-unreleased-snapshots
[java_install]: https://adoptium.net/installation/
## Use JBang
JBang is a tool designed to simplify Java application execution. By eliminating the need for traditional build tools and app servers, JBang enables quick and easy running of Java apps, scripts, and more.
1. Install JBang: <https://www.jbang.dev/documentation/jbang/latest/installation.html>
2. Install the pre-built release of ttrpg-convert-cli:
```shell
jbang app install --name ttrpg-convert --force --fresh https://github.com/ebullient/ttrpg-convert-cli/releases/download/3.3.1/ttrpg-convert-cli-3.3.1-runner.jar
```
🚧 If you want the latest [_unreleased snapshot_][]:
```shell
jbang app install --name ttrpg-convert --force --fresh https://github.com/ebullient/ttrpg-convert-cli/releases/download/299-SNAPSHOT/ttrpg-convert-cli-299-SNAPSHOT-runner.jar
```
> 🔹 Feel free to use an alternate alias by replacing the value specified as the name.
> For example, for the snapshot, you can use `--name ttrpg-convert-ss`, allowing you to keep both versions available.
> You will need to adjust commands accordingly.
3. Verify the install by running the command:
```shell
ttrpg-convert --help
```
Notice there is no leading `./` or `.\`. JBang installs the command in a location that is on your PATH[^1].
Next steps:
- Understand [CLI plugin and usage conventions][conventions].
- [Convert 5eTools JSON data][5etools-data]
- [Convert PF2eTools JSON data][pf2e-data]
- [Convert Homebrew JSON data][homebrew]
- Create your own [configuration file][config].
## Use Homebrew
Not to be confused with Homebrew adventures, Homebrew is a package manager for Mac OS (and sometimes linux).
1. Install Homebrew: <https://brew.sh/>
2. Install the `tap`:
```shell
brew tap ebullient/tap
```
3. Install the cli:
```shell
brew install ttrpg-convert-cli
```
4. Verify the install by running the command (from anywhere):
```shell
ttrpg-convert --help
```
Notice there is no leading `./` or `.\`. Homebrew installs the command in a location that is on your PATH[^1].
Next steps:
- Understand [CLI plugin and usage conventions][conventions].
- [Convert 5eTools JSON data][5etools-data]
- [Convert PF2eTools JSON data][pf2e-data]
- [Convert Homebrew JSON data][homebrew]
- Create your own [configuration file][config].
### Use pre-built platform binary
> [!NOTE]
> 📝 *Where do these binaries come from?*
>
> They are built on GitHub managed CI runners using the workflow defined [here](https://github.com/ebullient/ttrpg-convert-cli/blob/main/.github/workflows/release.yml), which compiles a Quarkus application (Java) into a platform-native binary using [GraalVM](https://www.graalvm.org/). I build and upload the mac arm64 binary myself (not supported by GH CI) using [this script](https://github.com/ebullient/ttrpg-convert-cli/blob/main/.github/augment-release.sh).
[Download the latest release](https://github.com/ebullient/ttrpg-convert-cli/releases/latest) of the zip or tgz for your platform. Extract the archive. A `ttrpg-convert` binary executable will be in the extracted bin directory.
In a terminal or command shell, navigate to the directory where you extracted the archive and run the command in the `bin` directory:
```shell
# Linux or MacOS (use the leading ./ because the current directory is not in the PATH[^1])
./ttrpg-convert --help
# Windows (the .exe extension is optional)
ttrpg-convert.exe --help
```
Notes:
- Windows users: the `.exe` extension is optional. You can run `ttrpg-convert.exe` or `ttrpg-convert` interchangeably.
- Folks familar with command line tools can add the `bin` directory to their path to make the command available from anywhere.
- _MacOS permission checking_ (unverified executable): `xattr -r -d com.apple.quarantine <path/to>/ttrpg-convert`
Next steps:
- Understand [CLI plugin and usage conventions][conventions].
- [Convert 5eTools JSON data][5etools-data]
- [Convert PF2eTools JSON data][pf2e-data]
- [Convert Homebrew JSON data][homebrew]
- Create your own [configuration file][config].
## Use Java to run the jar
To run the CLI, you will need to have **Java 17** installed on your system.
1. Ensure you have [**Java 17** installed on your system][java_install] and active in your path.
2. Download the CLI as a jar
- Latest release: [ttrpg-convert-cli-3.3.1-runner.jar](https://github.com/ebullient/ttrpg-convert-cli/releases/download/3.3.1/ttrpg-convert-cli-3.3.1-runner.jar)
- 🚧 [_unreleased snapshot_][]: [ttrpg-convert-cli-399-SNAPSHOT-runner.jar](https://github.com/ebullient/ttrpg-convert-cli/releases/download/399-SNAPSHOT/ttrpg-convert-cli-399-SNAPSHOT-runner.jar)
3. Verify the install by running the command:
```shell
java -jar ttrpg-convert-cli-3.3.1-runner.jar --help
```
🚧 If you are using the [_unreleased snapshot_][], use the following command:
```shell
java -jar ttrpg-convert-cli-299-SNAPSHOT-runner.jar --help
```
To run commands, replace `ttrpg-convert` with `java -jar ttrpg-convert-cli-...`
Next steps:
- Understand [CLI plugin and usage conventions][conventions].
- [Convert 5eTools JSON data][5etools-data]
- [Convert PF2eTools JSON data][pf2e-data]
- [Convert Homebrew JSON data][homebrew]
- Create your own [configuration file][config].
> [!NOTE]
> Java 17 and Java 21 will work without issue.
> There are known issues with picocli and Java 24; avoid it.
## Build and run from source
This is a Quarkus project that uses Maven as its build tool.
- You can use the [Quarkus CLI](https://quarkus.io/guides/cli-tooling) to build and run the project
- You can use Maven to build and run the project via the [maven wrapper](https://maven.apache.org/wrapper/) (the `mvnw` script). The Maven Wrapper is a tool that provides a standardized way to execute Maven builds, ensuring the correct version and configurations are used.
1. Clone this repository
2. Ensure you have [**Java 17** installed on your system][java_install] and active in your path.
3. Build this project:
- Build with the Quarkus CLI: `quarkus build`
- Build with the Maven wrapper: `./mvnw install`
4. Verify the build: `java -jar target/ttrpg-convert-cli-299-SNAPSHOT-runner.jar --help`
To run commands, either:
- Replace `ttrpg-convert` with `java -jar target/ttrpg-convert-cli-299-SNAPSHOT-runner.jar`, or
- Use JBang to create an alias that points to the built jar:
```shell
jbang app install --name ttrpg-convert --force --fresh ~/.m2/repository/dev/ebullient/ttrpg-convert-cli/299-SNAPSHOT/ttrpg-convert-cli-299-SNAPSHOT-runner.jar
```
> 🔹 Use an alternate alias by replacing the value specified as the name: `--name ttrpg-convert`, and adjust the commands accordingly.
Next steps:
- Understand [CLI plugin and usage conventions][conventions].
- [Convert 5eTools JSON data][5etools-data]
- [Convert PF2eTools JSON data][pf2e-data]
- [Convert Homebrew JSON data][homebrew]
- Create your own [configuration file][config].
## Using unreleased snapshots
Folks picking up early snapshots is really helpful for me, but _using an unreleased snapshot may be unstable_.
- [Build from source](#build-and-run-from-source)
- [Use JBang to install the snapshot](#use-jbang)
- 🚧 Do not run an unstable CLI directly against notes in your Obsidian vault
- 👷♀️ Be prepared to report issues if you find them.
- Be as specific as you can about the configuration and sources that are not working.
- `ttrpg-convert --version` will tell you the version you are running, including the commit! Please include that information in your report.
I recommend staying with official releases unless you are willing to help me debug issues (and your help is very much appreciated!).
[^1]: A PATH is a list of directories that the operating system searches for executables. When you type a command in a terminal, the system looks in each directory in the path for an executable with the name you typed. If it finds one, it runs it. If it doesn't, it reports an error. See [Wikipedia](https://en.wikipedia.org/wiki/PATH_(variable)) for a rough overview and more links.
================================================
FILE: docs/configuration.md
================================================
# CLI Configuration guide
> [!IMPORTANT]
> 🚀 Respect copyrights and support content creators; use only the sources you own.
This guide introduces you to configuring data transformations using the Command Line Interface (CLI). Whether you're new to command line tools or an experienced user, you'll find helpful information on utilizing configuration files to tailor your experience.
<!-- markdownlint-disable-next-line no-emphasis-as-heading -->
**Table of Contents**
- [Overview](#overview)
- [Basic configuration example](#basic-configuration-example)
- [Advanced configuration example](#advanced-configuration-example)
- [Source identifiers](#source-identifiers)
- [Specify content with `sources`](#specify-content-with-sources)
- [Homebrew](#homebrew)
- [Additional notes about homebrew](#additional-notes-about-homebrew)
- [Reporting content errors to 5eTools](#reporting-content-errors-to-5etools)
- [Specify target vault paths (`paths`)](#specify-target-vault-paths-paths)
- [Refine content choices](#refine-content-choices)
- [Excluding content matching an `excludePattern`](#excluding-content-matching-an-excludepattern)
- [Excluding specific content with `exclude`](#excluding-specific-content-with-exclude)
- [Including specific content with `include`](#including-specific-content-with-include)
- [Reprint behavior](#reprint-behavior)
- [Troubleshooting reprint behavior](#troubleshooting-reprint-behavior)
- [Races as species](#races-as-species)
- [Only emit referenced tables](#only-emit-referenced-tables)
- [Use the dice roller plugin](#use-the-dice-roller-plugin)
- [Render with Fantasy Statblocks](#render-with-fantasy-statblocks)
- [Tag prefix](#tag-prefix)
- [Templates](#templates)
- [Customizing templates](#customizing-templates)
- [Images](#images)
- [Copying internal images](#copying-internal-images)
- [Copying external images](#copying-external-images)
- [Fallback paths](#fallback-paths)
- [Customizing the default source](#customizing-the-default-source)
- [Migrating `from`, `full-source`, and `convert`](#migrating-from-full-source-and-convert)
## Overview
The CLI can be set up using JSON or YAML files. These files allow you to specify your preferences and can be used alongside or in place of command-line options. For examples of configuration file structures in both formats, see [examples/config](../examples/config).
> [!NOTE]
> 📝 JSON and YAML are both file formats for storing data in useful and human-readable ways.
>
> - JSON: If you want to know why the `{}` and `[]` are used in the ways that they are you can read about json *objects* and *arrays* [here](https://www.toolsqa.com/rest-assured/what-is-json/)).
> - YAML: A format where indentation (spaces at the beginning of lines) is important. Learn about YAML's [specification](https://yaml.org/spec/1.2/spec.html).
The following examples are presented in JSON.
> [!IMPORTANT]
> Check your work! If you are getting errors reading your config file, *don't rely on your eyes,* **use a linter!**
>
> - JSON: <https://jsonlint.com/>
> - YAML: <https://www.yamllint.com/>
### Basic configuration example
Below is a straightforward `config.json` file. In this format, settings are noted in a `"key": "value"` structure.
``` json
{
"sources": {
"book": [
"DMG",
"PHB",
"MM"
]
},
"paths": {
"compendium": "z_compendium/",
"rules": "z_compendium/rules"
}
}
```
This example performs two basic functions:
1. **Select Input Sources:** The `sources` key lists the sources to be included, identified by their [source identifiers](#source-identifiers).
2. **Define Vault Paths:** The [`paths`](#specify-target-vault-paths-paths) key sets the destination paths for the `compendium` and `rules` content. These paths are relative to the output directory set in the CLI command with `-o`.
> [!WARNING]
> **Windows Users**: Replace any `\` with `/` in paths in JSON or YAML files
### Advanced configuration example
Here's a more comprehensive `config.json` file.
```json
{
"sources": {
"adventure": [
"LMoP",
"LoX"
],
"book": [
"PHB"
],
"reference": [
"AI",
"DMG",
"TCE",
"ESK",
"DIP",
"XGE",
"FTD",
"MM",
"MTF",
"VGM"
],
"homebrew": [
"homebrew/creature/MCDM Productions; Flee, Mortals!.json"
]
},
"paths": {
"rules": "/compendium/rules/"
},
"excludePattern": [
"race\\|.*\\|dmg"
],
"exclude": [
"monster|expert|dc",
"monster|expert|sdw",
"monster|expert|slw"
],
"include": [
"race|changeling|mpmm"
],
"reprintBehavior": "newest",
"useDiceRoller": true,
"tagPrefix": "ttrpg-cli",
"template": {
"background": "examples/templates/tools5e/images-background2md.txt",
"monster": "examples/templates/tools5e/monster2md-scores.txt"
}
}
```
Additional capabilities:
1. **Select input sources:** The [`sources`](#specify-content-with-sources) key is used to select included sources (full text from two adventures and a book, reference content from a slew of other official sources, and one [homebrew source](#homebrew)).
2. **Define Vault Paths:** The [`path`](#specify-target-vault-paths-paths) sets the vault path destination for `rules` content.
3. **Targeted exclusion:** [`excludePattern`](#excluding-content-matching-an-excludepattern) and [`exclude`](#excluding-specific-content-with-exclude) leaves out specific content.
4. **Targeted inclusion:** The [`include`](#including-specific-content-with-include) specifies content that is *always included*.
5. **[Reprint behavior](#reprint-behavior):** Only the latest/newest version of a resource should be emitted (this is the default).
6. **Use the dice roller plugin:** The [`useDiceRoller`](#use-the-dice-roller-plugin) key enables the dice roller plugin.
7. **Tag prefix:** The [`tagPrefix`](#tag-prefix) key sets the prefix for tags generated by the CLI.
8. **Templates:** The [`template`](#templates) key specifies the templates to use for different types of content.
> [!WARNING]
> **Windows Users**: Replace any `\` in your paths with '/' in your JSON and YAML files.
## Source identifiers
> 🚀 Remember: Only include content you legally own.
Sources in 5eTools and Pf2eTools are referenced by unique identifiers. Find the identifiers for your sources in the [Source Map](sourceMap.md).
Content is classified as a `book` or `adventure` (shown as the third column in the source map). Use this classification when [specifying your sources](#specify-content-with-sources).
Some sources are split into multiple files, in which case, you will need to specify each identifier separately. For example, *Tales from the Yawning Portal* is split into seven files. Content appears using any one of the seven (`TftYP-*`), in addition to `TftYP` for common content. If you want to include all of them, you will need to specify each identifier separately.
If you're expecting to see content from a book or adventure and it's not showing up, run the CLI with the `--index` option, and check the `all-index.json` file to see which source identifier you should be using.
## Specify content with `sources`
> 🔥 Version 3.x or SNAPSHOT ONLY. If you're using a 2.x version of the CLI, use [the legacy version](#migrating-from-full-source-and-convert)
The CLI can emit content from a source in two ways:
- "full text": notes for all content and reference data from your sources.
When including the full text, use the `book`, `adventure`, or `homebrew` key as appropriate for the source material.
- "reference only": only emit reference notes (spells, classes, etc.).
Use the `reference` key to include reference content from books or adventures.
With that in mind, specify your sources in this way:
```json
"sources": {
"adventure": [
"WBtW"
],
"book": [
"PHB"
],
"reference": [
"MPMM"
]
}
```
The above example that will include full text for the *Player's Handbook* (a book, PHB) and *The Wild Beyond the Witchlight* (an adventure, WBtW), but will only create reference notes (backgrounds, cults/boons, races, traps/hazards) from *Mordenkainen Presents: Monsters of the Multiverse* (MPMM).
> [!TIP]
> You only need to list your source once.
### Homebrew
> [!TIP]
> 🍺 *You only need the particular file you wish to import*.
>
> Homebrew data is different from the 5etools or Pf2eTools data. Each homebrew file is a complete reference. If you compare it to cooking: the 5etools and Pf2eTools mirror repositories are organized by ingredient (all of the carrots, all of the onions, ... ); homebrew data is organized by prepared meal / complete receipe.
>
> Support your content creators! Only use homebrew that you own.
To include Homebrew in your notes, specify the path to the homebrew json file in a `homebrew` section inside of `sources`.
For example, if you wanted to use Benjamin Huffman's popular homebrewed [Pugilist class](https://www.dmsguild.com/product/184921/The-Pugilist-Class):
1. Download a copy of the [Pugilist json file](https://github.com/TheGiddyLimit/homebrew/blob/master/class/Benjamin%20Huffman%3B%20Pugilist.json).
Save this file to a well-known location on your computer. It is probably easiest if it sits next your 5eTools or Pf2eTools directory.
2. Add the path to this file to a `homebrew` section under `sources`:
```json
{
"sources": {
"homebrew": [
"path/to/Benjamin Huffman; Pugilist.json"
]
}
}
```
In the above example, `path/to/` is a placeholder. If you use a relative path, it will be resolved relative to the current working directory[^1]. An absolute path[^2] will also work.
There are a few ways to figure out the path to a file:
- You may be able to drag and drop the file into the terminal window.
- You may have the ability to right-click on the file and select "Copy Path".
> [!WARNING]
> **Windows Users**: Replace any `\` with `/` in paths in JSON or YAML files
#### Additional notes about homebrew
Homebrew json files are not rigorously validated. There may be errors when importing.
I've done what I can to make the errors clear, or to highlight the suspect json, but I can't catch everything.
Here are some examples of what you may see, and how to fix them:
- `Unable to find image 'img/bestiary/MM/Green Hag.jpg'` (or similar)
This kind of path refers to an "internal" (meaning part of the base 5e corpus of stuff) image. These paths are computed relative to a known base.
Recent releases of 5eTools use a different repository structure, see [Copying "internal" images](#copying-internal-images)), and images have, by and large, been converted from `.jpg` or `.png` to `.webp`.
Fixing this kind of error is usually a case of fixing the path.
- If you can fix the link yourself (change to `.webp` and guess the new location by removing `img/`), please [report it in 5eTools #brew-conversion](#reporting-content-errors-to-5etools).
- If you can't find the image that should be used instead, please [ask for CLI help](../README.md#where-to-find-help)and we'll help you find the right one.
- `Unknown spell school Curse in sources[spell|ventus|wandsnwizards]`; similar for item types, item properties, conditions, skills, abilities, etc.
This kind of error could be caused by a missing companion file (check dependencies listed in the `meta` information at the top of the homebrew file) or a missing definition.
- If you find the missing definition (or it is already present in the homebrew file), and the error persists, please [ask for CLI help first](../README.md#where-to-find-help) so I can make sure there isn't a bug in the CLI preventing it from being read.
- If the data really is missing from the homebrew json, please [report it in 5eTools #brew-conversion](#reporting-content-errors-to-5etools).
- You may see messages about missing fields or badly formed tables.
- If you can fix the error by fixing the json content, please [report it in 5eTools #brew-conversion](#reporting-content-errors-to-5etools).
- If you can't fix the error yourself, please [ask for CLI help first](../README.md#where-to-find-help) so I can make sure there isn't a bug in the CLI.
### Reporting content errors to 5eTools
> [!NOTE]
> The lovely folks at 5eTools don't understand the CLI, and they don't need to. If you report an issue, keep the details focused on the JSON content (typo, missed definition, etc.). If you aren't sure, [ask for CLI help first](../README.md#where-to-find-help).
If you can fix the error by fixing the json content, please report the error in the 5eTools discord channel.
1. Identify the homebrew source that contains the error in the [homebrew manager](https://wiki.tercept.net/en/5eTools/HelpPages/managebrew).
2. Click the "View Converters" button on the right to find the converter(s).
3. Tag them in the [#brew-conversion](https://discord.com/channels/363680385336606740/493154206115430400) channel, describing what you fixed. If you can't find the right user to tag, or if no one is listed as a converter, post the report anyway but make sure you mention this!
Use the following form for your report.
```text
**Brew:** Write the name of the homebrew source here
**Converter:** @converter's-discord-ID
**Issue:** Describe the issue here in clear, concise terms (e.g. "the Red-Spotted Gurgler is listed as having AC 15, when it should be 16")
**Steps for reproduction:** If you have to do something specific to make the error appear, describe them here.
> I go to X and click on Y
> I expected Z, but instead ...
```
For that last part, you may need to do some digging. Do not report the error using CLI exception messages. Stick to the observed missing links or errors in the data.
## Specify target vault paths (`paths`)
The `paths` key specifies vault path for generated content.
- New directories are made if they aren't already present.
- Paths are relative to the CLI's designated output location (`-o`), which correlates to the root of your Obsidian vault.
**Example:**
```json
"paths": {
"compendium": "/compendium/",
"rules": "/rules/"
}
```
> [!TIP]
> The leading slash is optional. It marks a path starting from the root of your Obsidian vault.
5eTools and Pf2eTools content is organized differently, but in general, information is organized as follows:
- `compendium`: backgrounds, classes, items, spells, monsters, etc.
- `rules`: conditions, weapon properties, variant rules, etc.
> [!WARNING]
> Do not reorganize or edit the generated content. Tuck generated content away in your vault and use it as read-only reference material. It should be cheap and easy to re-run the tool (add more content, errata, etc.). See [Recommendations](../README.md#recommendations-for-using-the-cli) for more information.
## Refine content choices
You can use the following configuration to exclude or include specific data.
Just as source material has an identifier, so does each piece of data. The *Monster Manual* has the identifier `MM`. Each monster in the *Monster Manual* has its own key, such as `monster|black dragon wyrmling|mm` or `item|drow +1 armor|mm`.
The CLI `--index` option compiles two lists of data keys:
- `all-index.json`: Lists all discovered data keys.
- `src-index.json`: Lists the data keys after source filters (`adventure`, `book`, `reference`, and the config options below) have been applied.
> [!NOTE]
> **Emitted types**:
> You can check some common emitted types to include or exclude [here](#customizing-the-default-source).
### Excluding content matching an `excludePattern`
This option allows you to exclude data entries based on regular expression matching patterns.
Note: A pipe (`|`) is a special character in regular expressions, and must be escaped.
- JSON
```json
"excludePattern": [
"race\\|.*\\|dmg"
]
```
- YAML
```yaml
excludePattern:
- race\|.*\|dmg
```
### Excluding specific content with `exclude`
Specify the data keys you want to omit.
```json
"exclude": [
"monster|expert|dc",
...
]
```
### Including specific content with `include`
Specify the data keys you want to include.
```json
"include": [
"race|changeling|mpmm"
]
```
This approach is ideal for content acquired in parts, like individual items from D&D Beyond.
## Reprint behavior
> 🔥 Version 3.x or SNAPSHOT ONLY.
Content is often reprinted or updated in later sources or editions. This setting lets you control how reprinted or revised content is handled when generating notes.
``` json
"reprintBehavior": "newest"
```
This setting has 3 possible values:
- **`newest`** (default): Only includes notes for the most recent version of reprinted content.
- **`edition`**: Focuses on preserving content across incompatible editions (especially for 5e rules).
Example: The edition check will preserve 2014 edition-specific class and subclass definitions. Other resources (that are not different across editions) will follow the reprints to include new content.
- **`all`**: Includes notes for all reprinted versions from enabled sources
In most cases, you will get the most recent version of the resource that is included, as most resources do not have substantial changes across editions.
For example, `trap|pits|dmg` is reprinted as `trap|hidden pit|xdmg`. If both versions are included by your configuration, you will only get a note for the `XDMG` version unless `reprintBehavior` is set to `all` or you have an explicit include rule that preserves the `DMG` version (in which case, you'll get both).
### Troubleshooting reprint behavior
If the behavior isn’t what you expect, run with the --log option and check the log file.
The log will show whether a specific key was kept or dropped and explain why.
To ensure a specific resource is included, add its key to the [`include` filter](#including-specific-content-with-include) instead of relying on reprint behavior.
## Races as species
If you prefer the term "species" over "race" (as used in newer D&D editions), set `racesAsSpecies` to `true`.
``` json
"racesAsSpecies": true
```
This changes the output directory from `races/` to `species/`, tags from `race/...` to `species/...`, and the CSS class from `json5e-race` to `json5e-species`. It does not affect internal indexing or source data processing.
## Only emit referenced tables
By default, the CLI emits all table notes from included sources. Set `onlyReferencedTables` to `true` to restrict output to tables that are actually linked from other included content (monsters, spells, adventures, etc.).
``` json
"onlyReferencedTables": true
```
When enabled, a table note is written only if:
- something in the rendered output links to it (via a `{@table}` tag or inline table matching), **or**
- it is explicitly named in an [`include` filter](#including-specific-content-with-include).
Unreferenced tables are logged as `(drop | unreferenced)` when run with `--log`.
## Use the dice roller plugin
The CLI can generate notes that include inline dice rolls. To enable this feature, set the `useDiceRoller` attribute to `true`.
## Render with Fantasy Statblocks
If you are using the Fantasy Statblocks plugin to render your statblocks, set `yamlStatblocks` to `true`. This will remove backticks and other formatting from statblock text.
## Tag prefix
The `tagPrefix` key sets the prefix for tags generated by the CLI. This is useful if you want to distinguish between tags generated by the CLI and tags you've created yourself.
For example, the CLI generates tags like `compendium/src/phb` and `spell/level/1`. If you set `tagPrefix` to `5e-cli`, the tags will be `5e-cli/compendium/src/phb` and `5e-cli/spell/level/1`.
## Templates
The CLI uses the [Qute Templating Engine](https://quarkus.io/guides/qute) to render markdown output. Use the `template` attribute in your configuration file to specify the templates you want to use for different types of content.
``` json
"template": {
"background": "examples/templates/tools5e/images-background2md.txt",
"monster": "examples/templates/tools5e/monster2md-scores.txt"
}
```
- **Default templates** are included in the `-examples.zip` file from the release, or can be viewed in the [src/main/resources/templates](../src/main/resources/templates) directory.
- **Additional templates** are available in the [examples/templates](../examples/templates) directory.
> [!TIP] The key used to specify a template corresponds to the type of template being used. You can find the list of valid template keys in the [source code](../src/main/resources/convertData.json) (look for `templateKeys`).
- Valid templates for 5etools: `background`, `class`, `deck`, `deity`, `feat`, `hazard`, `index.txt`, `item`, `monster`, `note`, `object`, `psionic`, `race`, `reward`, `spell`, `subclass`, `vehicle`.
- Valid templates for Pf2eTools: `ability`, `action`, `affliction`, `archetype`, `background`, `book`, `deity`, `feat`, `hazard`, `inline-ability`, `inline-affliction`, `inline-attack`, `item`, `note`, `ritual`, `spell`, `trait`.
### Customizing templates
Documentation is generated for [**template attributes**](./templates/).
Not everything is customizable. Some indenting, organizing, formatting, and linking is easier to do consistently while rendering big blobs of text.
See the [examples templates](../examples/templates) for reference.
## Images
The CLI can copy images referenced in the content to your vault. This is useful if you want to use the content offline or if you want to ensure that images are available in your vault.
- Internal images are part of the 5eTools or Pf2e tools corpus of content. They are referenced by computed path (like tokens) or by media references marked as "internal".
- "External" images are usually marked in the Json source as "external" and are referenced by a URL.
### Copying internal images
5eTools internal images are stored in a separate repository.
**By default, images are not downloaded**. Links reference the remote location, requiring internet access to view. This is the safest, fastest option.
To copy internal images into your vault:
- **Option 1: Download on demand**
```json
"images": {
"copyInternal": true
}
```
The CLI downloads each image individually as needed. This is many separate requests and may be slow.
- **Option 2: Use a local clone (faster)**
```json
"images": {
"copyInternal": true,
"internalRoot": "5etools-img"
}
```
The CLI reads images from a local directory. Relative paths resolve from the current working directory[^1]; absolute paths[^2] also work. You'll get an error if the directory doesn't exist.
> [!NOTE]
> If not copying images, delete both `copyInternal` and `internalRoot` attributes.
>
> If using `internalRoot`, ensure the path exists. `http` or `file` URLs work best; otherwise the CLI creates a `file` link from the specified path.
>
> Without copying, images must be accessible from your vault to display in Obsidian.
### Copying external images
External images are marked as "external" in the JSON source and typically use `http://`, `https://`, or `file://`[^3] URLs.
**By default, external images are not downloaded**. Links reference the remote location, requiring internet access to view. This is the safest, fastest option.
To copy external images into your vault:
```json
"images": {
"copyExternal": true
}
```
The CLI will download each external image it hasn't seen before.
### Fallback paths
🧪 Experimental feature. Report issues if problems occur.
If an image reference is broken or fails to copy, you can specify a fallback path:
```json
"images": {
"fallbackPaths": {
"img/bestiary/MM/Green Hag.jpg": "img/bestiary/MM/Green Hag.webp"
}
}
```
- **Key** (original path): Must match exactly what the JSON source specifies. For external/homebrew images, check the JSON source. Internal images may be harder to identify.
- **Value** (replacement path): Must be a valid local file path[^2] or URL[^3].
## Customizing the default source
> [!WARNING]
> 🔥 You can truly make a mess with this setting.
> Change these values with care, and inspect the result carefully in a test vault.
>
> - This will change generated file names. It will break links.
> - If you have content generated with a different defaultSource configuration,
> completely remove it before copying freshly generated content into your vault ^[You could also use something like rsync that will remove extraneous files].
If you're only running 5e 2024 content (as an example), you may want to change the "default" source for items, etc. to be XPHB or XDMG or XMM, such that those files do not have the additional notations (e.g. the file name suffix, or the additional source designation in the monster name).
Change the default source for an index type in the `sources` block:
```json
"sources": {
"defaultSource": {
"monster": "XMM"
}
}
```
Create a map of a content type to the default source. In general, this is the same key you would use to assign a template. If you open up the [generated index](#source-identifiers), the first segment of a key is its type, for example, `trap|collapsing roof|dmg` is a `trap`. Some types are grouped because of tight inter-relationships, like cards and decks.
| Emitted type | Default Source | Includes (note) |
|-----------------------|----------------|----------|
| background | PHB | |
| classtype | PHB | subclass, class feature, subclass feature |
| deck | DMG | card |
| deity | PHB | |
| disease | DMG | |
| facility | XDMG | (bastion) |
| feat | PHB | |
| item | DMG | item group, magic variant |
| monster | MM | legendary group (bestiary) |
| object | DMG | |
| optfeature | PHB | |
| psionic | UATheMysticClass | |
| race | PHB | subrace (species) |
| reward | DMG | |
| spell | PHB | |
| table | DMG | table group |
| trap | DMG | hazard |
| variantrule | DMG | |
| vehicle | GoS | |
## Migrating `from`, `full-source`, and `convert`
Older configurations looked a little different. Updating to the new format should be straightforward.
For comparison, the following examples of older configurations use the same values as the [example above](#specify-content-with-sources).
```json
"from": [
"MPMM"
],
"full-source": {
"adventure": [
"WBtW"
],
"book": [
"PHB"
],
"homebrew": [
...
]
}
```
OR
```json
"from": [
"MPMM"
],
"convert": {
"adventure": [
"WBtW"
],
"book": [
"PHB"
],
"homebrew": [
...
]
}
```
[^1]: The working directory is the directory you were in (in the terminal) when you launched the CLI. See <https://en.wikipedia.org/wiki/Working_directory> for more information
[^2]: Example/explanation of absolute vs. relative path: <https://stackoverflow.com/a/10288252>. If you're using relative paths with the CLI, they should be relative to the working directory (see [^1]).
[^3]: A URL is a uniform resource locator, more information at <https://en.wikipedia.org/wiki/URL>.
================================================
FILE: docs/sourceMap.md
================================================
# Source mapping
- [5etools](#source-name-mapping-for-5etools)
- [Pf2eTools](#source-name-mapping-for-pf2etools)
Here is the name/abbreviation mapping for source materials.
_Support content creators. Only use or include sources that you own._
## Source name mapping for 5etools
- **2014** (sources/reference): "srd", "basicrules"
- **2024** (sources/reference): "srd52", "basicRules2024"
### 5eTools Abbreviations to long name
| Abbreviation | Long name | Type |
|--------------|-----------|-------|
| AAG | Astral Adventurer's Guide | book |
| AATM | Adventure Atlas: The Mortuary | book |
| ABH | Astarion's Book of Hungers | book |
| AI | Acquisitions Incorporated | book |
| AL | Adventurers' League | book |
| ALCoS | Adventurers League: Curse of Strahd | reference |
| ALEE | Adventurers League: Elemental Evil | reference |
| ALRoD | Adventurers League: Rage of Demons | reference |
| AWM | Adventure with Muk | book |
| AZfyT | A Zib for your Thoughts | adventure |
| AitFR | Adventures in the Forgotten Realms | reference |
| AitFR-AVT | Adventures in the Forgotten Realms: A Verdant Tomb | adventure |
| AitFR-DN | Adventures in the Forgotten Realms: Deepest Night | adventure |
| AitFR-FCD | Adventures in the Forgotten Realms: From Cyan Depths | adventure |
| AitFR-ISF | Adventures in the Forgotten Realms: In Scarlet Flames | adventure |
| AitFR-THP | Adventures in the Forgotten Realms: The Hidden Page | adventure |
| BAM | Boo's Astral Menagerie | book |
| BGDIA | Baldur's Gate: Descent Into Avernus | adventure |
| BGG | Bigby Presents: Glory of the Giants | book |
| BMT | The Book of Many Things | book |
| BQGT | Borderlands Quest: Goblin Trouble | adventure |
| CM | Candlekeep Mysteries | adventure |
| CRCotN | Critical Role: Call of the Netherdeep | adventure |
| CaBoMP | Crochet: A Book of Many Patterns | book |
| CoA | Chains of Asmodeus | adventure |
| CoS | Curse of Strahd | adventure |
| DC | Divine Contention | adventure |
| DD | Dangerous Designs | adventure |
| DIP | Dragon of Icespire Peak | adventure |
| DMG | Dungeon Master's Guide | book |
| DMTCRG | The Deck of Many Things: Card Reference Guide | book |
| DSotDQ | Dragonlance: Shadow of the Dragon Queen | adventure |
| DitLCoT | Descent into the Lost Caverns of Tsojcanth | adventure |
| DoD | Domains of Delight | book |
| DoDk | Dungeons of Drakkenheim | reference |
| DoSI | Dragons of Stormwreck Isle | adventure |
| DrDe | Dragon Delves | reference |
| DrDe-ACfaS | A Copper for a Song | adventure |
| DrDe-BD | A Copper for a Song | adventure |
| DrDe-BtS | Before the Storm | adventure |
| DrDe-DaS | Death at Sunset | adventure |
| DrDe-DotSC | Dragons of the Sandstone City | adventure |
| DrDe-FWtVC | For Whom the Void Calls | adventure |
| DrDe-SD | Shivering Death | adventure |
| DrDe-TDoN | The Dragon of Najkir | adventure |
| DrDe-TFV | The Forbidden Vale | adventure |
| DrDe-TWoO | The Will of Orcus | adventure |
| EEPC | Elemental Evil Player's Companion | reference |
| EET | Elemental Evil: Trinkets | reference |
| EFA | Eberron: Forge of the Artificer | book |
| EFR | Eberron: Forgotten Relics | adventure |
| EGW | Explorer's Guide to Wildemount | book |
| EGW_DD | Dangerous Designs | reference |
| EGW_FS | Frozen Sick | reference |
| EGW_ToR | Tide of Retribution | reference |
| EGW_US | Unwelcome Spirits | reference |
| ERLW | Eberron: Rising from the Last War | book |
| ESK | Essentials Kit | reference |
| FFotR | Fated Flight of the Recluse | adventure |
| FRAiF | Forgotten Realms: Adventures in Faerûn | book |
| FRAiF-TLLoL | Forgotten Realms: The Lost Library of Lethchauntos | adventure |
| FRHoF | Forgotten Realms: Heroes of Faerûn | book |
| FS | Frozen Sick | adventure |
| FTD | Fizban's Treasury of Dragons | book |
| GGR | Guildmasters' Guide to Ravnica | book |
| GHLoE | Grim Hollow: Lairs of Etharis | reference |
| GoS | Ghosts of Saltmarsh | adventure |
| GotSF | Giants of the Star Forge | adventure |
| HAT-LMI | Honor Among Thieves: Legendary Magic Items | reference |
| HAT-TG | Honor Among Thieves: Thieves' Gallery | book |
| HBTD | Hold Back The Dead | adventure |
| HF | Heroes' Feast | book |
| HFDoMM | Heroes' Feast: The Deck of Many Morsels | reference |
| HFFotM | Heroes' Feast Flavors of the Multiverse | book |
| HFStCM | Heroes' Feast: Saving the Children's Menu | adventure |
| HWAitW | Humblewood: Adventure in the Wood | reference |
| HWCS | Humblewood Campaign Setting | reference |
| HftT | Hunt for the Thessalhydra | adventure |
| HoL | The House of Lament | adventure |
| HotB | Heroes of the Borderlands | adventure |
| HotDQ | Hoard of the Dragon Queen | adventure |
| IDRotF | Icewind Dale: Rime of the Frostmaiden | adventure |
| IMR | Infernal Machine Rebuild | adventure |
| JttRC | Journeys through the Radiant Citadel | adventure |
| KKW | Krenko's Way | adventure |
| KftGV | Keys from the Golden Vault | adventure |
| LFL | Lorwyn: First Light | book |
| LK | Lightning Keep | adventure |
| LLK | Lost Laboratory of Kwalish | adventure |
| LMoP | Lost Mine of Phandelver | adventure |
| LR | Locathah Rising | adventure |
| LRDT | Red Dragon's Tale: A LEGO Adventure | adventure |
| LoX | Light of Xaryxis | adventure |
| MCV1SC | Monstrous Compendium Volume 1: Spelljammer Creatures | reference |
| MCV2DC | Monstrous Compendium Volume 2: Dragonlance Creatures | reference |
| MCV3MC | Monstrous Compendium Volume 3: Minecraft Creatures | reference |
| MCV4EC | Monstrous Compendium Volume 4: Eldraine Creatures | book |
| MFF | Mordenkainen's Fiendish Folio | reference |
| MGELFT | Muk's Guide To Everything He Learned From Tasha | book |
| MM | Monster Manual | book |
| MOT | Mythic Odysseys of Theros | book |
| MPMM | Mordenkainen Presents: Monsters of the Multiverse | book |
| MPP | Morte's Planar Parade | book |
| MTF | Mordenkainen's Tome of Foes | book |
| MaBJoV | Minsc and Boo's Journal of Villainy | book |
| MisMV1 | Misplaced Monsters: Volume 1 | reference |
| NF | Netheril's Fall | book |
| NRH | NERDS Restoring Harmony | reference |
| NRH-ASS | NERDS Restoring Harmony: A Sticky Situation | adventure |
| NRH-AT | NERDS Restoring Harmony: Adventure Together | adventure |
| NRH-AVitW | NERDS Restoring Harmony: A Voice in the Wilderness | adventure |
| NRH-AWoL | NERDS Restoring Harmony: A Web of Lies | adventure |
| NRH-CoI | NERDS Restoring Harmony: Circus of Illusions | adventure |
| NRH-TCMC | NERDS Restoring Harmony: The Candy Mountain Caper | adventure |
| NRH-TLT | NERDS Restoring Harmony: The Lost Tomb | adventure |
| OGA | One Grung Above | book |
| OoW | The Orrery of the Wanderer | adventure |
| OotA | Out of the Abyss | adventure |
| PHB | Player's Handbook | book |
| PSA | Plane Shift: Amonkhet | reference |
| PSD | Plane Shift: Dominaria | reference |
| PSI | Plane Shift: Innistrad | reference |
| PSK | Plane Shift: Kaladesh | reference |
| PSX | Plane Shift: Ixalan | reference |
| PSZ | Plane Shift: Zendikar | reference |
| PaBTSO | Phandelver and Below: The Shattered Obelisk | adventure |
| PaF | Puncheons and Flagons | book |
| PiP | Peril in Pinegrove | adventure |
| PotA | Princes of the Apocalypse | adventure |
| QftIS | Quests from the Infinite Staircase | adventure |
| RMBRE | The Lost Dungeon of Rickedness: Big Rick Energy | adventure |
| RMR | Dungeons & Dragons vs. Rick and Morty: Basic Rules | book |
| RoT | The Rise of Tiamat | adventure |
| RoTOS | The Rise of Tiamat Online Supplement | reference |
| RtG | Return to Glory | adventure |
| SAC | Sage Advice Compendium | book |
| SADS | Sapphire Anniversary Dice Set | reference |
| SAiS | Spelljammer: Adventures in Space | reference |
| SCAG | Sword Coast Adventurer's Guide | book |
| SCC | Strixhaven: A Curriculum of Chaos | book |
| SCC-ARiR | A Reckoning in Ruins | adventure |
| SCC-CK | Campus Kerfuffle | adventure |
| SCC-HfMT | Hunt for Mage Tower | adventure |
| SCC-TMM | The Magister's Masquerade | adventure |
| SCREEN | Dungeon Master's Screen | reference |
| SCREEN_DUNGEON_KIT | Dungeon Master's Screen: Dungeon Kit | reference |
| SCREEN_SPELLJAMMER | Dungeon Master's Screen: Spelljammer | reference |
| SCREEN_WILDERNESS_KIT | Dungeon Master's Screen: Wilderness Kit | reference |
| SDW | Sleeping Dragon's Wake | adventure |
| SKT | Storm King's Thunder | adventure |
| SLW | Storm Lord's Wrath | adventure |
| SatO | Sigil and the Outlands | book |
| ScoEE | Scions of Elemental Evil | adventure |
| SjA | Spelljammer Academy | adventure |
| TCE | Tasha's Cauldron of Everything | book |
| TD | Tarot Deck | book |
| TLK | The Lost Kenku | adventure |
| TTP | The Tortle Package | adventure |
| TftYP | Tales from the Yawning Portal | reference |
| TftYP-AtG | Tales from the Yawning Portal: Against the Giants | adventure |
| TftYP-DiT | Tales from the Yawning Portal: Dead in Thay | adventure |
| TftYP-TFoF | Tales from the Yawning Portal: The Forge of Fury | adventure |
| TftYP-THSoT | Tales from the Yawning Portal: The Hidden Shrine of Tamoachan | adventure |
| TftYP-TSC | Tales from the Yawning Portal: The Sunless Citadel | adventure |
| TftYP-ToH | Tales from the Yawning Portal: Tomb of Horrors | adventure |
| TftYP-WPM | Tales from the Yawning Portal: White Plume Mountain | adventure |
| ToA | Tomb of Annihilation | adventure |
| ToB1-2023 | Tome of Beasts 1 (2023 Edition) | reference |
| ToD | Tyranny of Dragons | reference |
| ToFW | Turn of Fortune's Wheel | adventure |
| ToR | Tide of Retribution | adventure |
| UATMC | Unearthed Arcana: The Mystic Class | reference |
| US | Unwelcome Spirits | adventure |
| UtHftLH | Uni and the Hunt for the Lost Horn | adventure |
| VD | Vecna Dossier | reference |
| VEoR | Vecna: Eve of Ruin | adventure |
| VGM | Volo's Guide to Monsters | book |
| VNotEE | Vecna: Nest of the Eldritch Eye | adventure |
| VRGR | Van Richten's Guide to Ravenloft | book |
| WBtW | The Wild Beyond the Witchlight | adventure |
| WDH | Waterdeep: Dragon Heist | adventure |
| WDMM | Waterdeep: Dungeon of the Mad Mage | adventure |
| WttHC | Stranger Things: Welcome to the Hellfire Club | adventure |
| XDMG | Dungeon Master's Guide (2024) | book |
| XGE | Xanathar's Guide to Everything | book |
| XMM | Monster Manual (2024) | book |
| XMtS | X Marks the Spot | adventure |
| XPHB | Player's Handbook (2024) | book |
| XSAC | Sage Advice Compendium (2025) | book |
| XScreen | Dungeon Master's Screen (2024) | book |
### 5eTools Alternate abbreviation mapping
You may see these abbreviations referenced in source material, this is how they map to sources listed above.
| Abbreviation | Alias |
|--------------|-----------|
| ALCurseOfStrahd | ALCoS |
| ALElementalEvil | ALEE |
| ALRageOfDemons | ALRoD |
| HEROES_FEAST | HF |
| PS-A | PSA |
| PS-D | PSD |
| PS-I | PSI |
| PS-K | PSK |
| PS-X | PSX |
| PS-Z | PSZ |
| SCC_ARiR | SCC-ARir |
| SCC_CK | SCC-CK |
| SCC_HfMT | SCC-HfMT |
| SCC_TMM | SCC-TMM |
| Screen | SCREEN |
| ScreenDungeonKit | SCREEN_DUNGEON_KIT |
| ScreenSpelljammer | SRC_SCREEN_SPELLJAMMER |
| ScreenWildernessKit | SCREEN_WILDERNESS_KIT |
| TYP | TftYP |
| TYP_AtG | TftYP-AtG |
| TYP_DiT | TftYP-DiT |
| TYP_TFoF | TftYP-TFoF |
| TYP_THSoT | TftYP-THSoT |
| TYP_TSC | TftYP-TSC |
| TYP_ToH | TftYP-ToHs |
| TYP_WPM | TftYP-WPM |
| UATheMysticClass | UATMC |
| freeRules2024 | basicRules2024 |
## Source name mapping for Pf2eTools
### Pf2eTools Abbreviations to long name
| Abbreviation | Long name |
|--------------|-----------|
| 7DfS0 | Seven Dooms for Sandpoint Player's Guide |
| AAWS | Azarketi Ancestry Web Supplement |
| AFFM | A Few Flowers More |
| AFoF | A Fistful of Flowers |
| APG | Advanced Player's Guide |
| AV0 | Abomination Vaults Player's Guide |
| AV1 | Abomination Vaults #1: Ruins of Gauntlight |
| AV2 | Abomination Vaults #2: Hands of the Devil |
| AV3 | Abomination Vaults #3: Eyes of Empty Death |
| AVH | Abomination Vaults Hardcover |
| AoA0 | Age of Ashes Player's Guide |
| AoA1 | Age of Ashes #1: Hellknight Hill |
| AoA2 | Age of Ashes #2: Cult of Cinders |
| AoA3 | Age of Ashes #3: Tomorrow Must Burn |
| AoA4 | Age of Ashes #4: Fires of the Haunted City |
| AoA5 | Age of Ashes #5: Against the Scarlet Triad |
| AoA6 | Age of Ashes #6: Broken Promises |
| AoE0 | Agents of Edgewatch Player's Guide |
| AoE1 | Agents of Edgewatch #1: Devil at the Dreaming Palace |
| AoE2 | Agents of Edgewatch #2: Sixty Feet Under |
| AoE3 | Agents of Edgewatch #3: All or Nothing |
| AoE4 | Agents of Edgewatch #4: Assault on Hunting Lodge Seven |
| AoE5 | Agents of Edgewatch #5: Belly of the Black Whale |
| AoE6 | Agents of Edgewatch #6: Ruins of the Radiant Siege |
| B1 | Bestiary |
| B2 | Bestiary 2 |
| B3 | Bestiary 3 |
| BB | Beginner Box |
| BL0 | Blood Lords Player's Guide |
| BL1 | Blood Lords #1: Zombie Feast |
| BL2 | Blood Lords #2: Graveclaw |
| BL3 | Blood Lords #3: Field of Maidens |
| BL4 | Blood Lords #4: The Ghouls Hunger |
| BL5 | Blood Lords #5: A Taste of Ashes |
| BL6 | Blood Lords #6: Ghost King's Rage |
| BotD | Book of the Dead |
| CC0 | Curtain Call Player's Guide |
| CFD | Critical Fumble Deck |
| CHD | Critical Hit Deck |
| CRB | Core Rulebook |
| CotT | Claws of the Tyrant |
| DA | Dark Archive |
| DaLl | Dinner at Lionlodge |
| EC0 | Extinction Curse Player's Guide |
| EC1 | Extinction Curse #1: The Show Must Go On |
| EC2 | Extinction Curse #2: Legacy of the Lost God |
| EC3 | Extinction Curse #3: Life's Long Shadows |
| EC4 | Extinction Curse #4: Siege of the Dinosaurs |
| EC5 | Extinction Curse #5: Lord of the Black Sands |
| EC6 | Extinction Curse #6: The Apocalypse Prophet |
| FRP0 | Fists of the Ruby Phoenix Player's Guide |
| FRP1 | Fists of the Ruby Phoenix #1: Despair on Danger Island |
| FRP2 | Fists of the Ruby Phoenix #2: Ready? Fight! |
| FRP3 | Fists of the Ruby Phoenix #3: King of the Mountain |
| FoP | The Fall of Plaguestone |
| G&G | Guns & Gears |
| GMG | Gamemastery Guide |
| GW0 | Gatewalkers Player's Guide |
| GW1 | Gatewalkers #1: The Seventh Arch |
| GW2 | Gatewalkers #2: They Watched the Stars |
| GW3 | Gatewalkers #3: Dreamers of the Nameless Spires |
| HPD | Hero Point Deck |
| HStR | Head-Shot the Rot |
| HotW | Howl of the Wild |
| LOACLO | Lost Omens: Absalom, City of Lost Omens |
| LOAG | Lost Omens: Ancestry Guide |
| LOCG | Lost Omens: Character Guide |
| LODM | Lost Omens: Divine Mysteries |
| LOGM | Lost Omens: Gods & Magic |
| LOGMWS | Lost Omens: Gods & Magic Web Supplement |
| LOHh | Lost Omens: Highhelm |
| LOIL | Lost Omens: Impossible Lands |
| LOKL | Lost Omens: Knights of Lastwall |
| LOL | Lost Omens: Legends |
| LOME | Lost Omens: The Mwangi Expanse |
| LOMM | Lost Omens: Monsters of Myth |
| LOPSG | Lost Omens: Pathfinder Society Guide |
| LORA | Lost Omens: Rival Academies |
| LOSK | Lost Omens: Shining Kingdoms |
| LOTG | Lost Omens: Travel Guide |
| LOTGB | Lost Omens: The Grand Bazaar |
| LOTXWG | Lost Omens: Tian Xia World Guide |
| LOWG | Lost Omens: World Guide |
| LTiBA | Little Trouble in Big Absalom |
| MS0 | Myth-Speaker Player's Guide |
| Mal | Malevolence |
| MotM | Mark of the Mantis |
| NGD | Night of the Gray Death |
| OoA0 | Outlaws of Alkenstar Player's Guide |
| OoA1 | Outlaws of Alkenstar #1: Punks in a Powder Keg |
| OoA2 | Outlaws of Alkenstar #2: Cradle of Quartz |
| OoA3 | Outlaws of Alkenstar #3: The Smoking Gun |
| PC1 | Player Core |
| PC2 | Player Core 2 |
| PFUM | PATHFINDER: FUMBUS! |
| POS1 | Pathfinder One-Shot: Sundered Waves |
| QFF0 | Quest for the Frozen Flame Player's Guide |
| QFF1 | Quest for the Frozen Flame #1: Broken Tusk Moon |
| QFF2 | Quest for the Frozen Flame #2: Lost Mammoth Valley |
| QFF3 | Quest for the Frozen Flame #3: Burning Tundra |
| RoE | Rage of Elements |
| RotR0 | Revenge of the Runelords Player's Guide |
| Rust | Rusthenge |
| SF0 | Stolen Fate Player's Guide |
| SF1 | Stolen Fate #1: The Choosing |
| SF2 | Stolen Fate #2: The Destiny War |
| SF3 | Stolen Fate #3: Worst of All Possible Worlds |
| SKT0 | Sky King's Tomb Player's Guide |
| SW0 | Spore War Player's Guide |
| SaS | Shadows at Sundown |
| Sli | The Slithering |
| SoB0 | Shades of Blood Player's Guide |
| SoG0 | Season of Ghosts Player's Guide |
| SoG1 | Season of Ghosts #1: The Summer That Never Was |
| SoG2 | Season of Ghosts #2: Let the Leaves Fall |
| SoG3 | Season of Ghosts #3: No Breath to Cry |
| SoG4 | Season of Ghosts #4: To Bloom Below the Web |
| SoM | Secrets of Magic |
| SoT0 | Strength of Thousands Player's Guide |
| SoT1 | Strength of Thousands #1: Kindled Magic |
| SoT2 | Strength of Thousands #2: Spoken on the Song Wind |
| SoT3 | Strength of Thousands #3: Hurricane's Howl |
| SoT4 | Strength of Thousands #4: Secrets of the Temple-City |
| SoT5 | Strength of Thousands #5: Doorway to the Red Star |
| SoT6 | Strength of Thousands #6: Shadows of the Ancients |
| TEC | The Enmity Cycle |
| TV | Treasure Vault |
| TaL | Torment and Legacy |
| TiO | Troubles in Otari |
| ToK | Threshold of Knowledge |
| TotT0 | Triumph of the Tusk Player's Guide |
| WoI | War of Immortals |
| WoW0 | Wardens of Wildwood Player's Guide |
| WoW1 | Wardens of Wildwood #1: Pactbreaker |
| WoW2 | Wardens of Wildwood #2: Severed at the Root |
| WoW3 | Wardens of Wildwood #3: Shepherd of Decay |
| WtD1 | Wake the Dead #1 |
| WtD2 | Wake the Dead #2 |
| WtD3 | Wake the Dead #3 |
| WtD4 | Wake the Dead #4 |
| WtD5 | Wake the Dead #5 |
### Pf2eTools Alternate abbreviation mapping
You may see these abbreviations referenced in source material, this is how they map to sources listed above.
| Abbreviation | Alias |
|--------------|-----------|
| GnG | G&G |
================================================
FILE: docs/templates/ImageRef.md
================================================
# ImageRef
Create links to referenced images.
The general form of a markdown image link is: ``.
You can also use anchors to position the image within the page,
which creates links that look like this: ``.
## Anchor Tags
Anchor tags are used to position images within a page and are styled with CSS. Examples:
- `center` centers the image and constrains its height.
- `gallery` constrains images within a gallery callout.
- `portrait` floats an image to the right.
- `symbol` floats Deity symbols to the right.
- `token` is a smaller image, also floated to the right. Used in statblocks.
## Attributes
[embeddedLink](#embeddedlink), [shortTitle](#shorttitle), [title](#title), [vaultPath](#vaultpath)
### embeddedLink
Return an embedded markdown link to the image, using an optional
anchor tag to position the image in the page.
For example: `{resource.image.getEmbeddedLink("symbol")}`
If the title is longer than 50 characters:
``,
If the title is 50 characters or less:
``,
Links will be generated using "center" as the anchor by default.
### shortTitle
A shortened image title (max 50 characters) for use in markdown links.
### title
Descriptive title (or caption) for the image. This can be long.
### vaultPath
Path of the image in the vault or url for external images.
================================================
FILE: docs/templates/NamedText.md
================================================
# NamedText
Holder of a name or category and associated descriptive text.
This attribute will render itself as labeled elements if you reference it directly.
## Attributes
[category](#category), [desc](#desc), [key](#key), [name](#name), [nested](#nested), [text](#text), [value](#value)
### category
Alternate accessor for the name
### desc
Pre-formatted text description including all nested items
### key
Alternate accessor for the name
### name
Name
### nested
List of child elements (mostly for YAML)
### text
Alternate accessor for formatted/descriptive text
### value
Alternate accessor for formatted/descriptive text
================================================
FILE: docs/templates/QuteAltNames.md
================================================
# QuteAltNames
## Attributes
[altNames](#altnames)
### altNames
Alternate names. (optional)
================================================
FILE: docs/templates/QuteBase.md
================================================
# QuteBase
Defines attributes inherited by other Qute templates.
Notes created from `QuteBase` (or a derivative) will use a specific template
for the type. For example, `QuteBackground` will use `background2md.txt`.
## Attributes
[books](#books), [getAliases](#getaliases), [hasSections](#hassections), [labeledSource](#labeledsource), [name](#name), [reprintOf](#reprintof), [source](#source), [sourceAndPage](#sourceandpage), [sourcesWithFootnote](#sourceswithfootnote), [tags](#tags), [text](#text), [vaultPath](#vaultpath)
### books
List of source books using abbreviated name. Fantasy statblocks uses this list format, as an example.
### getAliases
Aliases for this note, including the note name, as quoted/escaped strings.
Example values:
- "+1 All-Purpose Tool"
- "Carl \"The Elder\" Frost"
In templates:
```md
aliases:
{#each resource.aliases}
- {it}
{/each}
```
### hasSections
True if the content (text) contains sections
### labeledSource
Formatted string describing the content's source(s): `_Source: <sources>_`
### name
Note name
### reprintOf
List of content superceded by this note (as [Reprinted](Reprinted.md))
### source
String describing the content's source(s)
### sourceAndPage
Book sources as list of [SourceAndPage](SourceAndPage.md)
### sourcesWithFootnote
Get Sources as a footnote.
Calling this method will return an italicised string with the primary source
followed by a footnote listing all other sources. Useful for types
that tend to have many sources.
### tags
Collected tags for inclusion in frontmatter
### text
Formatted text. For most templates, this is the bulk of the content.
### vaultPath
Path to this note in the vault
================================================
FILE: docs/templates/QuteNote.md
================================================
# QuteNote
Common attributes for simple notes. THese attributes are more
often used by books, adventures, rules, etc.
Notes created from `QuteNote` (or a derivative) will look for a template
named `note2md.txt` by default.
## Attributes
[books](#books), [getAliases](#getaliases), [hasSections](#hassections), [labeledSource](#labeledsource), [name](#name), [reprintOf](#reprintof), [source](#source), [sourceAndPage](#sourceandpage), [sourcesWithFootnote](#sourceswithfootnote), [tags](#tags), [text](#text), [vaultPath](#vaultpath)
### books
List of source books using abbreviated name. Fantasy statblocks uses this list format, as an example.
### getAliases
Aliases for this note, including the note name, as quoted/escaped strings.
Example values:
- "+1 All-Purpose Tool"
- "Carl \"The Elder\" Frost"
In templates:
```md
aliases:
{#each resource.aliases}
- {it}
{/each}
```
### hasSections
True if the content (text) contains sections
### labeledSource
Formatted string describing the content's source(s): `_Source: <sources>_`
### name
Note name
### reprintOf
List of content superceded by this note (as [Reprinted](Reprinted.md))
### source
String describing the content's source(s)
### sourceAndPage
Book sources as list of [SourceAndPage](SourceAndPage.md)
### sourcesWithFootnote
Get Sources as a footnote.
Calling this method will return an italicised string with the primary source
followed by a footnote listing all other sources. Useful for types
that tend to have many sources.
### tags
Collected tags for inclusion in frontmatter
### text
Formatted text. For most templates, this is the bulk of the content.
### vaultPath
Path to this note in the vault
================================================
FILE: docs/templates/README.md
================================================
# Qute Template Reference
The following pages describe attributes that you can use to customize
generated output in Qute templates.
Use a `resource.` prefix to access these attributes unless otherwise noted.
For example, `resource.title`.
For more information about Qute, see the [Qute guide](https://quarkus.io/guides/qute).
- [Documentation for using templates with the CLI](../../examples/templates/README.md)
- [5e Template Examples](../../examples/templates/tools5e/README.md)
- [5eTools template attributes](dnd5e/README.md)
- [Pf2eTools template attributes](pf2e/README.md)
## References
- [ImageRef](ImageRef.md): Create links to referenced images.
- [NamedText](NamedText.md): Holder of a name or category and associated descriptive text.
- [QuteBase](QuteBase.md): Defines attributes inherited by other Qute templates.
- [QuteNote](QuteNote.md): Common attributes for simple notes.
- [Reprinted](Reprinted.md): A simple record to hold the name and source of a reprinted item.
- [SourceAndPage](SourceAndPage.md): A representation of a source and page number.
- [TtrpgTemplateExtension](TtrpgTemplateExtension.md): Qute template extensions for TTRPG data.
================================================
FILE: docs/templates/Reprinted.md
================================================
# Reprinted
A simple record to hold the name and source of a reprinted item.
## Attributes
[name](#name), [source](#source)
### name
Name of the reprinted item
### source
Primary source of the reprinted item
================================================
FILE: docs/templates/SourceAndPage.md
================================================
# SourceAndPage
A representation of a source and page number. This attribute will print
itself nicely if you don't reference sub-attributes.
## Attributes
[longName](#longname), [page](#page), [source](#source)
### longName
Long source name
### page
Associated page number (may not be present)
### source
Abbreviated source name
================================================
FILE: docs/templates/TtrpgTemplateExtension.md
================================================
# TtrpgTemplateExtension
Qute template extensions for TTRPG data.
Use these functions to help render TTRPG data in Qute templates.
## Attributes
[asBonus](#asbonus), [capitalized](#capitalized), [capitalizedList](#capitalizedlist), [first](#first), [join](#join), [joinConjunct](#joinconjunct), [jsonString](#jsonstring), [lowercase](#lowercase), [pluralizeLabel](#pluralizelabel), [prefixSpace](#prefixspace), [quotedEscaped](#quotedescaped), [size](#size), [skipFirst](#skipfirst), [uppercaseFirst](#uppercasefirst)
### asBonus
Return the value formatted with a bonus with a +/- prefix.
Usage: `{perception.asBonus}`
### capitalized
Return a Title Case form of this string, capitalizing the first word.
Does not transform the contents of parenthesis (like markdown URLs).
Usage: `{resource.languages.capitalized}`
### capitalizedList
Return a capitalized form of this string, capitalizing the first word of each clause.
Clauses are separated by commas or semicolons. Ignores conjunctions and parenthetical content.
Usage: `{resource.languages.capitalizedList}`
### first
First element in list
Usage: `{resource.components.first}`
### join
Return the given collection converted into a string and joined using the specified joiner.
Usage: `{resource.components.join(", ")}`
### joinConjunct
Return the given list joined into a single string, using a different delimiter for the last element.
Usage: `{resource.components.joinConjunct(", ", " or ")}`
### jsonString
Return the object as a JSON string
Usage: `{resource.components.getJsonString(resource)}`
### lowercase
Return the lowercase form of this string.
Does not transform the contents of parenthesis (like markdown URLs).
Usage: `{resource.name.lowercase}`
### pluralizeLabel
Return the string pluralized based on the size of the collection.
Usage: `{resource.name.pluralized(resource.components)}`
### prefixSpace
Return the given object as a string, with a space prepended if it's non-empty and non-null.
Usage: `{resource.name.prefixSpace}`
### quotedEscaped
Escape double quotes in a string (YAML/properties safe)
Usage: `{resource.components.quotedEscaped}`
### size
Return the size of a list
Usage: `{resource.components.size()}`
### skipFirst
Skip first element in list
Usage: `{resource.components.skipFirst}`
### uppercaseFirst
Return the text with a capitalized first letter (ignoring punctuation like '[')
Usage: `{resource.name.uppercaseFirst}`
================================================
FILE: docs/templates/dnd5e/AbilityScores/AbilityScore.md
================================================
# AbilityScore
Ability score. Usually an integer, but can be a special value (string) instead.
## Attributes
[score](#score), [special](#special)
### score
The ability score (integer).
### special
The special value (string), or null if not applicable.
================================================
FILE: docs/templates/dnd5e/AbilityScores/README.md
================================================
# AbilityScores
5eTools Ability Score attributes.
Used to describe a monster, object or vehicle's ability scores.
If referenced as a unit (ignoring inner attributes), it will render ability scores as
a `|` separated list of values, in `STR,DEX,CON,INT,WIS,CHA` order.
For example:
`10 (+0)|10 (+0)|10 (+0)|10 (+0)|10 (+0)|10 (+0)`.
## Attributes
[cha](#cha), [chaMod](#chamod), [chaStat](#chastat), [charisma](#charisma), [con](#con), [conMod](#conmod), [conStat](#constat), [constitution](#constitution), [dex](#dex), [dexMod](#dexmod), [dexStat](#dexstat), [dexterity](#dexterity), [int](#int), [intMod](#intmod), [intStat](#intstat), [intelligence](#intelligence), [score](#score), [str](#str), [strMod](#strmod), [strStat](#strstat), [strength](#strength), [wis](#wis), [wisMod](#wismod), [wisStat](#wisstat), [wisdom](#wisdom)
### cha
Charisma as an ability string: `10 (+0)`
### chaMod
Charisma modifier: +1 or -2
### chaStat
Charisma stat as a number: 10
### charisma
Charisma score as [AbilityScore](AbilityScore.md)
### con
Constitution as an ability string: `10 (+0)`
### conMod
Constitution modifier: +1 or -2
### conStat
Constitution score as a number: 10
### constitution
Constitution score as [AbilityScore](AbilityScore.md)
### dex
Dexterity as an ability string: `10 (+0)`
### dexMod
Dexterity modifier: +1 or -2
### dexStat
Dexterity score as a number: 10
### dexterity
Dexterity score as [AbilityScore](AbilityScore.md)
### int
Intelligence as an ability string: `10 (+0)`
### intMod
Intelligence modifier: +1 or -2
### intStat
Intelligence score as a number: 10
### intelligence
Intelligence score as [AbilityScore](AbilityScore.md)
### score
### str
Strength as an ability string: `10 (+0)`
### strMod
Strength modifier: +1 or -2
### strStat
Strength score as a number: 10
### strength
Strength score as [AbilityScore](AbilityScore.md)
### wis
Wisdom as an ability string: `10 (+0)`
### wisMod
Wisdom modifier: +1 or -2
### wisStat
Wisdom score as a number: 10
### wisdom
Wisdom score as [AbilityScore](AbilityScore.md)
================================================
FILE: docs/templates/dnd5e/AbilityScores.md
================================================
# AbilityScores
5eTools Ability Score attributes.
Used to describe a monster, object or vehicle's ability scores.
If referenced as a unit (ignoring inner attributes), it will render ability scores as
a `|` separated list of values, in `STR,DEX,CON,INT,WIS,CHA` order.
For example:
`10 (+0)|10 (+0)|10 (+0)|10 (+0)|10 (+0)|10 (+0)`.
## Attributes
[cha](#cha), [chaMod](#chamod), [chaStat](#chastat), [con](#con), [conMod](#conmod), [conStat](#constat), [dex](#dex), [dexMod](#dexmod), [dexStat](#dexstat), [int](#int), [intMod](#intmod), [intStat](#intstat), [str](#str), [strMod](#strmod), [strStat](#strstat), [wis](#wis), [wisMod](#wismod), [wisStat](#wisstat)
### cha
Charisma as an ability string: `10 (+0)`
### chaMod
Charisma modifier: +1 or -2
### chaStat
Charisma stat as a number: 10
### con
Constitution as an ability string: `10 (+0)`
### conMod
Constitution modifier: +1 or -2
### conStat
Constitution score as a number: 10
### dex
Dexterity as an ability string: `10 (+0)`
### dexMod
Dexterity modifier: +1 or -2
### dexStat
Dexterity score as a number: 10
### int
Intelligence as an ability string: `10 (+0)`
### intMod
Intelligence modifier: +1 or -2
### intStat
Intelligence score as a number: 10
### str
Strength as an ability string: `10 (+0)`
### strMod
Strength modifier: +1 or -2
### strStat
Strength score as a number: 10
### wis
Wisdom as an ability string: `10 (+0)`
### wisMod
Wisdom modifier: +1 or -2
### wisStat
Wisdom score as a number: 10
================================================
FILE: docs/templates/dnd5e/AcHp.md
================================================
# AcHp
5eTools armor class and hit points attributes
This data object provides a default mechanism for creating
a marked up string based on the attributes that are present.
To use it, reference it directly.
## Attributes
[ac](#ac), [acText](#actext), [hitDice](#hitdice), [hp](#hp), [hpDiceRoller](#hpdiceroller), [hpText](#hptext)
### ac
Armor class (number)
### acText
Additional armor class text. May link to related items
### hitDice
Hit dice formula string: 7d10 + 14 (for creatures)
### hp
Hit points (number or —)
### hpDiceRoller
Hit points as a dice roller formula:
\`dice: 1d20+7|text(37)\` (\`1d20+7\`)
### hpText
Additional hit point text.
In the case of summoned creatures, this will contain notes for how hit points
should be calculated relative to the player's modifiers.
================================================
FILE: docs/templates/dnd5e/ImmuneResist.md
================================================
# ImmuneResist
5eTools vulnerabilities, resistances, immunities, and condition immunities
This data object provides a default mechanism for creating
a marked up string based on the attributes that are present.
To use it, reference it directly.
## Attributes
[conditionImmune](#conditionimmune), [immune](#immune), [present](#present), [resist](#resist), [vulnerable](#vulnerable)
### conditionImmune
Comma-separated string of creature condition immunities (if present).
### immune
Comma-separated string of creature damage immunities (if present).
### present
True if immunities or resistances are present (otherwise false)
### resist
Comma-separated string of creature damage resistances (if present).
### vulnerable
Comma-separated string of creature damage vulnerabilities (if present).
================================================
FILE: docs/templates/dnd5e/QuteBackground.md
================================================
# QuteBackground
5eTools background attributes (`background2md.txt`).
Extension of [Tools5eQuteBase](Tools5eQuteBase.md).
## Attributes
[ability](#ability), [books](#books), [fluffImages](#fluffimages), [getAliases](#getaliases), [hasImages](#hasimages), [hasMoreImages](#hasmoreimages), [hasSections](#hassections), [labeledSource](#labeledsource), [name](#name), [prerequisite](#prerequisite), [reprintOf](#reprintof), [showAllImages](#showallimages), [showMoreImages](#showmoreimages), [showPortraitImage](#showportraitimage), [source](#source), [sourceAndPage](#sourceandpage), [sourcesWithFootnote](#sourceswithfootnote), [tags](#tags), [text](#text), [vaultPath](#vaultpath)
### ability
Formatted text listing ability score increase (optional)
### books
List of source books using abbreviated name. Fantasy statblocks uses this list format, as an example.
### fluffImages
List of images as [ImageRef](../ImageRef.md) (optional)
### getAliases
Aliases for this note, including the note name, as quoted/escaped strings.
Example values:
- "+1 All-Purpose Tool"
- "Carl \"The Elder\" Frost"
In templates:
```md
aliases:
{#each resource.aliases}
- {it}
{/each}
```
### hasImages
Return true if any images are present
### hasMoreImages
Return true if more than one image is present
### hasSections
True if the content (text) contains sections
### labeledSource
Formatted string describing the content's source(s): `_Source: <sources>_`
### name
Note name
### prerequisite
Formatted text listing other prerequisite conditions (optional)
### reprintOf
List of content superceded by this note (as [Reprinted](../Reprinted.md))
### showAllImages
Return embedded wikilinks for all images
If there is more than one, they will be displayed in a gallery.
### showMoreImages
Return embedded wikilinks for all but the first image
If there is more than one, they will be displayed in a gallery.
### showPortraitImage
Return an embedded wikilink to the first image
Will have the "right" anchor tag.
### source
String describing the content's source(s)
### sourceAndPage
Book sources as list of [SourceAndPage](../SourceAndPage.md)
### sourcesWithFootnote
Get Sources as a footnote.
Calling this method will return an italicised string with the primary source
followed by a footnote listing all other sources. Useful for types
that tend to have many sources.
### tags
Collected tags for inclusion in frontmatter
### text
Formatted text. For most templates, this is the bulk of the content.
### vaultPath
Path to this note in the vault
================================================
FILE: docs/templates/dnd5e/QuteBastion/Hireling.md
================================================
# Hireling
Hireling information. Either exact or min must be present.
## Attributes
[description](#description), [exact](#exact), [max](#max), [min](#min), [space](#space)
### description
Formatted string description of the hirelings for a Bastion
### exact
Exact number of hirelings (either exact or min)
### max
Maximum number of hirelings (optional)
### min
Minimum number of hirelings (either exact or min)
### space
Size of bastion space required for these hirelings (optional)
================================================
FILE: docs/templates/dnd5e/QuteBastion/README.md
================================================
# QuteBastion
5eTools background attributes (`bastion2md.txt`).
Extension of [Tools5eQuteBase](../Tools5eQuteBase.md).
## Attributes
[books](#books), [fluffImages](#fluffimages), [getAliases](#getaliases), [hasImages](#hasimages), [hasMoreImages](#hasmoreimages), [hasSections](#hassections), [hirelingDescription](#hirelingdescription), [hirelings](#hirelings), [labeledSource](#labeledsource), [level](#level), [name](#name), [orders](#orders), [prerequisite](#prerequisite), [reprintOf](#reprintof), [showAllImages](#showallimages), [showMoreImages](#showmoreimages), [showPortraitImage](#showportraitimage), [source](#source), [sourceAndPage](#sourceandpage), [sourcesWithFootnote](#sourceswithfootnote), [space](#space), [spaceDescription](#spacedescription), [tags](#tags), [text](#text), [type](#type), [vaultPath](#vaultpath)
### books
List of source books using abbreviated name. Fantasy statblocks uses this list format, as an example.
### fluffImages
List of images as [ImageRef](../../ImageRef.md) (optional)
### getAliases
Aliases for this note, including the note name, as quoted/escaped strings.
Example values:
- "+1 All-Purpose Tool"
- "Carl \"The Elder\" Frost"
In templates:
```md
aliases:
{#each resource.aliases}
- {it}
{/each}
```
### hasImages
Return true if any images are present
### hasMoreImages
Return true if more than one image is present
### hasSections
True if the content (text) contains sections
### hirelingDescription
Hirelings as a descriptive string (if hirelings is present)
### hirelings
List of possible hirelings this bastion can have (as [Hireling](Hireling.md),
optional)
### labeledSource
Formatted string describing the content's source(s): `_Source: <sources>_`
### level
Bastion level (optional)
### name
Note name
### orders
Bastion orders (optional)
### prerequisite
Formatted text listing other prerequisite conditions (optional)
### reprintOf
List of content superceded by this note (as [Reprinted](../../Reprinted.md))
### showAllImages
Return embedded wikilinks for all images
If there is more than one, they will be displayed in a gallery.
### showMoreImages
Return embedded wikilinks for all but the first image
If there is more than one, they will be displayed in a gallery.
### showPortraitImage
Return an embedded wikilink to the first image
Will have the "right" anchor tag.
### source
String describing the content's source(s)
### sourceAndPage
Book sources as list of [SourceAndPage](../../SourceAndPage.md)
### sourcesWithFootnote
Get Sources as a footnote.
Calling this method will return an italicised string with the primary source
followed by a footnote listing all other sources. Useful for types
that tend to have many sources.
### space
List of possible spaces this bastion can occupy (as [Space](Space.md),
optional)
### spaceDescription
Space as a descriptive string (if space is present)
### tags
Collected tags for inclusion in frontmatter
### text
Formatted text. For most templates, this is the bulk of the content.
### type
Type
### vaultPath
Path to this note in the vault
================================================
FILE: docs/templates/dnd5e/QuteBastion/Space.md
================================================
# Space
## Attributes
[cost](#cost), [description](#description), [name](#name), [prevSpace](#prevspace), [squares](#squares), [time](#time)
### cost
Cost (GP) of building a bastion of this size
### description
Formatted string description of the space required for (or occupied by) a Bastion
### name
Name of this size/space
### prevSpace
Previous space to enlarge from (optional)
### squares
Maximum number of 5-foot squares a bastion this size can occupy
### time
Time to construct a bastion of this size
================================================
FILE: docs/templates/dnd5e/QuteClass/HitPointDie.md
================================================
# HitPointDie
Describes the hit point die used by the class.
If referenced as a unit (ignoring inner attributes), it will render
formatted strings based on the class version (2024 or not).
## Attributes
[average](#average), [classic](#classic), [face](#face), [isClassic](#isclassic), [isSidekick](#issidekick), [name](#name), [number](#number), [sidekick](#sidekick)
### average
The average value of a hit dice roll
### classic
### face
Die to roll (8, 10); This will be 0 for sidekicks
### isClassic
True if this is a 2014 class
### isSidekick
Explicit test for sidekick (alternate to 0 face)
### name
### number
How many dice to roll (pretty much always 1)
### sidekick
================================================
FILE: docs/templates/dnd5e/QuteClass/Multiclassing.md
================================================
# Multiclassing
Describes the multiclassing information for the class.
If referenced as a unit (ignoring inner attributes), it will render
formatted text describing multiclassing requirements and proficiencies.
## Attributes
[armor](#armor), [classic](#classic), [isClassic](#isclassic), [primaryAbility](#primaryability), [requirements](#requirements), [requirementsSpecial](#requirementsspecial), [skills](#skills), [text](#text), [tools](#tools), [weapons](#weapons)
### armor
Armor proficiencies gained as formatted string
(optional)
### classic
### isClassic
True if this class is from the 2014 edition
### primaryAbility
Primary ability for multiclassing as formatted
string (optional)
### requirements
Prerequisites for multiclassing as formatted
string (optional)
### requirementsSpecial
Special prerequisites for multiclassing as
formatted string (optional)
### skills
Skill proficiencies gained as formatted string
(optional)
### text
Formatted text describing this multiclass
(optional)
### tools
Tool proficiencies gained as formatted string
(optional)
### weapons
Weapon proficiencies gained as formatted string
(optional)
================================================
FILE: docs/templates/dnd5e/QuteClass/README.md
================================================
# QuteClass
5eTools class attributes (`class2md.txt`)
Extension of [Tools5eQuteBase](../Tools5eQuteBase.md).
## Attributes
[books](#books), [classProgression](#classprogression), [fluffImages](#fluffimages), [getAliases](#getaliases), [hasImages](#hasimages), [hasMoreImages](#hasmoreimages), [hasSections](#hassections), [hitDice](#hitdice), [hitPointDie](#hitpointdie), [hitRollAverage](#hitrollaverage), [labeledSource](#labeledsource), [multiclassing](#multiclassing), [name](#name), [primaryAbility](#primaryability), [reprintOf](#reprintof), [showAllImages](#showallimages), [showMoreImages](#showmoreimages), [showPortraitImage](#showportraitimage), [source](#source), [sourceAndPage](#sourceandpage), [sourcesWithFootnote](#sourceswithfootnote), [startingEquipment](#startingequipment), [tags](#tags), [text](#text), [vaultPath](#vaultpath)
### books
List of source books using abbreviated name. Fantasy statblocks uses this list format, as an example.
### classProgression
Formatted callout containing class and feature progressions.
### fluffImages
List of images as [ImageRef](../../ImageRef.md) (optional)
### getAliases
Aliases for this note, including the note name, as quoted/escaped strings.
Example values:
- "+1 All-Purpose Tool"
- "Carl \"The Elder\" Frost"
In templates:
```md
aliases:
{#each resource.aliases}
- {it}
{/each}
```
### hasImages
Return true if any images are present
### hasMoreImages
Return true if more than one image is present
### hasSections
True if the content (text) contains sections
### hitDice
Hit dice for this class as a single digit: 8
### hitPointDie
Hit point die for this class as
[HitPointDie](HitPointDie.md)
### hitRollAverage
Average Hit dice roll as a single digit
### labeledSource
Formatted string describing the content's source(s): `_Source: <sources>_`
### multiclassing
Multiclassing requirements and proficiencies for this class as
[Multiclassing](Multiclassing.md)
### name
Note name
### primaryAbility
Formatted string describing the primary abilities for this class
### reprintOf
List of content superceded by this note (as [Reprinted](../../Reprinted.md))
### showAllImages
Return embedded wikilinks for all images
If there is more than one, they will be displayed in a gallery.
### showMoreImages
Return embedded wikilinks for all but the first image
If there is more than one, they will be displayed in a gallery.
### showPortraitImage
Return an embedded wikilink to the first image
Will have the "right" anchor tag.
### source
String describing the content's source(s)
### sourceAndPage
Book sources as list of [SourceAndPage](../../SourceAndPage.md)
### sourcesWithFootnote
Get Sources as a footnote.
Calling this method will return an italicised string with the primary source
followed by a footnote listing all other sources. Useful for types
that tend to have many sources.
### startingEquipment
Formatted text describing starting equipment as
[StartingEquipment](StartingEquipment.md)
### tags
Collected tags for inclusion in frontmatter
### text
Formatted text. For most templates, this is the bulk of the content.
### vaultPath
Path to this note in the vault
================================================
FILE: docs/templates/dnd5e/QuteClass/StartingEquipment.md
================================================
# StartingEquipment
Describes the starting equipment for the class.
If referenced as a unit (ignoring inner attributes), it will render
structured text describing starting proficiencies and equipment *2014* vs
*2024*.
## Attributes
[armor](#armor), [armorString](#armorstring), [classic](#classic), [equipment](#equipment), [isClassic](#isclassic), [joinOrDefault](#joinordefault), [proficiencies](#proficien
gitextract_5u3vgqt7/
├── .editorconfig
├── .github/
│ ├── CODEOWNERS
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug_report.yaml
│ │ └── feature_request.md
│ ├── actions/
│ │ ├── data-cache/
│ │ │ └── action.yml
│ │ └── native-data-cache/
│ │ └── action.yml
│ ├── augment-release.sh
│ ├── dependabot.yml
│ ├── project.yml
│ └── workflows/
│ ├── cache.yml
│ ├── maven.yml
│ ├── pull-request.yml
│ ├── release.yml
│ ├── scorecard.yml
│ ├── test-data.yml
│ └── website.yml
├── .gitignore
├── .markdownlint.yaml
├── .mvn/
│ └── wrapper/
│ ├── .gitignore
│ └── maven-wrapper.properties
├── AGENTS.md
├── CHANGELOG.md
├── CLAUDE.md
├── CONTRIBUTING.md
├── LICENSE
├── README-WINDOWS.md
├── README.md
├── SECURITY.md
├── dco.txt
├── docs/
│ ├── README.md
│ ├── alternateRun.md
│ ├── configuration.md
│ ├── sourceMap.md
│ └── templates/
│ ├── ImageRef.md
│ ├── NamedText.md
│ ├── QuteAltNames.md
│ ├── QuteBase.md
│ ├── QuteNote.md
│ ├── README.md
│ ├── Reprinted.md
│ ├── SourceAndPage.md
│ ├── TtrpgTemplateExtension.md
│ ├── dnd5e/
│ │ ├── AbilityScores/
│ │ │ ├── AbilityScore.md
│ │ │ └── README.md
│ │ ├── AbilityScores.md
│ │ ├── AcHp.md
│ │ ├── ImmuneResist.md
│ │ ├── QuteBackground.md
│ │ ├── QuteBastion/
│ │ │ ├── Hireling.md
│ │ │ ├── README.md
│ │ │ └── Space.md
│ │ ├── QuteClass/
│ │ │ ├── HitPointDie.md
│ │ │ ├── Multiclassing.md
│ │ │ ├── README.md
│ │ │ └── StartingEquipment.md
│ │ ├── QuteClass.md
│ │ ├── QuteDeck/
│ │ │ ├── Card.md
│ │ │ └── README.md
│ │ ├── QuteDeity.md
│ │ ├── QuteFeat.md
│ │ ├── QuteHazard.md
│ │ ├── QuteItem/
│ │ │ ├── README.md
│ │ │ └── Variant.md
│ │ ├── QuteMonster/
│ │ │ ├── Initiative.md
│ │ │ ├── InitiativeMode.md
│ │ │ ├── README.md
│ │ │ ├── SavesAndSkills.md
│ │ │ ├── SavingThrow.md
│ │ │ ├── SkillModifier.md
│ │ │ ├── Spellcasting.md
│ │ │ ├── Spells.md
│ │ │ ├── TraitDescription.md
│ │ │ └── Traits.md
│ │ ├── QuteObject.md
│ │ ├── QutePsionic.md
│ │ ├── QuteRace.md
│ │ ├── QuteReward.md
│ │ ├── QuteSpell.md
│ │ ├── QuteSubclass.md
│ │ ├── QuteVehicle/
│ │ │ ├── README.md
│ │ │ ├── ShipAcHp.md
│ │ │ ├── ShipCrewCargoPace.md
│ │ │ └── ShipSection.md
│ │ ├── README.md
│ │ ├── Tools5eQuteBase.md
│ │ └── Tools5eQuteNote.md
│ └── pf2e/
│ ├── Pf2eQuteBase.md
│ ├── Pf2eQuteNote.md
│ ├── QuteAbility.md
│ ├── QuteAbilityOrAffliction.md
│ ├── QuteAction/
│ │ ├── ActionType.md
│ │ └── README.md
│ ├── QuteAffliction/
│ │ ├── QuteAfflictionSave.md
│ │ ├── QuteAfflictionStage.md
│ │ └── README.md
│ ├── QuteArchetype.md
│ ├── QuteBackground.md
│ ├── QuteBook/
│ │ ├── BookInfo.md
│ │ └── README.md
│ ├── QuteCreature/
│ │ ├── CreatureAbilities.md
│ │ ├── CreatureLanguages.md
│ │ ├── CreatureRitualCasting.md
│ │ ├── CreatureSense.md
│ │ ├── CreatureSkills.md
│ │ ├── CreatureSpellReference.md
│ │ ├── CreatureSpellcasting.md
│ │ ├── CreatureSpells.md
│ │ ├── README.md
│ │ ├── SpellcastingPreparation.md
│ │ └── SpellcastingTradition.md
│ ├── QuteDataActivity.md
│ ├── QuteDataArmorClass.md
│ ├── QuteDataDefenses/
│ │ ├── QuteSavingThrows.md
│ │ └── README.md
│ ├── QuteDataDuration.md
│ ├── QuteDataFrequency.md
│ ├── QuteDataGenericStat/
│ │ ├── QuteDataNamedBonus.md
│ │ ├── README.md
│ │ └── SimpleStat.md
│ ├── QuteDataHpHardnessBt/
│ │ ├── HpStat.md
│ │ └── README.md
│ ├── QuteDataRange/
│ │ ├── README.md
│ │ └── RangeUnit.md
│ ├── QuteDataSpeed.md
│ ├── QuteDataTimedDuration/
│ │ ├── DurationUnit.md
│ │ └── README.md
│ ├── QuteDeity/
│ │ ├── QuteDeityCleric.md
│ │ ├── QuteDivineAvatar.md
│ │ ├── QuteDivineIntercession.md
│ │ └── README.md
│ ├── QuteFeat.md
│ ├── QuteHazard/
│ │ ├── QuteHazardStealth.md
│ │ └── README.md
│ ├── QuteInlineAttack/
│ │ ├── AttackRangeType.md
│ │ └── README.md
│ ├── QuteItem/
│ │ ├── QuteItemActivate.md
│ │ ├── QuteItemArmorData.md
│ │ ├── QuteItemShieldData.md
│ │ ├── QuteItemVariant.md
│ │ ├── QuteItemWeaponData.md
│ │ └── README.md
│ ├── QuteRitual/
│ │ ├── QuteRitualCasting.md
│ │ ├── QuteRitualChecks.md
│ │ └── README.md
│ ├── QuteSpell/
│ │ ├── QuteSpellAmp.md
│ │ ├── QuteSpellDuration.md
│ │ ├── QuteSpellSave.md
│ │ ├── QuteSpellTarget.md
│ │ └── README.md
│ ├── QuteTrait.md
│ ├── QuteTraitIndex.md
│ └── README.md
├── examples/
│ ├── README.md
│ ├── admonitions/
│ │ ├── README.md
│ │ ├── admonitions-5e.json
│ │ ├── admonitions-pf2e-v3.json
│ │ └── other-admonitions.json
│ ├── config/
│ │ ├── README.md
│ │ ├── config.5e.json
│ │ ├── config.5e.yaml
│ │ ├── config.pf2e.json
│ │ ├── config.pf2e.yaml
│ │ └── config.schema.json
│ ├── css-snippets/
│ │ ├── README.md
│ │ ├── dnd5e-compendium.css
│ │ ├── dnd5e-float-images.css
│ │ ├── dnd5e-only-admonitions.css
│ │ ├── dnd5e-only-statblock.css
│ │ ├── hide-markdown-link-url.css
│ │ ├── pf2-compendium.css
│ │ └── pf2-only-statblocks.css
│ └── templates/
│ ├── README.md
│ └── tools5e/
│ ├── README.md
│ ├── images-background2md.txt
│ ├── images-class2md.txt
│ ├── images-item2md.txt
│ ├── images-monster2md.txt
│ ├── images-object2md.txt
│ ├── images-race2md.txt
│ ├── images-spell2md.txt
│ ├── images-subclass2md.txt
│ ├── images-vehicle2md.txt
│ ├── mixed/
│ │ ├── README.md
│ │ ├── mixed-background2md.txt
│ │ ├── mixed-class2md.txt
│ │ ├── mixed-deck2md.txt
│ │ ├── mixed-deity2md.txt
│ │ ├── mixed-feat2md.txt
│ │ ├── mixed-hazard2md.txt
│ │ ├── mixed-item2md.txt
│ │ ├── mixed-monster2md.txt
│ │ ├── mixed-object2md.txt
│ │ ├── mixed-race2md.txt
│ │ ├── mixed-reward2md.txt
│ │ ├── mixed-spell2md.txt
│ │ ├── mixed-subclass2md.txt
│ │ └── mixed-vehicle2md.txt
│ ├── monster2md-2024.txt
│ ├── monster2md-scores.txt
│ ├── monster2md-yamlStatblock-body.txt
│ ├── monster2md-yamlStatblock-header.txt
│ ├── object2md-yamlStatblock-body.txt
│ └── object2md-yamlStatblock-header.txt
├── jreleaser.yml
├── migration/
│ ├── json5e-cli-renameFiles-1.0.12.md
│ ├── ttrpg-cli-renameFiles-2.0.0.md
│ └── ttrpg-cli-renameFiles-5e-2.1.0.md
├── mvnw
├── mvnw.cmd
├── pom.xml
└── src/
├── ide-config/
│ ├── eclipse-format.xml
│ └── eclipse.importorder
├── main/
│ ├── java/
│ │ └── dev/
│ │ └── ebullient/
│ │ └── convert/
│ │ ├── Completion.java
│ │ ├── RpgDataConvertCli.java
│ │ ├── StringUtil.java
│ │ ├── VersionProvider.java
│ │ ├── config/
│ │ │ ├── CompendiumConfig.java
│ │ │ ├── Datasource.java
│ │ │ ├── ReprintBehavior.java
│ │ │ ├── TemplatePaths.java
│ │ │ ├── TtrpgConfig.java
│ │ │ └── UserConfig.java
│ │ ├── io/
│ │ │ ├── FontRef.java
│ │ │ ├── JavadocIgnore.java
│ │ │ ├── JavadocVerbatim.java
│ │ │ ├── MarkdownDoclet.java
│ │ │ ├── MarkdownWriter.java
│ │ │ ├── Msg.java
│ │ │ ├── NoStackTraceException.java
│ │ │ ├── Templates.java
│ │ │ └── Tui.java
│ │ ├── qute/
│ │ │ ├── ImageRef.java
│ │ │ ├── NamedText.java
│ │ │ ├── QuteAltNames.java
│ │ │ ├── QuteBase.java
│ │ │ ├── QuteNote.java
│ │ │ ├── QuteUtil.java
│ │ │ ├── Reprinted.java
│ │ │ ├── SourceAndPage.java
│ │ │ ├── TtrpgTemplateExtension.java
│ │ │ └── package-info.java
│ │ └── tools/
│ │ ├── CompendiumSources.java
│ │ ├── IndexType.java
│ │ ├── JsonCopyException.java
│ │ ├── JsonNodeReader.java
│ │ ├── JsonSourceCopier.java
│ │ ├── JsonTextConverter.java
│ │ ├── MarkdownConverter.java
│ │ ├── ParseState.java
│ │ ├── Tags.java
│ │ ├── ToolsIndex.java
│ │ ├── dnd5e/
│ │ │ ├── BackgroundTraits2Note.java
│ │ │ ├── HomebrewIndex.java
│ │ │ ├── ItemMastery.java
│ │ │ ├── ItemProperty.java
│ │ │ ├── ItemTag.java
│ │ │ ├── ItemType.java
│ │ │ ├── ItemTypeGroup.java
│ │ │ ├── Json2QuteBackground.java
│ │ │ ├── Json2QuteBastion.java
│ │ │ ├── Json2QuteBook.java
│ │ │ ├── Json2QuteClass.java
│ │ │ ├── Json2QuteCommon.java
│ │ │ ├── Json2QuteCompose.java
│ │ │ ├── Json2QuteDeck.java
│ │ │ ├── Json2QuteDeity.java
│ │ │ ├── Json2QuteFeat.java
│ │ │ ├── Json2QuteHazard.java
│ │ │ ├── Json2QuteItem.java
│ │ │ ├── Json2QuteLegendaryGroup.java
│ │ │ ├── Json2QuteMonster.java
│ │ │ ├── Json2QuteNote.java
│ │ │ ├── Json2QuteObject.java
│ │ │ ├── Json2QuteOptionalFeature.java
│ │ │ ├── Json2QuteOptionalFeatureType.java
│ │ │ ├── Json2QutePsionicTalent.java
│ │ │ ├── Json2QuteRace.java
│ │ │ ├── Json2QuteReward.java
│ │ │ ├── Json2QuteSpell.java
│ │ │ ├── Json2QuteSpellIndex.java
│ │ │ ├── Json2QuteTable.java
│ │ │ ├── Json2QuteVehicle.java
│ │ │ ├── JsonSource.java
│ │ │ ├── JsonTextReplacement.java
│ │ │ ├── MagicVariant.java
│ │ │ ├── OptionalFeatureIndex.java
│ │ │ ├── PsionicType.java
│ │ │ ├── SkillOrAbility.java
│ │ │ ├── SpellEntry.java
│ │ │ ├── SpellIndex.java
│ │ │ ├── SpellSchool.java
│ │ │ ├── Tools5eIndex.java
│ │ │ ├── Tools5eIndexType.java
│ │ │ ├── Tools5eJsonSourceCopier.java
│ │ │ ├── Tools5eLinkifier.java
│ │ │ ├── Tools5eMarkdownConverter.java
│ │ │ ├── Tools5eSources.java
│ │ │ └── qute/
│ │ │ ├── AbilityScores.java
│ │ │ ├── AcHp.java
│ │ │ ├── ImmuneResist.java
│ │ │ ├── QuteBackground.java
│ │ │ ├── QuteBastion.java
│ │ │ ├── QuteClass.java
│ │ │ ├── QuteDeck.java
│ │ │ ├── QuteDeity.java
│ │ │ ├── QuteFeat.java
│ │ │ ├── QuteHazard.java
│ │ │ ├── QuteItem.java
│ │ │ ├── QuteMonster.java
│ │ │ ├── QuteObject.java
│ │ │ ├── QutePsionic.java
│ │ │ ├── QuteRace.java
│ │ │ ├── QuteReward.java
│ │ │ ├── QuteSpell.java
│ │ │ ├── QuteSubclass.java
│ │ │ ├── QuteVehicle.java
│ │ │ ├── Tools5eQuteBase.java
│ │ │ ├── Tools5eQuteNote.java
│ │ │ └── package-info.java
│ │ └── pf2e/
│ │ ├── Json2QuteAbility.java
│ │ ├── Json2QuteAction.java
│ │ ├── Json2QuteAffliction.java
│ │ ├── Json2QuteArchetype.java
│ │ ├── Json2QuteBackground.java
│ │ ├── Json2QuteBase.java
│ │ ├── Json2QuteBook.java
│ │ ├── Json2QuteCompose.java
│ │ ├── Json2QuteCreature.java
│ │ ├── Json2QuteDeity.java
│ │ ├── Json2QuteFeat.java
│ │ ├── Json2QuteHazard.java
│ │ ├── Json2QuteItem.java
│ │ ├── Json2QuteRitual.java
│ │ ├── Json2QuteSpell.java
│ │ ├── Json2QuteTable.java
│ │ ├── Json2QuteTrait.java
│ │ ├── JsonSource.java
│ │ ├── JsonTextReplacement.java
│ │ ├── Pf2eActivity.java
│ │ ├── Pf2eIndex.java
│ │ ├── Pf2eIndexType.java
│ │ ├── Pf2eJsonNodeReader.java
│ │ ├── Pf2eJsonSourceCopier.java
│ │ ├── Pf2eMarkdown.java
│ │ ├── Pf2eSources.java
│ │ ├── Pf2eTypeReader.java
│ │ └── qute/
│ │ ├── Pf2eQuteBase.java
│ │ ├── Pf2eQuteNote.java
│ │ ├── QuteAbility.java
│ │ ├── QuteAbilityOrAffliction.java
│ │ ├── QuteAction.java
│ │ ├── QuteAffliction.java
│ │ ├── QuteArchetype.java
│ │ ├── QuteBackground.java
│ │ ├── QuteBook.java
│ │ ├── QuteCreature.java
│ │ ├── QuteDataActivity.java
│ │ ├── QuteDataArmorClass.java
│ │ ├── QuteDataDefenses.java
│ │ ├── QuteDataDuration.java
│ │ ├── QuteDataFrequency.java
│ │ ├── QuteDataGenericStat.java
│ │ ├── QuteDataHpHardnessBt.java
│ │ ├── QuteDataRange.java
│ │ ├── QuteDataSpeed.java
│ │ ├── QuteDataTimedDuration.java
│ │ ├── QuteDeity.java
│ │ ├── QuteFeat.java
│ │ ├── QuteHazard.java
│ │ ├── QuteInlineAttack.java
│ │ ├── QuteItem.java
│ │ ├── QuteRitual.java
│ │ ├── QuteSpell.java
│ │ ├── QuteTrait.java
│ │ ├── QuteTraitIndex.java
│ │ └── package-info.java
│ └── resources/
│ ├── application.properties
│ ├── convertData.json
│ ├── sourceMap.yaml
│ └── templates/
│ ├── README.md
│ ├── tools5e/
│ │ ├── README.md
│ │ ├── background2md.txt
│ │ ├── bastion2md.txt
│ │ ├── class2md.txt
│ │ ├── css-font.txt
│ │ ├── deck2md.txt
│ │ ├── deity2md.txt
│ │ ├── feat2md.txt
│ │ ├── hazard2md.txt
│ │ ├── index.txt
│ │ ├── item2md.txt
│ │ ├── monster2md.txt
│ │ ├── note2md.txt
│ │ ├── object2md.txt
│ │ ├── psionic2md.txt
│ │ ├── race2md.txt
│ │ ├── reward2md.txt
│ │ ├── spell2md.txt
│ │ ├── subclass2md.txt
│ │ └── vehicle2md.txt
│ └── toolsPf2e/
│ ├── README.md
│ ├── ability2md.txt
│ ├── action2md.txt
│ ├── affliction2md.txt
│ ├── archetype2md.txt
│ ├── background2md.txt
│ ├── book2md.txt
│ ├── creature2md.txt
│ ├── deity2md.txt
│ ├── feat2md.txt
│ ├── hazard2md.txt
│ ├── index.txt
│ ├── indexTrait.txt
│ ├── inline-ability2md.txt
│ ├── inline-affliction2md.txt
│ ├── inline-attack2md.txt
│ ├── item2md.txt
│ ├── note2md.txt
│ ├── ritual2md.txt
│ ├── spell2md.txt
│ └── trait2md.txt
├── scss/
│ ├── dnd5e/
│ │ ├── _admonitions.scss
│ │ ├── _float-images-mixin.scss
│ │ ├── _float-images.scss
│ │ ├── _no-inline-title.scss
│ │ └── _statblock.scss
│ ├── dnd5e-compendium.scss
│ ├── dnd5e-float-images.scss
│ ├── dnd5e-only-admonitions.scss
│ ├── dnd5e-only-statblock.scss
│ ├── hide-markdown-link-url.scss
│ ├── pf2-compendium.scss
│ ├── pf2-only-statblocks.scss
│ └── pf2e/
│ ├── _pf2e-variables.scss
│ ├── callmonitions/
│ │ ├── _00-callmonitions-index.scss
│ │ ├── _00-pf2e-maps.scss
│ │ ├── _01-callmonition-core.scss
│ │ ├── _02-pf2-beige.scss
│ │ ├── _02-pf2-brown.scss
│ │ ├── _02-pf2-example.scss
│ │ ├── _02-pf2-inset.scss
│ │ ├── _02-pf2-key-box.scss
│ │ ├── _02-pf2-note.scss
│ │ ├── _02-pf2-red.scss
│ │ ├── _02-pf2-sidebar.scss
│ │ ├── _02-pf2-summary.scss
│ │ ├── _02-pf2-tip.scss
│ │ ├── _02-success-degree.scss
│ │ ├── _03-ad-pf2-note.scss
│ │ ├── _03-embed-ability.scss
│ │ ├── _03-embed-action.scss
│ │ ├── _03-embed-avatar.scss
│ │ ├── _03-embed-disease.scss
│ │ ├── _03-embed-feat.scss
│ │ ├── _03-embed-item.scss
│ │ ├── _03-embed-ritual.scss
│ │ ├── _03-inline-affliction.scss
│ │ ├── _03-inline-attack.scss
│ │ ├── _04-statblock-pf2e.scss
│ │ └── shake-ins/
│ │ ├── _admon-content-styling.scss
│ │ ├── _ca-content.scss
│ │ ├── _ca-misc.scss
│ │ ├── _ca-root.scss
│ │ └── _ca-title.scss
│ ├── patches/
│ │ ├── _ITS-Theme.scss
│ │ └── _index.scss
│ └── styling/
│ ├── _action-icons.scss
│ ├── _embeds.scss
│ ├── _index.scss
│ ├── _link-text.scss
│ ├── _pathfinder-font-classes.scss
│ ├── _scrollbars.scss
│ ├── _sub-sup.scss
│ ├── _table.scss
│ └── _trait-box-shadows.scss
└── test/
├── java/
│ └── dev/
│ └── ebullient/
│ └── convert/
│ ├── CustomTemplatesIT.java
│ ├── CustomTemplatesTest.java
│ ├── Pf2eDataConvertIT.java
│ ├── Pf2eDataConvertTest.java
│ ├── TestUtils.java
│ ├── Tools5eDataConvertIT.java
│ ├── Tools5eDataConvertTest.java
│ ├── config/
│ │ ├── ConfiguratorTest.java
│ │ ├── ConfiguratorUtil.java
│ │ └── ExportDocsTest.java
│ ├── docs/
│ │ └── TemplateDocTest.java
│ ├── qute/
│ │ ├── ImageRefTest.java
│ │ └── TtrpgTemplateExtensionTest.java
│ └── tools/
│ ├── TokenizerTest.java
│ ├── dnd5e/
│ │ ├── CommonDataTests.java
│ │ ├── FilterAllNewestTest.java
│ │ ├── FilterAllTest.java
│ │ ├── FilterNoneTest.java
│ │ ├── FilterSrd2014Test.java
│ │ ├── FilterSrd2024Test.java
│ │ ├── FilterSrdEditionsTest.java
│ │ ├── FilterSubset2014Test.java
│ │ ├── FilterSubset2024Test.java
│ │ ├── FilterSubsetMixedTest.java
│ │ └── TextReplacementTest.java
│ └── pf2e/
│ ├── CommonDataTests.java
│ ├── Pf2eJsonDataNoneTest.java
│ ├── Pf2eJsonDataSubsetTest.java
│ └── Pf2eJsonDataTest.java
└── resources/
├── 5e/
│ ├── ermis-bg.json
│ ├── images-from-local.json
│ ├── images-remote.json
│ ├── psion.json
│ ├── sample.yaml
│ ├── sources-2014-book-adventure.json
│ ├── sources-2014-no-phb.yaml
│ ├── sources-2014-srd.yaml
│ ├── sources-2014-subset.json
│ ├── sources-2024-srd.yaml
│ ├── sources-2024-subset.yaml
│ ├── sources-changeDefaultSources.yaml
│ ├── sources-homebrew.json
│ ├── sources-images.yaml
│ ├── sources-single.yaml
│ ├── sources-templates.json
│ ├── sources-ua.json
│ └── sources.json
├── 5e-sourceTypes.json
├── dice-roller-fs.json
├── dice-roller.json
├── other/
│ ├── background.txt
│ ├── class.txt
│ ├── deity.txt
│ ├── feat.txt
│ ├── index.txt
│ ├── item.txt
│ ├── monster-all.txt
│ ├── note.txt
│ ├── race.txt
│ ├── spell.txt
│ └── subclass.txt
├── paths.json
├── pf2e.json
├── sourcemap.txt
├── sources-bad-template.json
└── sources-from-all.json
Showing preview only (240K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (2857 symbols across 187 files)
FILE: src/main/java/dev/ebullient/convert/Completion.java
class Completion (line 7) | @Command(name = "completion", version = "generate-completion "
FILE: src/main/java/dev/ebullient/convert/RpgDataConvertCli.java
class RpgDataConvertCli (line 39) | @SuppressWarnings("CanBeFinal")
method setDatasource (line 105) | @Option(names = { "-g",
method setOutputPath (line 124) | @Option(names = "-o", description = "Output directory", required = true)
method setInput (line 133) | @Parameters(description = "Source file(s)")
method call (line 141) | @Override
method executionStrategy (line 260) | private int executionStrategy(ParseResult parseResult) {
method run (line 269) | @Override
class ShortErrorMessageHandler (line 280) | class ShortErrorMessageHandler implements IParameterExceptionHandler {
method handleParseException (line 281) | public int handleParseException(ParameterException ex, String[] args) {
FILE: src/main/java/dev/ebullient/convert/StringUtil.java
class StringUtil (line 27) | public class StringUtil {
method format (line 39) | public static String format(String formatString, Object val) {
method valueOrDefault (line 43) | public static String valueOrDefault(String value, String fallback) {
method valueOrDefault (line 47) | public static String valueOrDefault(String[] parts, int index, String ...
method quotedEscaped (line 53) | public static String quotedEscaped(String name) {
method uppercaseFirst (line 65) | public static String uppercaseFirst(String value) {
method equal (line 86) | public static boolean equal(Object o1, Object o2) {
method intOrDefault (line 90) | public static int intOrDefault(String value, int defaultValue) {
method intOrDefault (line 98) | public static int intOrDefault(String[] parts, int index, int defaultV...
method asModifier (line 105) | public static String asModifier(double value) {
method asModifier (line 109) | public static String asModifier(int value) {
method join (line 118) | public static String join(String joiner, Object o1, Object... rest) {
method join (line 132) | public static String join(String joiner, Collection<?> list) {
method flatJoin (line 140) | public static String flatJoin(String joiner, Collection<?>... lists) {
method joinWithPrefix (line 151) | public static String joinWithPrefix(String joiner, String prefix, Obje...
method joinWithPrefix (line 163) | public static String joinWithPrefix(String joiner, String prefix, Coll...
method joinConjunct (line 177) | public static String joinConjunct(String lastJoiner, List<String> list) {
method joinConjunct (line 187) | public static String joinConjunct(String joiner, String lastJoiner, Li...
method joinConjunct (line 205) | public static String joinConjunct(List<String> list, String joiner, St...
method toTitleCase (line 234) | public static String toTitleCase(String text) {
method toTitleCase (line 244) | public static String toTitleCase(String text, boolean midClause) {
method isPresent (line 275) | public static boolean isPresent(String s) {
method pluralize (line 302) | public static String pluralize(String s, Integer howMany, boolean assu...
method pluralize (line 326) | public static String pluralize(String s, Integer howMany) {
method pluralize (line 335) | public static String pluralize(String s, String howMany) {
method parenthesize (line 352) | public static String parenthesize(String s) {
method formatMap (line 363) | public static <T, U> List<String> formatMap(Map<T, U> map, BiFunction<...
method joiningNonEmpty (line 371) | public static <T> JoiningNonEmptyCollector<T> joiningNonEmpty(String d...
method joiningNonEmpty (line 386) | public static <T> JoiningNonEmptyCollector<T> joiningNonEmpty(String d...
method joiningConjunct (line 395) | public static <T> JoiningNonEmptyCollector<T> joiningConjunct(String f...
method joiningConjunct (line 412) | public static <T> JoiningNonEmptyCollector<T> joiningConjunct(String f...
method numberAsWords (line 428) | public static String numberAsWords(int number) {
method toOrdinal (line 470) | public static String toOrdinal(Integer n) {
method toOrdinal (line 480) | public static String toOrdinal(String level) {
method toAnchorTag (line 488) | public static String toAnchorTag(String x) {
method markdownLinkToHtml (line 496) | public static String markdownLinkToHtml(String x) {
method supplier (line 516) | @Override
method accumulator (line 521) | @Override
method combiner (line 530) | @Override
method finisher (line 538) | @Override
method characteristics (line 548) | @Override
FILE: src/main/java/dev/ebullient/convert/VersionProvider.java
class VersionProvider (line 10) | public class VersionProvider implements CommandLine.IVersionProvider {
method getVersion (line 12) | @Override
FILE: src/main/java/dev/ebullient/convert/config/CompendiumConfig.java
class CompendiumConfig (line 32) | @RegisterForReflection
type DiceRoller (line 35) | public enum DiceRoller {
method enabled (line 41) | public boolean enabled() {
method useFantasyStatblocks (line 45) | public boolean useFantasyStatblocks() {
method useDiceRolls (line 49) | public boolean useDiceRolls(ParseState state) {
method decorate (line 57) | public boolean decorate(ParseState state) {
method fromAttributes (line 65) | static DiceRoller fromAttributes(Boolean useDiceRoller, Boolean yaml...
method CompendiumConfig (line 106) | CompendiumConfig(Datasource datasource, Tui tui) {
method parseState (line 111) | public ParseState parseState() {
method tui (line 115) | public Tui tui() {
method datasource (line 119) | public Datasource datasource() {
method useDiceRoller (line 123) | public DiceRoller useDiceRoller() {
method reprintBehavior (line 127) | public ReprintBehavior reprintBehavior() {
method racesAsSpecies (line 131) | public boolean racesAsSpecies() {
method splitRules (line 135) | public boolean splitRules() {
method onlyReferencedTables (line 139) | public boolean onlyReferencedTables() {
method allSources (line 143) | public boolean allSources() {
method noSources (line 147) | public boolean noSources() {
method onlySources (line 151) | public boolean onlySources(List<String> sources) {
method readSource (line 155) | public boolean readSource(Path p, List<Fix> fixes, BiConsumer<String, ...
method sourceIncluded (line 159) | public boolean sourceIncluded(String source) {
method sourcesIncluded (line 169) | public boolean sourcesIncluded(List<String> sources) {
method sourceIncluded (line 179) | public boolean sourceIncluded(CompendiumSources source) {
method keyIsIncluded (line 186) | public Optional<Boolean> keyIsIncluded(String key) {
method groupIsIncluded (line 197) | public boolean groupIsIncluded(String group) {
method rulesVaultRoot (line 201) | public String rulesVaultRoot() {
method compendiumVaultRoot (line 205) | public String compendiumVaultRoot() {
method rulesFilePath (line 209) | public Path rulesFilePath() {
method compendiumFilePath (line 213) | public Path compendiumFilePath() {
method tagOf (line 217) | public String tagOf(String... tag) {
method tagOfRaw (line 223) | public String tagOfRaw(String tag) {
method resolveBooks (line 227) | public List<String> resolveBooks() {
method resolveAdventures (line 243) | public List<String> resolveAdventures() {
method resolveHomebrew (line 259) | public Collection<String> resolveHomebrew() {
method getCustomTemplate (line 264) | public Path getCustomTemplate(String id) {
method readConfigurationIfPresent (line 268) | public void readConfigurationIfPresent(JsonNode node) {
method allowSource (line 276) | void allowSource(String source) {
method allowSources (line 298) | void allowSources(List<String> sources) {
method addExcludePattern (line 307) | private void addExcludePattern(String value) {
method pathAttributes (line 319) | private PathAttributes pathAttributes() {
method imageOptions (line 326) | ImageOptions imageOptions() {
class Configurator (line 336) | public static class Configurator {
method Configurator (line 340) | public Configurator(Tui tui) {
method Configurator (line 344) | public Configurator(CompendiumConfig compendiumConfig) {
method allowSource (line 348) | public void allowSource(String src) {
method setSourceIdAlias (line 353) | public void setSourceIdAlias(String src, String id) {
method setTemplatePaths (line 358) | public void setTemplatePaths(TemplatePaths templatePaths) {
method setUseDiceRoller (line 364) | public void setUseDiceRoller(DiceRoller useDiceRoller) {
method readConfiguration (line 370) | public boolean readConfiguration(Path configPath) {
method readConfigIfPresent (line 394) | public void readConfigIfPresent(JsonNode node) {
method readConfig (line 401) | private void readConfig(CompendiumConfig config, JsonNode node) {
method userConfigPresent (line 457) | private static boolean userConfigPresent(JsonNode node) {
class PathAttributes (line 462) | private static class PathAttributes {
method PathAttributes (line 469) | PathAttributes() {
method PathAttributes (line 472) | public PathAttributes(PathAttributes old, VaultPaths paths) {
method toRoot (line 492) | private static String toRoot(String value) {
method toFilesystemRoot (line 501) | private static Path toFilesystemRoot(String root) {
method toVaultRoot (line 508) | private static String toVaultRoot(String root) {
FILE: src/main/java/dev/ebullient/convert/config/Datasource.java
type Datasource (line 8) | public enum Datasource {
method Datasource (line 14) | Datasource(String... format) {
method shortName (line 18) | public String shortName() {
method matchDatasource (line 22) | public static Datasource matchDatasource(String input) {
class DatasourceCandidates (line 33) | public static class DatasourceCandidates extends ArrayList<String> {
method DatasourceCandidates (line 34) | DatasourceCandidates() {
FILE: src/main/java/dev/ebullient/convert/config/ReprintBehavior.java
type ReprintBehavior (line 3) | public enum ReprintBehavior {
FILE: src/main/java/dev/ebullient/convert/config/TemplatePaths.java
class TemplatePaths (line 11) | public class TemplatePaths {
method setCustomTemplate (line 16) | public void setCustomTemplate(String key, Path path) {
method setBackgroundTemplatePath (line 32) | @Option(names = { "--background" }, order = 1, hidden = true, descript...
method setClassTemplatePath (line 37) | @Option(names = { "--class" }, order = 2, hidden = true, description =...
method setDeityTemplatePath (line 42) | @Option(names = { "--deity" }, order = 3, hidden = true, description =...
method setFeatTemplatePath (line 47) | @Option(names = { "--feat" }, order = 4, hidden = true, description = ...
method setItemTemplatePath (line 52) | @Option(names = { "--item" }, order = 5, hidden = true, description = ...
method setMonsterTemplatePath (line 57) | @Option(names = { "--monster" }, order = 6, hidden = true, description...
method setNameTemplatePath (line 62) | @Option(names = { "--name" }, order = 7, hidden = true, description = ...
method setNoteTemplatePath (line 67) | @Option(names = { "--note" }, order = 8, hidden = true, description = ...
method setRaceTemplatePath (line 72) | @Option(names = { "--race" }, order = 9, hidden = true, description = ...
method setSpellTemplatePath (line 77) | @Option(names = { "--spell" }, order = 10, hidden = true, description ...
method setSubclassTemplatePath (line 82) | @Option(names = { "--subclass" }, order = 11, hidden = true, descripti...
method get (line 87) | public Path get(String id) {
method verify (line 91) | public void verify(Tui tui) {
method toTemplateKey (line 115) | private String toTemplateKey(String key) {
method toConfigKey (line 119) | private String toConfigKey(String key) {
FILE: src/main/java/dev/ebullient/convert/config/TtrpgConfig.java
class TtrpgConfig (line 29) | public class TtrpgConfig {
method init (line 42) | public static void init(Tui tui) {
method init (line 46) | public static void init(Tui tui, Datasource datasource) {
method getConfig (line 57) | public static CompendiumConfig getConfig() {
method getConstant (line 64) | public static String getConstant(String key) {
method setToolsPath (line 68) | public static void setToolsPath(Path toolsPath) {
method activeDSConfig (line 72) | private static DatasourceConfig activeDSConfig() {
method getDefaultOutputSource (line 81) | public static String getDefaultOutputSource(IndexType type) {
method getDefaultOutputSource (line 85) | public static String getDefaultOutputSource(String key) {
method getFixes (line 89) | public static List<Fix> getFixes(String filepath) {
method sourceToLongName (line 93) | public static String sourceToLongName(String src) {
method sourceToAbbreviation (line 99) | public static String sourceToAbbreviation(String src) {
method sourcePublicationDate (line 103) | public static String sourcePublicationDate(String src) {
method getTemplateKeys (line 109) | public static Collection<String> getTemplateKeys() {
method addHomebrewSource (line 113) | public static boolean addHomebrewSource(String name, String abv, Strin...
method sourceToIdMapping (line 117) | public static void sourceToIdMapping(String id, String src) {
method includeAdditionalSource (line 122) | public static void includeAdditionalSource(String src) {
method addReferenceEntries (line 135) | public static void addReferenceEntries(Consumer<JsonNode> callback) {
class ImageRoot (line 144) | public static class ImageRoot {
method ImageRoot (line 150) | private ImageRoot(String cfgRoot, ImageOptions options) {
method getRootPath (line 177) | public String getRootPath() {
method getRootPathUrl (line 181) | public String getRootPathUrl() {
method copyInternalToVault (line 187) | public boolean copyInternalToVault() {
method copyExternalToVault (line 191) | public boolean copyExternalToVault() {
method getFallbackPath (line 195) | public String getFallbackPath(String key) {
method internalImageRoot (line 200) | public static ImageRoot internalImageRoot() {
method endWithSlash (line 220) | private static String endWithSlash(String path) {
method readIndex (line 227) | public static JsonNode readIndex(String key) {
method activeGlobalConfig (line 242) | public static JsonNode activeGlobalConfig(String key) {
method checkKnown (line 246) | public static void checkKnown(Collection<String> bookSources) {
method getFileSources (line 263) | public static Collection<String> getFileSources() {
method addDefaultAliases (line 268) | public static void addDefaultAliases(Map<String, String> aliases) {
method readSystemConfig (line 273) | private static void readSystemConfig() {
method readSystemConfig (line 282) | protected static void readSystemConfig(JsonNode node) {
method readCommonSystemConfig (line 309) | protected static void readCommonSystemConfig(JsonNode source) {
class DatasourceConfig (line 325) | static class DatasourceConfig {
method findFixesFor (line 337) | public List<Fix> findFixesFor(String filepath) {
method addSource (line 346) | public boolean addSource(String name, String abv, String longAbv) {
class SourceReference (line 374) | @RegisterForReflection
method SourceReference (line 380) | SourceReference() {
method SourceReference (line 383) | SourceReference(String name) {
class Fix (line 388) | @RegisterForReflection
type ConfigKeys (line 395) | enum ConfigKeys implements JsonNodeReader {
method getAs (line 415) | public <T> T getAs(JsonNode node, TypeReference<T> ref) {
method getAsMap (line 422) | Map<String, String> getAsMap(JsonNode node) {
method getAsKeyLowerMap (line 429) | Map<String, String> getAsKeyLowerMap(JsonNode node) {
method getAsKeyLowerRefMap (line 441) | Map<String, SourceReference> getAsKeyLowerRefMap(JsonNode node) {
method getAsList (line 455) | List<String> getAsList(JsonNode node) {
FILE: src/main/java/dev/ebullient/convert/config/UserConfig.java
class UserConfig (line 18) | @RegisterForReflection
method references (line 55) | List<String> references() {
type ConfigKeys (line 64) | enum ConfigKeys {
method ConfigKeys (line 88) | ConfigKeys() {
method ConfigKeys (line 92) | ConfigKeys(List<String> aliases) {
method get (line 96) | JsonNode get(JsonNode node) {
class VaultPaths (line 109) | @RegisterForReflection
class Sources (line 116) | @RegisterForReflection
class ImageOptions (line 127) | @RegisterForReflection
method ImageOptions (line 135) | public ImageOptions() {
method ImageOptions (line 138) | public ImageOptions(ImageOptions images, ImageOptions images2) {
method copyExternal (line 159) | public boolean copyExternal() {
method copyInternal (line 163) | public boolean copyInternal() {
method fallbackPaths (line 167) | public Map<String, String> fallbackPaths() {
FILE: src/main/java/dev/ebullient/convert/io/FontRef.java
class FontRef (line 3) | public class FontRef {
method FontRef (line 11) | private FontRef(String fontFamily, String sourcePath) {
method addTextReference (line 16) | public void addTextReference() {
method hasTextReference (line 20) | public boolean hasTextReference() {
method toString (line 24) | @Override
method fontFamily (line 29) | public static String fontFamily(String fontPath) {
method of (line 43) | public static FontRef of(String fontString) {
method of (line 47) | public static FontRef of(String fontFamily, String fontString) {
FILE: src/main/java/dev/ebullient/convert/io/MarkdownDoclet.java
class MarkdownDoclet (line 52) | public class MarkdownDoclet implements Doclet {
method getArgumentCount (line 67) | @Override
method getDescription (line 72) | @Override
method getKind (line 77) | @Override
method getNames (line 82) | @Override
method getParameters (line 87) | @Override
method getValue (line 92) | public String getValue() {
method process (line 96) | @Override
method init (line 103) | @Override
method getName (line 108) | @Override
method getSupportedSourceVersion (line 113) | @Override
method getSupportedOptions (line 118) | @Override
method run (line 123) | @Override
method processFiles (line 143) | protected void processFiles(DocletEnvironment environment) throws IOEx...
method debugFile (line 191) | private void debugFile(String type, Name name, Path outFile) {
method writeReferenceFile (line 196) | protected void writeReferenceFile(DocTrees docTrees, TypeElement t) th...
method processElement (line 260) | protected void processElement(DocTrees docTrees, Map<String, Element> ...
method writeReadmeFile (line 299) | void writeReadmeFile(DocTrees docTrees, PackageElement p) throws IOExc...
method isQute (line 344) | private boolean isQute(QualifiedNameable e) {
method isIgnored (line 348) | boolean isIgnored(Element element) {
method isIncludedVerbatim (line 354) | boolean isIncludedVerbatim(Element element) {
method isExcluded (line 358) | boolean isExcluded(Element element) {
method getDescription (line 373) | String getDescription(DocTrees docTrees, TypeElement te) {
method getOutputFile (line 389) | Path getOutputFile(QualifiedNameable element) throws IOException {
method getSuperclassElement (line 398) | static TypeElement getSuperclassElement(TypeElement typeElement) {
method qualifiedNameToPath (line 412) | String qualifiedNameToPath(QualifiedNameable element) {
method qualifiedNameToPath (line 416) | String qualifiedNameToPath(String reference) {
type MarkdownOption (line 432) | static interface MarkdownOption extends Option {
method getValue (line 433) | String getValue();
class Aggregator (line 436) | class Aggregator {
method addFullBody (line 440) | void addFullBody(DocCommentTree docCommentTree) {
method addAll (line 447) | void addAll(List<? extends DocTree> docTrees) {
method add (line 456) | void add(DocTree docTree) {
method maybeGetQualifiedName (line 530) | private String maybeGetQualifiedName(String reference) {
method add (line 553) | void add(String text) {
method startEntity (line 561) | void startEntity(String text) {
method endEntity (line 569) | void endEntity(String text) {
method toString (line 575) | @Override
class HtmlElement (line 589) | static class HtmlElement {
method HtmlElement (line 595) | public HtmlElement(String text) {
method testOuter (line 605) | public void testOuter(HtmlElement peek) {
method add (line 615) | public void add(String text) {
method end (line 619) | public void end(String text) {
method sanitize (line 626) | public String sanitize() {
method main (line 642) | public static void main(String[] args) {
method replacementFor (line 657) | private String replacementFor(String str) {
method isValidClass (line 674) | private boolean isValidClass(String className) {
FILE: src/main/java/dev/ebullient/convert/io/MarkdownWriter.java
class MarkdownWriter (line 29) | public class MarkdownWriter {
method MarkdownWriter (line 48) | public MarkdownWriter(Path output, Templates templates, Tui tui) {
method writeFiles (line 54) | public <T extends QuteBase> void writeFiles(Path basePath, List<T> ele...
method doWrite (line 120) | <T extends QuteBase> FileMap doWrite(FileMap fileMap, T qs, Map<String...
method writeFile (line 130) | void writeFile(FileMap fileMap, String content) throws IOException {
method writeNotes (line 138) | public void writeNotes(Path dir, Collection<QuteNote> notes, boolean c...
method writeIndexes (line 194) | public void writeIndexes(IndexContext ctx) {
method toTitle (line 213) | public static String toTitle(String dirName) {
method writeNote (line 217) | private void writeNote(Path targetDir, String fileName, QuteNote n) {
class IndexContext (line 227) | public static class IndexContext {
method IndexContext (line 236) | public IndexContext(Function<String, String> titleTransform, Functio...
method toTitle (line 241) | public String toTitle(String fileName) {
method accumulateEntry (line 245) | public void accumulateEntry(Path relativeDir, IndexEntry entry) {
method protectDir (line 250) | public void protectDir(Path relativeDir) {
method toString (line 258) | @Override
class FileMap (line 264) | @TemplateData
method FileMap (line 272) | public FileMap(String title, String fileName, Path dirName, boolean ...
method toString (line 279) | @Override
method hashCode (line 284) | @Override
method equals (line 293) | @Override
FILE: src/main/java/dev/ebullient/convert/io/Msg.java
type Msg (line 3) | public enum Msg {
method Msg (line 37) | private Msg(String prefix) {
method Msg (line 42) | private Msg(String prefix, String color) {
method color (line 47) | public String color(String message) {
method wrap (line 54) | public String wrap(String message) {
FILE: src/main/java/dev/ebullient/convert/io/NoStackTraceException.java
class NoStackTraceException (line 6) | public class NoStackTraceException extends RuntimeException {
method NoStackTraceException (line 9) | public NoStackTraceException(Throwable cause) {
method fillInStackTrace (line 13) | @Override
method flattenMessage (line 18) | private static String flattenMessage(Throwable cause) {
FILE: src/main/java/dev/ebullient/convert/io/Templates.java
class Templates (line 21) | @ApplicationScoped
method setCustomTemplates (line 32) | public void setCustomTemplates(CompendiumConfig config) {
method customTemplateOrDefault (line 37) | private Template customTemplateOrDefault(String id) throws RuntimeExce...
method render (line 65) | public String render(QuteBase resource) {
method renderInlineEmbedded (line 81) | public String renderInlineEmbedded(QuteUtil resource) {
method renderIndex (line 95) | public String renderIndex(String name, String vaultPath, Collection<In...
method renderCss (line 111) | public String renderCss(FontRef fontRef, InputStream data) throws IOEx...
FILE: src/main/java/dev/ebullient/convert/io/Tui.java
class Tui (line 70) | @ApplicationScoped
method instance (line 74) | public static Tui instance() {
method streamToWriter (line 87) | public final static PrintWriter streamToWriter(PrintStream stream) {
method slugifier (line 97) | static Slugify slugifier() {
method mapper (line 110) | public static ObjectMapper mapper(Path p) {
method yamlMapper (line 116) | private static ObjectMapper yamlMapper() {
method initMapper (line 133) | private static ObjectMapper initMapper(ObjectMapper mapper) {
method plainYaml (line 142) | public static Yaml plainYaml() {
method quotedYaml (line 160) | public static Yaml quotedYaml() {
method slugify (line 179) | public static String slugify(String s) {
method Tui (line 201) | public Tui() {
method init (line 213) | public void init(CommandSpec spec, boolean debug, boolean verbose) {
method init (line 217) | public void init(CommandSpec spec, boolean debug, boolean verbose, boo...
method onShutdown (line 246) | void onShutdown(@Observes ShutdownEvent event) {
method setOutputPath (line 250) | public void setOutputPath(Path output) {
method setTemplates (line 254) | public void setTemplates(Templates templates) {
method close (line 258) | public void close() {
method flush (line 265) | public void flush() {
method outLine (line 273) | private void outLine(String text, Text line) {
method errLine (line 280) | private void errLine(String text, Text line) {
method isDebug (line 287) | public boolean isDebug() {
method isVerbose (line 291) | public boolean isVerbose() {
method debugf (line 295) | public void debugf(String output, Object... params) {
method debugf (line 299) | public void debugf(Msg msg, String output, Object... params) {
method verbosef (line 311) | public void verbosef(String output, Object... params) {
method verbosef (line 315) | public void verbosef(Msg msg, String output, Object... params) {
method log (line 327) | public void log(Throwable t, boolean keepException) {
method logf (line 333) | public void logf(String output, Object... params) {
method logf (line 337) | public void logf(Msg msg, String output, Object... params) {
method progressf (line 347) | public void progressf(String output, Object... params) {
method infof (line 351) | public void infof(Msg msg, String output, Object... params) {
method infof (line 355) | public void infof(String output, Object... params) {
method warnf (line 360) | public void warnf(Msg msg, String output, Object... params) {
method warnf (line 364) | public void warnf(String output, Object... params) {
method printlnf (line 369) | public void printlnf(Msg msgType, String output, Object... params) {
method errorf (line 374) | public void errorf(String output, Object... params) {
method errorf (line 378) | public void errorf(Msg msgType, String output, Object... params) {
method errorf (line 382) | public void errorf(Throwable th, String output, Object... params) {
method errorf (line 386) | public void errorf(Throwable th, Msg msgType, String output, Object......
method error (line 391) | private void error(Throwable ex, String errorMsg) {
method format (line 400) | private String format(String output, Object... params) {
method throwInvalidArgumentException (line 407) | public void throwInvalidArgumentException(String message) {
method resolvePath (line 415) | public Optional<Path> resolvePath(Path path) {
method copyFonts (line 425) | public void copyFonts(Collection<FontRef> fonts) {
method copyImages (line 452) | public void copyImages(Collection<ImageRef> images) {
method copyImageResource (line 483) | private void copyImageResource(ImageRef image, Path targetPath) {
method copyRemoteImage (line 494) | private void copyRemoteImage(ImageRef image, Path targetPath) {
method readFile (line 517) | public boolean readFile(Path p, List<Fix> fixes, BiConsumer<String, Js...
method readDirectory (line 534) | public boolean readDirectory(String relative, Path dir, BiConsumer<Str...
method readToolsDir (line 565) | public boolean readToolsDir(Path toolsBase, BiConsumer<String, JsonNod...
method writeJsonFile (line 594) | public void writeJsonFile(Path outputFile, Map<String, Object> values)...
method writeYamlFile (line 602) | public void writeYamlFile(Path outputFile, Map<String, Object> values)...
method writeJsonFile (line 606) | public void writeJsonFile(Path outputFile, Object obj) throws IOExcept...
method writeYamlFile (line 614) | public void writeYamlFile(Path outputFile, Object obj) throws IOExcept...
method tryCopyFile (line 618) | public void tryCopyFile(Path source, Path target) {
method renderEmbedded (line 626) | public String renderEmbedded(QuteUtil resource) {
method readJsonValue (line 630) | public <T> T readJsonValue(JsonNode node, TypeReference<T> targetRef) {
method readJsonValue (line 641) | public <T> T readJsonValue(JsonNode node, Class<T> classTarget) {
method readTreeFromResource (line 652) | public static JsonNode readTreeFromResource(String resource) {
method jsonStringify (line 663) | public static String jsonStringify(Object o) {
method captureStackTrace (line 667) | public static String captureStackTrace(Throwable t, boolean keepExcept...
FILE: src/main/java/dev/ebullient/convert/qute/ImageRef.java
class ImageRef (line 30) | @TemplateData
method ImageRef (line 42) | private ImageRef(String url, Path sourcePath, Path targetFilePath, Str...
method escape (line 56) | String escape(String s) {
method getShortTitle (line 63) | public String getShortTitle() {
method titleAttribute (line 67) | private String titleAttribute() {
method getVaultPath (line 72) | public String getVaultPath() {
method getEmbeddedLink (line 76) | public String getEmbeddedLink(String anchor) {
method getEmbeddedLink (line 100) | public String getEmbeddedLink() {
method getEmbeddedLinkWithTitle (line 112) | @Deprecated
method getCaption (line 117) | @Deprecated
method getPath (line 122) | @Deprecated
method sourcePath (line 128) | public Path sourcePath() {
method targetFilePath (line 133) | public Path targetFilePath() {
method url (line 138) | public String url() {
class Builder (line 142) | public static class Builder {
method setSourcePath (line 153) | public Builder setSourcePath(Path sourcePath) {
method setInternalPath (line 158) | public Builder setInternalPath(String sourcePath) {
method setStreamSource (line 163) | public Builder setStreamSource(String glyph) {
method setTitle (line 168) | public Builder setTitle(String title) {
method setVaultRoot (line 173) | public Builder setVaultRoot(String vaultRoot) {
method setRootFilepath (line 178) | public Builder setRootFilepath(Path rootFilePath) {
method setRelativePath (line 183) | public Builder setRelativePath(Path relativeTarget) {
method setWidth (line 188) | public Builder setWidth(Integer width) {
method setUrl (line 193) | public Builder setUrl(String url) {
method build (line 198) | public ImageRef build() {
method build (line 248) | public ImageRef build(ImageRef previous) {
method escapeUrlImagePath (line 263) | public static String escapeUrlImagePath(String url) {
method fixUrl (line 287) | public static final String fixUrl(String sourceUrl) {
FILE: src/main/java/dev/ebullient/convert/qute/NamedText.java
class NamedText (line 17) | @TemplateData
method NamedText (line 29) | public NamedText(String name, String desc) {
method NamedText (line 35) | public NamedText(String name, Collection<String> text) {
method NamedText (line 45) | public NamedText(String name, Collection<String> text, Collection<Name...
method hasContent (line 55) | public boolean hasContent() {
method getKey (line 60) | public String getKey() {
method getCategory (line 65) | public String getCategory() {
method getText (line 70) | public String getText() {
method getValue (line 75) | public String getValue() {
method toString (line 79) | public String toString() {
class SortedBuilder (line 86) | public static class SortedBuilder {
method add (line 89) | public SortedBuilder add(String name, String text) {
method isEmpty (line 94) | public boolean isEmpty() {
method build (line 99) | public Collection<NamedText> build() {
FILE: src/main/java/dev/ebullient/convert/qute/QuteAltNames.java
type QuteAltNames (line 5) | public interface QuteAltNames {
method getAltNames (line 8) | default List<String> getAltNames() {
FILE: src/main/java/dev/ebullient/convert/qute/QuteBase.java
class QuteBase (line 21) | @TemplateData
method QuteBase (line 35) | public QuteBase(CompendiumSources sources, String name, String source,...
method getName (line 44) | public String getName() {
method getSource (line 49) | public String getSource() {
method getAliases (line 68) | @JavadocVerbatim
method getLabeledSource (line 83) | public String getLabeledSource() {
method getSourceAndPage (line 88) | public Collection<SourceAndPage> getSourceAndPage() {
method getBooks (line 98) | public final List<String> getBooks() {
method getReprintOf (line 105) | public Collection<Reprinted> getReprintOf() {
method getSourcesWithFootnote (line 119) | public String getSourcesWithFootnote() {
method getHasSections (line 146) | public boolean getHasSections() {
method vaultPath (line 150) | public void vaultPath(String vaultPath) {
method getVaultPath (line 155) | public String getVaultPath() {
method sources (line 162) | public CompendiumSources sources() {
method title (line 166) | public String title() {
method targetFile (line 170) | public String targetFile() {
method targetPath (line 174) | public String targetPath() {
method indexType (line 178) | @Override
method key (line 183) | public String key() {
method createIndex (line 187) | public boolean createIndex() {
method template (line 191) | public String template() {
method inlineNotes (line 196) | public Collection<QuteBase> inlineNotes() {
FILE: src/main/java/dev/ebullient/convert/qute/QuteNote.java
class QuteNote (line 16) | @TemplateData
method QuteNote (line 19) | public QuteNote(String name, String sourceText, List<String> text, Tag...
method QuteNote (line 23) | public QuteNote(String name, String sourceText, String text, Tags tags) {
method QuteNote (line 27) | public QuteNote(CompendiumSources sources, String name, String sourceT...
method title (line 31) | public String title() {
method targetFile (line 35) | public String targetFile() {
method targetPath (line 39) | public String targetPath() {
method template (line 43) | public String template() {
FILE: src/main/java/dev/ebullient/convert/qute/QuteUtil.java
type QuteUtil (line 10) | @JavadocIgnore
method isPresent (line 12) | default boolean isPresent(Map<?, ?> s) {
method isPresent (line 16) | default boolean isPresent(Collection<?> s) {
method isPresent (line 20) | default boolean isPresent(String s) {
method isPresent (line 24) | default boolean isPresent(Object s) {
method addIntegerUnlessEmpty (line 28) | default void addIntegerUnlessEmpty(Map<String, Object> map, String key...
method maybeAddBlankLine (line 34) | default void maybeAddBlankLine(List<String> content) {
method addUnlessEmpty (line 40) | default void addUnlessEmpty(Map<String, Object> map, String key, Strin...
method addUnlessEmpty (line 46) | default void addUnlessEmpty(Map<String, Object> map, String key, Colle...
method levelToString (line 52) | default String levelToString(String level) {
method template (line 65) | default String template() {
method indexType (line 69) | default IndexType indexType() {
type Renderable (line 73) | @JavadocIgnore
method render (line 76) | String render();
FILE: src/main/java/dev/ebullient/convert/qute/SourceAndPage.java
class SourceAndPage (line 14) | @RegisterForReflection
method SourceAndPage (line 22) | public SourceAndPage(JsonNode jsonElement) {
method SourceAndPage (line 27) | public SourceAndPage(String source, String page) {
method getLongName (line 33) | public String getLongName() {
method toString (line 37) | public String toString() {
method hashCode (line 48) | @Override
method equals (line 57) | @Override
FILE: src/main/java/dev/ebullient/convert/qute/TtrpgTemplateExtension.java
class TtrpgTemplateExtension (line 18) | @TemplateExtension
method asBonus (line 26) | @JavadocVerbatim
method capitalized (line 37) | @JavadocVerbatim
method capitalizedList (line 48) | @JavadocVerbatim
method uppercaseFirst (line 58) | @JavadocVerbatim
method lowercase (line 69) | @JavadocVerbatim
method transformText (line 84) | private static String transformText(String input, Function<String, Str...
method pluralizeLabel (line 159) | @JavadocVerbatim
method prefixSpace (line 169) | @JavadocVerbatim
method join (line 183) | @JavadocVerbatim
method joinConjunct (line 193) | @JavadocVerbatim
method jsonString (line 203) | @JavadocVerbatim
method skipFirst (line 213) | @JavadocVerbatim
method first (line 223) | @JavadocVerbatim
method size (line 233) | @JavadocVerbatim
method quotedEscaped (line 243) | @JavadocVerbatim
method quotedEscaped (line 253) | @JavadocVerbatim
FILE: src/main/java/dev/ebullient/convert/tools/CompendiumSources.java
class CompendiumSources (line 19) | @TemplateData
method CompendiumSources (line 35) | public CompendiumSources(IndexType type, String key, JsonNode jsonElem...
method getSourceText (line 45) | public String getSourceText() {
method getSources (line 52) | public Collection<String> getSources() {
method primarySourceTag (line 57) | String primarySourceTag() {
method findNode (line 63) | public abstract JsonNode findNode();
method findName (line 65) | protected abstract String findName(IndexType type, JsonNode jsonElement);
method initSources (line 67) | protected void initSources(JsonNode jsonElement) {
method findSourceText (line 110) | protected String findSourceText(IndexType type, JsonNode jsonElement) {
method isPrimarySource (line 165) | public boolean isPrimarySource(String source) {
method primarySource (line 169) | public String primarySource() {
method mapPrimarySource (line 176) | public String mapPrimarySource() {
method includedBy (line 181) | public boolean includedBy(Set<String> sources) {
method getKey (line 186) | public String getKey() {
method getName (line 190) | public String getName() {
method getType (line 194) | public IndexType getType() {
method getSourceAndPage (line 198) | public Collection<SourceAndPage> getSourceAndPage() {
method getReprints (line 202) | public Collection<Reprinted> getReprints() {
method toString (line 208) | @Override
method checkKnown (line 213) | public void checkKnown() {
method addReprint (line 217) | public void addReprint(CompendiumSources reprint) {
method isSynthetic (line 222) | protected boolean isSynthetic() {
type Fields (line 226) | protected enum Fields implements JsonNodeReader {
FILE: src/main/java/dev/ebullient/convert/tools/IndexType.java
type IndexType (line 5) | public interface IndexType {
method name (line 7) | String name();
method templateName (line 9) | String templateName();
method defaultSourceString (line 11) | String defaultSourceString();
method createKey (line 14) | String createKey(JsonNode node);
FILE: src/main/java/dev/ebullient/convert/tools/JsonCopyException.java
class JsonCopyException (line 3) | public class JsonCopyException extends RuntimeException {
method JsonCopyException (line 4) | public JsonCopyException(String message) {
method JsonCopyException (line 8) | public JsonCopyException(String message, Throwable cause) {
FILE: src/main/java/dev/ebullient/convert/tools/JsonNodeReader.java
type JsonNodeReader (line 23) | public interface JsonNodeReader {
method name (line 25) | String name();
method nodeName (line 27) | default String nodeName() {
method debugIfExists (line 31) | default void debugIfExists(JsonNode node, Tui tui) {
method appendUnlessEmptyFrom (line 37) | default void appendUnlessEmptyFrom(JsonNode x, List<String> text) {
method appendUnlessEmptyFrom (line 44) | default void appendUnlessEmptyFrom(JsonNode x, List<String> text, Json...
method bonusOrNull (line 51) | default String bonusOrNull(JsonNode x) {
method coerceBooleanOrDefault (line 72) | default boolean coerceBooleanOrDefault(JsonNode source, boolean value) {
method booleanOrDefault (line 86) | default boolean booleanOrDefault(JsonNode source, boolean value) {
method doubleOrDefault (line 91) | default Double doubleOrDefault(JsonNode source, double value) {
method doubleOrNull (line 96) | default Double doubleOrNull(JsonNode source) {
method existsIn (line 101) | default boolean existsIn(JsonNode source) {
method nestedExistsIn (line 108) | default boolean nestedExistsIn(JsonNodeReader field, JsonNode source) {
method isArrayIn (line 116) | default boolean isArrayIn(JsonNode source) {
method isObjectIn (line 123) | default boolean isObjectIn(JsonNode source) {
method fieldFromTo (line 130) | default <T> T fieldFromTo(JsonNode source, Class<T> classTarget, Tui t...
method fieldFromTo (line 134) | default <T> T fieldFromTo(JsonNode source, TypeReference<T> targetRef,...
method getFrom (line 138) | default JsonNode getFrom(JsonNode source) {
method getObjectFrom (line 149) | default Optional<JsonNode> getObjectFrom(JsonNode source) {
method getFromOrEmptyObjectNode (line 153) | default JsonNode getFromOrEmptyObjectNode(JsonNode source) {
method getFirstFromArray (line 168) | default JsonNode getFirstFromArray(JsonNode source) {
method getFieldFrom (line 179) | default JsonNode getFieldFrom(JsonNode source, JsonNodeReader field) {
method getListOfStrings (line 187) | default List<String> getListOfStrings(JsonNode source, Tui tui) {
method getMapOfStrings (line 204) | default Map<String, String> getMapOfStrings(JsonNode source, Tui tui) {
method getTextOrDefault (line 218) | default String getTextOrDefault(JsonNode x, String value) {
method getTextOrEmpty (line 223) | default String getTextOrEmpty(JsonNode x) {
method getTextOrNull (line 228) | default String getTextOrNull(JsonNode x) {
method getTextOrThrow (line 233) | default String getTextOrThrow(JsonNode x) {
method getTextFrom (line 241) | default Optional<String> getTextFrom(JsonNode x) {
method intFrom (line 248) | default Optional<Integer> intFrom(JsonNode source) {
method intOrDefault (line 253) | default int intOrDefault(JsonNode source, int value) {
method intOrNull (line 258) | default Integer intOrNull(JsonNode source) {
method intOrThrow (line 263) | default int intOrThrow(JsonNode x) {
method joinAndReplace (line 271) | default String joinAndReplace(JsonNode source, JsonTextConverter<?> re...
method joinAndReplace (line 275) | default String joinAndReplace(JsonNode source, JsonTextConverter<?> re...
method linkifyListFrom (line 287) | default <T extends IndexType> List<String> linkifyListFrom(JsonNode no...
method replaceTextFrom (line 292) | default String replaceTextFrom(JsonNode node, JsonTextConverter<?> rep...
method replaceTextFromList (line 296) | default List<String> replaceTextFromList(JsonNode node, JsonTextConver...
method size (line 301) | default int size(JsonNode source) {
method streamFrom (line 309) | default Stream<JsonNode> streamFrom(JsonNode source) {
method streamProps (line 320) | default Stream<Entry<String, JsonNode>> streamProps(JsonNode source) {
method streamPropsExcluding (line 325) | default Stream<Entry<String, JsonNode>> streamPropsExcluding(JsonNode ...
method transformTextFrom (line 339) | default String transformTextFrom(JsonNode source, String join, JsonTex...
method transformTextFrom (line 353) | default String transformTextFrom(JsonNode source, String delimiter, Js...
method transformListFrom (line 367) | default List<String> transformListFrom(JsonNode source, JsonTextConver...
method getEnumValueFrom (line 377) | default <E extends Enum<E>> E getEnumValueFrom(JsonNode source, Class<...
type FieldValue (line 394) | interface FieldValue {
method name (line 395) | String name();
method value (line 397) | default String value() {
method isValueOfField (line 401) | default boolean isValueOfField(JsonNode source, JsonNodeReader field) {
method matches (line 405) | default boolean matches(String value) {
method valueFrom (line 409) | static <E extends Enum<E> & FieldValue> E valueFrom(String value, Cl...
method valueEquals (line 417) | default boolean valueEquals(JsonNode previous, JsonNode next) {
method readArrayFrom (line 431) | default ArrayNode readArrayFrom(JsonNode source) {
method iterateArrayFrom (line 438) | default Iterable<JsonNode> iterateArrayFrom(JsonNode source) {
method iterateFieldsFrom (line 445) | default Iterable<Entry<String, JsonNode>> iterateFieldsFrom(JsonNode s...
method ensureArrayIn (line 456) | default ArrayNode ensureArrayIn(JsonNode target) {
method copyFrom (line 463) | default JsonNode copyFrom(JsonNode source) {
method removeFrom (line 468) | default JsonNode removeFrom(JsonNode target) {
method setIn (line 476) | default void setIn(JsonNode target, JsonNode value) {
method setIn (line 481) | default void setIn(JsonNode target, String value) {
method setIn (line 486) | default void setIn(JsonNode target, boolean b) {
method copy (line 491) | default void copy(JsonNode source, JsonNode target) {
method link (line 502) | default void link(JsonNode source, JsonNode target) {
method moveFrom (line 513) | default void moveFrom(JsonNode source, JsonNode target) {
method appendToArray (line 524) | default void appendToArray(JsonNode target, String value) {
method appendToArray (line 533) | default void appendToArray(JsonNode target, JsonNode value) {
FILE: src/main/java/dev/ebullient/convert/tools/JsonSourceCopier.java
class JsonSourceCopier (line 27) | public abstract class JsonSourceCopier<T extends IndexType> implements J...
method getOriginNode (line 31) | protected abstract JsonNode getOriginNode(String key);
method mergePreserveKey (line 34) | protected abstract boolean mergePreserveKey(T type, String key);
method getCopyEntryProps (line 37) | protected abstract List<String> getCopyEntryProps();
method resolveDynamicVariable (line 47) | protected abstract JsonNode resolveDynamicVariable(
method mergeNodes (line 51) | protected abstract JsonNode mergeNodes(T type, String originKey, JsonN...
method handleCopy (line 54) | public JsonNode handleCopy(T type, JsonNode copyTo) {
method copyValues (line 87) | protected void copyValues(T type, JsonNode copyFrom, ObjectNode copyTo...
method applyMods (line 122) | protected void applyMods(String originKey, JsonNode copyFrom, ObjectNo...
method doMod (line 147) | private void doMod(String originKey, ObjectNode target, JsonNode copyF...
method doModProp (line 158) | protected void doModProp(
method doModProp (line 179) | protected void doModProp(String originKey, JsonNode modInfos, JsonNode...
method metaPreserveKey (line 193) | private static boolean metaPreserveKey(JsonNode _preserve, String key) {
method normalizeMods (line 197) | protected void normalizeMods(JsonNode copyMeta) {
method cleanupCopy (line 210) | protected void cleanupCopy(ObjectNode target, JsonNode copyFrom) {
method resolveDynamicText (line 225) | protected JsonNode resolveDynamicText(String originKey, JsonNode value...
method doSetProp (line 252) | private void doSetProp(String originKey, JsonNode modInfo, String prop...
method doSetProps (line 265) | private void doSetProps(String originKey, JsonNode modInfo, String pro...
method doPrefixSuffixStringProp (line 277) | private void doPrefixSuffixStringProp(String originKey, JsonNode modIn...
method nodePath (line 302) | private String nodePath(String propPath) {
method splitLastPropPath (line 306) | private String[] splitLastPropPath(String propPath) {
method doAppendText (line 312) | private void doAppendText(String originKey, JsonNode modInfo, JsonNode...
method doReplaceText (line 322) | private void doReplaceText(String originKey, JsonNode modInfo, JsonNod...
method copyReplaceText (line 377) | private JsonNode copyReplaceText(JsonNode sourceNode, Pattern replace,...
method doScalarAddProp (line 382) | private void doScalarAddProp(String originKey, JsonNode modInfo, Strin...
method doScalarMultProp (line 410) | private void doScalarMultProp(String originKey, JsonNode modInfo, Stri...
method doModArray (line 442) | private void doModArray(String originKey, ModFieldMode mode, JsonNode ...
method sortArrayNode (line 480) | protected ArrayNode sortArrayNode(ArrayNode array) {
method appendToArray (line 491) | protected void appendToArray(ArrayNode tgtArray, JsonNode items) {
method insertIntoArray (line 502) | protected void insertIntoArray(ArrayNode tgtArray, int index, JsonNode...
method appendIfNotExistsArr (line 516) | public void appendIfNotExistsArr(ArrayNode tgtArray, JsonNode items) {
method removeFromArray (line 532) | protected void removeFromArray(String originKey, JsonNode modInfo, Str...
method removeFromArr (line 552) | public void removeFromArr(ArrayNode tgtArray, JsonNode items) {
method renameInArray (line 561) | protected void renameInArray(String originKey, JsonNode modInfo, Array...
method replaceArray (line 576) | protected boolean replaceArray(String originKey, JsonNode modInfo, Arr...
method matchFirstIndexByName (line 603) | private int matchFirstIndexByName(String originKey, ArrayNode haystack...
method findIndexByName (line 620) | protected int findIndexByName(String originKey, ArrayNode haystack, St...
method findIndex (line 637) | private int findIndex(ArrayNode haystack, JsonNode needle) {
type MetaFields (line 646) | public enum MetaFields implements JsonNodeReader {
type TemplateVariable (line 690) | public enum TemplateVariable implements JsonNodeReader.FieldValue {
method notSupported (line 700) | public void notSupported(Tui tui, String originKey, JsonNode variabl...
method valueFrom (line 705) | public static TemplateVariable valueFrom(String value) {
type ModFieldMode (line 710) | public enum ModFieldMode implements JsonNodeReader.FieldValue {
method notSupported (line 746) | public void notSupported(Tui tui, String originKey, JsonNode modInfo) {
method getModMode (line 751) | public static ModFieldMode getModMode(JsonNode source) {
FILE: src/main/java/dev/ebullient/convert/tools/JsonTextConverter.java
type JsonTextConverter (line 34) | public interface JsonTextConverter<T extends IndexType> {
method appendToText (line 46) | void appendToText(List<String> inner, JsonNode target, String heading);
method tui (line 48) | Tui tui();
method cfg (line 50) | CompendiumConfig cfg();
method mapper (line 52) | default ObjectMapper mapper() {
method parseState (line 56) | default ParseState parseState() {
method copyNode (line 60) | default JsonNode copyNode(JsonNode sourceNode) {
method createNode (line 70) | default JsonNode createNode(String source) {
method isEmpty (line 80) | default boolean isEmpty(JsonNode node) {
method isArrayNode (line 87) | default boolean isArrayNode(JsonNode node) {
method isObjectNode (line 91) | default boolean isObjectNode(JsonNode node) {
method objectIntersect (line 95) | default JsonNode objectIntersect(JsonNode a, JsonNode b) {
method replaceWithDiceRoller (line 110) | default String replaceWithDiceRoller(String input) {
method formatDice (line 216) | default String formatDice(String rollString, String displayText, DiceF...
method diceFormula (line 259) | default String diceFormula(String diceRoll) {
method diceFormula (line 264) | default String diceFormula(String diceRoll, String displayText, boolea...
method codeString (line 278) | default String codeString(String text, DiceFormulaState formulaState) {
method simplifyFormattedDiceText (line 287) | default String simplifyFormattedDiceText(String text) {
method replaceTokens (line 320) | default String replaceTokens(String input, BiFunction<String, Boolean,...
method iterableElements (line 364) | default Iterable<JsonNode> iterableElements(JsonNode source) {
method iterableEntries (line 374) | default Iterable<JsonNode> iterableEntries(JsonNode source) {
method iterableFields (line 382) | default Iterable<Entry<String, JsonNode>> iterableFields(JsonNode sour...
method iterableFieldNames (line 389) | default Iterable<String> iterableFieldNames(JsonNode source) {
method linkify (line 396) | String linkify(T type, String s);
method appendListItem (line 399) | default void appendListItem(List<String> text, JsonNode itemNode) {
method flattenToString (line 409) | default String flattenToString(JsonNode node) {
method flattenToString (line 413) | default String flattenToString(JsonNode node, String join) {
method maybeAddBlankLine (line 426) | default void maybeAddBlankLine(List<String> text) {
method nestedEmbed (line 436) | default String nestedEmbed(List<String> content) {
method prependField (line 448) | default boolean prependField(JsonNode entry, JsonNodeReader field, Lis...
method prependField (line 453) | default boolean prependField(String name, List<String> inner) {
method prependText (line 475) | default void prependText(String prefix, List<String> inner) {
method prependText (line 488) | default String prependText(String prefix, String text) {
method prependTextMakeListItem (line 493) | default void prependTextMakeListItem(List<String> text, JsonNode e, St...
method removePreamble (line 503) | default List<String> removePreamble(List<String> content) {
method renderEmbeddedTemplate (line 535) | default String renderEmbeddedTemplate(QuteBase resource, String admoni...
method renderEmbeddedTemplate (line 549) | default void renderEmbeddedTemplate(List<String> text, QuteBase resour...
method renderInlineTemplate (line 574) | default String renderInlineTemplate(QuteUtil resource, String admoniti...
method renderInlineTemplate (line 588) | default void renderInlineTemplate(List<String> text, QuteUtil resource...
method wrapAdmonition (line 602) | default void wrapAdmonition(List<String> inner, String admonition) {
method balanceBackticks (line 616) | private void balanceBackticks(List<String> inner) {
method outerAdmonitionIndices (line 637) | default int[] outerAdmonitionIndices(List<String> inner) {
method replaceText (line 662) | String replaceText(String s);
method replaceText (line 664) | default String replaceText(JsonNode input) {
method slugify (line 674) | default String slugify(String s) {
method ensureArray (line 678) | default ArrayNode ensureArray(JsonNode source) {
method ensureObjectNode (line 688) | default ObjectNode ensureObjectNode(JsonNode source) {
method streamOf (line 698) | default Stream<JsonNode> streamOf(JsonNode source) {
method streamOfFieldNames (line 708) | default Stream<String> streamOfFieldNames(JsonNode source) {
method streamProps (line 715) | default Stream<Entry<String, JsonNode>> streamProps(JsonNode source) {
method streamPropsExcluding (line 719) | default Stream<Entry<String, JsonNode>> streamPropsExcluding(JsonNode ...
method createLink (line 731) | default String createLink(String displayText, Path target, String anch...
method createLink (line 743) | default String createLink(String displayText, Path target, String anch...
method toListOfStrings (line 754) | default List<String> toListOfStrings(JsonNode source) {
type SourceField (line 764) | enum SourceField implements JsonNodeReader {
method SourceField (line 784) | SourceField() {
method SourceField (line 788) | SourceField(String nodeName) {
method nodeName (line 792) | public String nodeName() {
method getTextOrDefault (line 796) | @Override
method getTextOrEmpty (line 804) | @Override
method getTextOrNull (line 812) | @Override
method replaceTextFrom (line 820) | @Override
FILE: src/main/java/dev/ebullient/convert/tools/MarkdownConverter.java
type MarkdownConverter (line 5) | public interface MarkdownConverter {
method writeAll (line 7) | MarkdownConverter writeAll();
method writeFiles (line 9) | MarkdownConverter writeFiles(List<? extends IndexType> types);
method writeFiles (line 11) | MarkdownConverter writeFiles(IndexType type);
method writeImages (line 13) | MarkdownConverter writeImages();
FILE: src/main/java/dev/ebullient/convert/tools/ParseState.java
class ParseState (line 18) | public class ParseState {
type ParseStateField (line 20) | enum ParseStateField implements JsonNodeReader {
class ParseStateInfo (line 25) | public static class ParseStateInfo {
method ParseStateInfo (line 36) | private ParseStateInfo() {
method ParseStateInfo (line 40) | private ParseStateInfo(String src) {
method ParseStateInfo (line 44) | private ParseStateInfo(String src, int page) {
method ParseStateInfo (line 48) | private ParseStateInfo(String src, int page, String listIndent) {
method setInList (line 54) | private ParseStateInfo setInList(boolean inList) {
method setInFootnotes (line 59) | private ParseStateInfo setInFootnotes(boolean inFootnotes) {
method setInHtmlTable (line 64) | private ParseStateInfo setInHtmlTable(boolean inTable) {
method setInMarkdownTable (line 69) | private ParseStateInfo setInMarkdownTable(boolean inTable) {
method setInFeatureType (line 74) | private ParseStateInfo setInFeatureType(int inFeatureType) {
method setInTrait (line 79) | private ParseStateInfo setInTrait(boolean inTrait) {
method setTheRest (line 84) | private ParseStateInfo setTheRest(ParseStateInfo prev) {
method srcAndPage (line 94) | private static ParseStateInfo srcAndPage(ParseStateInfo prev, String...
method changePage (line 105) | private static ParseStateInfo changePage(ParseStateInfo prev, int pa...
method inFootnotes (line 114) | private static ParseStateInfo inFootnotes(ParseStateInfo prev, boole...
method inHtmlTable (line 123) | private static ParseStateInfo inHtmlTable(ParseStateInfo prev, boole...
method inMarkdownTable (line 133) | private static ParseStateInfo inMarkdownTable(ParseStateInfo prev, b...
method indentList (line 143) | private static ParseStateInfo indentList(ParseStateInfo prev) {
method indentList (line 152) | private static ParseStateInfo indentList(ParseStateInfo prev, String...
method pushFeatureType (line 161) | private static ParseStateInfo pushFeatureType(ParseStateInfo prev) {
method pushTrait (line 170) | private static ParseStateInfo pushTrait(ParseStateInfo prev) {
method push (line 183) | public boolean push(CompendiumSources sources, JsonNode rootNode) {
method push (line 190) | public boolean push(CompendiumSources sources) {
method push (line 197) | public boolean push(JsonNode node) {
method push (line 203) | public boolean push(String src, int page) {
method pushFootnotes (line 225) | public boolean pushFootnotes(boolean inFootnotes) {
method pushHtmlTable (line 230) | public boolean pushHtmlTable(boolean inTable) {
method pushMarkdownTable (line 235) | public boolean pushMarkdownTable(boolean inTable) {
method indentList (line 244) | public boolean indentList() {
method indentList (line 249) | public boolean indentList(String value) {
method pushFeatureType (line 254) | public boolean pushFeatureType() {
method pushTrait (line 259) | public boolean pushTrait() {
method pop (line 264) | public void pop(boolean pushed) {
method getListIndent (line 275) | public String getListIndent() {
method inFootnotes (line 280) | public boolean inFootnotes() {
method inList (line 285) | public boolean inList() {
method inHtmlTable (line 290) | public boolean inHtmlTable() {
method inMarkdownTable (line 295) | public boolean inMarkdownTable() {
method inTable (line 300) | public boolean inTable() {
method inTrait (line 305) | public boolean inTrait() {
method featureTypeDepth (line 310) | public int featureTypeDepth() {
method sourcePageString (line 315) | public String sourcePageString() {
method sourcePageString (line 324) | public String sourcePageString(String formatString) {
method longSourcePageString (line 332) | public String longSourcePageString(String formatString) {
method getSource (line 341) | public String getSource() {
method getSource (line 346) | public String getSource(Tools5eIndexType type) {
method getSource (line 354) | public String getSource(Pf2eIndexType type) {
method getPage (line 362) | public String getPage() {
method toSourceAndPage (line 367) | public SourceAndPage toSourceAndPage() {
method addCitation (line 371) | public void addCitation(String key, String citationText) {
method popCitations (line 378) | public void popCitations(List<String> footerEntries) {
method diceFormulaState (line 390) | public DiceFormulaState diceFormulaState() {
class DiceFormulaState (line 394) | public static class DiceFormulaState {
method DiceFormulaState (line 398) | public DiceFormulaState(ParseState parseState) {
method noRoller (line 407) | public boolean noRoller() {
method plainText (line 412) | public boolean plainText() {
FILE: src/main/java/dev/ebullient/convert/tools/Tags.java
class Tags (line 12) | public class Tags {
method Tags (line 16) | public Tags() {
method Tags (line 20) | public Tags(CompendiumSources sources) {
method addSourceTags (line 25) | public void addSourceTags(CompendiumSources sources) {
method addRaw (line 33) | public void addRaw(String... rawValues) {
method add (line 39) | public void add(String... segments) {
method build (line 44) | public Set<String> build() {
method toString (line 48) | @Override
FILE: src/main/java/dev/ebullient/convert/tools/ToolsIndex.java
type ToolsIndex (line 16) | public interface ToolsIndex {
type TtrpgValue (line 18) | enum TtrpgValue implements JsonNodeReader {
method createIndex (line 30) | static ToolsIndex createIndex() {
method createIndex (line 35) | static ToolsIndex createIndex(Datasource game, CompendiumConfig config) {
method cfg (line 42) | CompendiumConfig cfg();
method rulesVaultRoot (line 44) | default String rulesVaultRoot() {
method compendiumVaultRoot (line 48) | default String compendiumVaultRoot() {
method rulesFilePath (line 52) | default Path rulesFilePath() {
method compendiumFilePath (line 56) | default Path compendiumFilePath() {
method resolveSources (line 60) | default boolean resolveSources(Path toolsPath) {
method prepare (line 82) | void prepare();
method notPrepared (line 84) | boolean notPrepared();
method importTree (line 86) | ToolsIndex importTree(String filename, JsonNode node);
method markdownConverter (line 88) | MarkdownConverter markdownConverter(MarkdownWriter writer);
method writeFullIndex (line 90) | void writeFullIndex(Path resolve) throws IOException;
method writeFilteredIndex (line 92) | void writeFilteredIndex(Path resolve) throws IOException;
method getBook (line 94) | JsonNode getBook(String b);
method getAdventure (line 96) | JsonNode getAdventure(String a);
FILE: src/main/java/dev/ebullient/convert/tools/dnd5e/BackgroundTraits2Note.java
class BackgroundTraits2Note (line 13) | public class BackgroundTraits2Note extends Json2QuteCommon {
method BackgroundTraits2Note (line 17) | public BackgroundTraits2Note(Tools5eIndex index) {
method buildNotes (line 21) | public List<QuteNote> buildNotes() {
method addIfPresent (line 32) | private void addIfPresent(List<QuteNote> notes, Set<String> table, Str...
method addIdealsIfPresent (line 57) | private void addIdealsIfPresent(List<QuteNote> notes) {
method tableSection (line 175) | List<String> tableSection(String title, List<String> elements) {
method listToTable (line 182) | List<String> listToTable(String tableHeading, List<String> elements) {
FILE: src/main/java/dev/ebullient/convert/tools/dnd5e/HomebrewIndex.java
class HomebrewIndex (line 25) | public class HomebrewIndex implements JsonSource {
method HomebrewIndex (line 30) | HomebrewIndex(Tools5eIndex index) {
method importBrew (line 34) | public void importBrew(Consumer<HomebrewMetaTypes> processHomebrewTree) {
method getHomebrewMetaTypes (line 43) | public Collection<HomebrewMetaTypes> getHomebrewMetaTypes(Tools5eSourc...
method getHomebrewMetaTypes (line 54) | public HomebrewMetaTypes getHomebrewMetaTypes(String source) {
method findHomebrewSkillOrAbility (line 58) | public SkillOrAbility findHomebrewSkillOrAbility(String key, Tools5eSo...
method findHomebrewSpellSchool (line 69) | public SpellSchool findHomebrewSpellSchool(String code, Tools5eSources...
method findHomebrewType (line 80) | public ItemType findHomebrewType(String abbreviation, Tools5eSources s...
method findHomebrewMastery (line 92) | public ItemMastery findHomebrewMastery(String name, Tools5eSources sou...
method findHomebrewProperty (line 104) | public ItemProperty findHomebrewProperty(String code, Tools5eSources s...
method clear (line 115) | public void clear() {
method addHomebrewSourcesIfPresent (line 119) | public boolean addHomebrewSourcesIfPresent(String filename, JsonNode b...
class HomebrewMetaTypes (line 177) | static class HomebrewMetaTypes {
method HomebrewMetaTypes (line 193) | HomebrewMetaTypes(Set<String> sourceKeys, String filename, JsonNode ...
method getOptionalFeatureType (line 201) | public String getOptionalFeatureType(String key) {
method setOptionalFeatureType (line 205) | public void setOptionalFeatureType(String key, String value) {
method getPsionicType (line 209) | public PsionicType getPsionicType(String key) {
method setPsionicType (line 213) | public void setPsionicType(String key, JsonNode value) {
method getSkillType (line 222) | public SkillOrAbility getSkillType(String key) {
method setSkillType (line 226) | public void setSkillType(String key, JsonNode skillNode) {
method getSpellSchool (line 235) | public SpellSchool getSpellSchool(String key) {
method setSpellSchool (line 239) | public void setSpellSchool(String key, JsonNode spellNode) {
method getItemType (line 249) | public JsonNode getItemType(String abbreviation) {
method getItemProperty (line 253) | public JsonNode getItemProperty(String abbreviation) {
method getItemMastery (line 257) | public JsonNode getItemMastery(String name) {
method addCrossReference (line 261) | public void addCrossReference(Tools5eIndexType type, String key, Jso...
type HomebrewFields (line 286) | enum HomebrewFields implements JsonNodeReader {
method cfg (line 299) | @Override
method index (line 304) | @Override
method getSources (line 309) | @Override
FILE: src/main/java/dev/ebullient/convert/tools/dnd5e/ItemMastery.java
method toString (line 24) | public String toString() {
method linkify (line 28) | public String linkify() {
method linkify (line 32) | public String linkify(String linkText) {
method forKey (line 53) | public static ItemMastery forKey(String key) {
method fromNode (line 60) | public static ItemMastery fromNode(JsonNode mastery) {
method asLinks (line 76) | public static List<String> asLinks(Collection<ItemMastery> itemMasteries) {
method clear (line 82) | public static void clear() {
FILE: src/main/java/dev/ebullient/convert/tools/dnd5e/ItemProperty.java
method toString (line 29) | public String toString() {
method linkify (line 33) | public String linkify() {
method linkify (line 37) | public String linkify(String linkText) {
method forKey (line 59) | public static ItemProperty forKey(String key) {
method fromNode (line 66) | public static ItemProperty fromNode(JsonNode property) {
method asLinks (line 117) | public static List<String> asLinks(Collection<ItemProperty> properties) {
method customProperty (line 131) | public static ItemProperty customProperty(String name, String sectionNam...
method customProperty (line 150) | public static ItemProperty customProperty(String name, String abbreviati...
method clear (line 154) | public static void clear() {
method refTagToKey (line 158) | public static String refTagToKey(String text) {
method defaultItemSource (line 167) | private static String defaultItemSource(String code, String source) {
FILE: src/main/java/dev/ebullient/convert/tools/dnd5e/ItemTag.java
type ItemTag (line 10) | enum ItemTag {
method add (line 25) | void add(Tags tags, String... segments) {
method build (line 29) | String build(String... segments) {
FILE: src/main/java/dev/ebullient/convert/tools/dnd5e/ItemType.java
method toString (line 33) | public String toString() {
method linkify (line 37) | public String linkify() {
method linkify (line 41) | public String linkify(String linkText) {
method forKey (line 57) | public static ItemType forKey(String key) {
method fromNode (line 64) | public static ItemType fromNode(JsonNode typeNode) {
method tagForType (line 94) | public static String tagForType(ItemType type, Tui tui) {
method fixName (line 118) | private static String fixName(String abbreviation, String name) {
method mapGroup (line 129) | private static ItemTypeGroup mapGroup(String abbreviation, String lowerc...
method clear (line 176) | public static void clear() {
method refTagToKey (line 180) | public static String refTagToKey(String text) {
method defaultItemSource (line 189) | private static String defaultItemSource(String code, String source) {
FILE: src/main/java/dev/ebullient/convert/tools/dnd5e/ItemTypeGroup.java
type ItemTypeGroup (line 5) | @TemplateData
method hasGroup (line 16) | public boolean hasGroup(ItemType type, ItemType typeAlt) {
FILE: src/main/java/dev/ebullient/convert/tools/dnd5e/Json2QuteBackground.java
class Json2QuteBackground (line 16) | public class Json2QuteBackground extends Json2QuteCommon {
method Json2QuteBackground (line 25) | Json2QuteBackground(Tools5eIndex index, Tools5eIndexType type, JsonNod...
method buildQuteResource (line 30) | @Override
FILE: src/main/java/dev/ebullient/convert/tools/dnd5e/Json2QuteBastion.java
class Json2QuteBastion (line 21) | public class Json2QuteBastion extends Json2QuteCommon {
method Json2QuteBastion (line 25) | Json2QuteBastion(Tools5eIndex index, Tools5eIndexType type, JsonNode j...
method buildQuteResource (line 29) | @Override
method spaceForName (line 82) | private Space spaceForName(String name) {
type BastionFields (line 97) | enum BastionFields implements JsonNodeReader {
FILE: src/main/java/dev/ebullient/convert/tools/dnd5e/Json2QuteBook.java
class Json2QuteBook (line 12) | public class Json2QuteBook extends Json2QuteCommon {
method Json2QuteBook (line 19) | public Json2QuteBook(Tools5eIndex index, Tools5eIndexType type, JsonNo...
method getName (line 35) | @Override
method buildBook (line 47) | public List<Tools5eQuteNote> buildBook() {
FILE: src/main/java/dev/ebullient/convert/tools/dnd5e/Json2QuteClass.java
class Json2QuteClass (line 36) | public class Json2QuteClass extends Json2QuteCommon {
method Json2QuteClass (line 51) | Json2QuteClass(Tools5eIndex index, Tools5eIndexType type, JsonNode jso...
method getFileName (line 60) | @Override
method buildQuteResource (line 67) | @Override
method buildSubclasses (line 104) | public List<QuteSubclass> buildSubclasses() {
method getClassFeature (line 183) | private ClassFeature getClassFeature(String featureKey, Tools5eIndexTy...
method findClassFeatures (line 190) | List<ClassFeature> findClassFeatures(Tools5eIndexType featureType, Jso...
method addOptionalFeatureText (line 213) | void addOptionalFeatureText(JsonNode optFeatures, String primarySource...
method buildPrimaryAbility (line 245) | String buildPrimaryAbility() {
method buildHitDie (line 264) | HitPointDie buildHitDie() {
method buildStartingEquipment (line 282) | StartingEquipment buildStartingEquipment() {
method buildMulticlassing (line 315) | Multiclassing buildMulticlassing() {
method buildProgressionTable (line 363) | List<String> buildProgressionTable(List<ClassFeature> features, JsonNo...
method stripTableMarkdown (line 415) | private String stripTableMarkdown(JsonNode label, List<String> footnot...
method progressionAsTable (line 428) | List<String> progressionAsTable(List<String> headings,
method progressionColumnValue (line 493) | String progressionColumnValue(JsonNode c) {
method abilityRequirements (line 521) | String abilityRequirements(JsonNode reqNode, String joiner) {
method listOfArmorProficiencies (line 531) | List<String> listOfArmorProficiencies(JsonNode containingNode) {
method listOfSkillProfiencies (line 543) | List<String> listOfSkillProfiencies(JsonNode containingNode) {
method listOfWeaponProfiencies (line 586) | List<String> listOfWeaponProfiencies(JsonNode containingNode) {
method listOfToolProfiencies (line 602) | List<String> listOfToolProfiencies(JsonNode containingNode) {
method armorToLink (line 608) | String armorToLink(String armor) {
method skillChoices (line 620) | String skillChoices(Collection<String> skills, int numSkills) {
method equipmentDescription (line 641) | String equipmentDescription(JsonNode startingEquipment) {
method findClassFeature (line 669) | static ClassFeature findClassFeature(JsonSource converter, Tools5eInde...
method getClassFeature (line 685) | static ClassFeature getClassFeature(String featureKey) {
method ClassFeature (line 694) | public ClassFeature(Tools5eIndexType cfType, String key, JsonNode cfNo...
method linkifier (line 701) | protected Tools5eLinkifier linkifier() {
method getName (line 705) | public String getName() {
method level (line 709) | public String level() {
method appendLink (line 713) | void appendLink(JsonSource converter, List<String> text, String pageSo...
method appendListItemText (line 719) | public void appendListItemText(JsonSource converter, List<String> text...
method appendIntroText (line 734) | void appendIntroText(JsonSource converter, List<String> text, String p...
method appendText (line 779) | void appendText(JsonSource converter, List<String> text, String primar...
type KeyData (line 795) | static interface KeyData {
method name (line 796) | String name();
method parentName (line 798) | String parentName();
method parentSource (line 800) | String parentSource();
method level (line 802) | String level();
method itemSource (line 804) | String itemSource();
class ClassFeatureKeyData (line 807) | static class ClassFeatureKeyData implements KeyData {
method ClassFeatureKeyData (line 814) | public ClassFeatureKeyData(String key) {
method name (line 823) | @Override
method parentName (line 828) | @Override
method parentSource (line 833) | @Override
method level (line 838) | @Override
method itemSource (line 843) | @Override
class SubclassKeyData (line 850) | public static class SubclassKeyData implements KeyData {
method SubclassKeyData (line 856) | public SubclassKeyData(String key) {
method name (line 864) | @Override
method parentName (line 869) | @Override
method parentSource (line 874) | @Override
method level (line 879) | @Override
method itemSource (line 884) | @Override
class SubclassFeatureKeyData (line 891) | static class SubclassFeatureKeyData implements KeyData {
method SubclassFeatureKeyData (line 900) | public SubclassFeatureKeyData(String key) {
method name (line 911) | @Override
method parentName (line 916) | @Override
method parentSource (line 921) | @Override
method level (line 926) | @Override
method itemSource (line 931) | @Override
method toKey (line 936) | public String toKey() {
method toSubclassKey (line 946) | public String toSubclassKey() {
method toClassKey (line 955) | public String toClassKey() {
class LevelProgression (line 963) | static class LevelProgression {
method LevelProgression (line 970) | LevelProgression(int level) {
method addFeature (line 975) | void addFeature(ClassFeature cf) {
method addValue (line 979) | void addValue(String value) {
method addSpellSlot (line 983) | void addSpellSlot(String value) {
method toHtmlLink (line 987) | String toHtmlLink(String x, String level) {
class SidekickProficiencies (line 994) | class SidekickProficiencies {
method SidekickProficiencies (line 1009) | SidekickProficiencies(JsonNode node) {
method armor (line 1055) | List<String> armor() {
method savingThrows (line 1059) | List<String> savingThrows() {
method skills (line 1063) | List<String> skills() {
method tools (line 1067) | List<String> tools() {
method weapons (line 1071) | List<String> weapons() {
type ClassFields (line 1076) | enum ClassFields implements JsonNodeReader {
method ClassFields (line 1128) | ClassFields() {
method ClassFields (line 1132) | ClassFields(String nodeName) {
method nodeName (line 1136) | @Override
FILE: src/main/java/dev/ebullient/convert/tools/dnd5e/Json2QuteCommon.java
class Json2QuteCommon (line 38) | public class Json2QuteCommon implements JsonSource {
method Json2QuteCommon (line 56) | Json2QuteCommon(Tools5eIndex index, Tools5eIndexType type, JsonNode js...
method withImagePath (line 63) | public Json2QuteCommon withImagePath(String imagePath) {
method getName (line 68) | public String getName() {
method linkifier (line 72) | public Tools5eLinkifier linkifier() {
method getSources (line 76) | @Override
method index (line 81) | @Override
method getImagePath (line 86) | @Override
method getText (line 94) | public String getText(String heading) {
method getFluffDescription (line 100) | public String getFluffDescription(Tools5eIndexType fluffType, String h...
method getFluffDescription (line 104) | public String getFluffDescription(JsonNode fromNode, Tools5eIndexType ...
method getFluff (line 109) | public List<String> getFluff(Tools5eIndexType fluffType, String headin...
method getFluff (line 113) | public List<String> getFluff(JsonNode fromNode, Tools5eIndexType fluff...
method getFluffImages (line 139) | public List<ImageRef> getFluffImages(Tools5eIndexType fluffType) {
method abilityPrereq (line 152) | private String abilityPrereq(JsonNode abilityPrereq) {
method backgroundPrereq (line 230) | private String backgroundPrereq(JsonNode backgroundPrereq) {
method replaceConjoinOr (line 244) | private String replaceConjoinOr(JsonNode campaignPrereq, String suffix) {
method expertisePrereq (line 252) | private String expertisePrereq(JsonNode expertisePrereq) {
method featPrereq (line 286) | private String featPrereq(JsonNode featPrereq) {
method itemTypePrereq (line 294) | private String itemTypePrereq(JsonNode itemTypePrereq) {
method itemPropertyPrereq (line 308) | private String itemPropertyPrereq(JsonNode itemPropertyPrereq) {
method levelPrereq (line 321) | private String levelPrereq(JsonNode levelPrereq) {
method proficiencyPrereq (line 364) | private String proficiencyPrereq(JsonNode profPrereq) {
method racePrereq (line 388) | private String racePrereq(JsonNode racePrereq) {
method scfPrereq (line 403) | private String scfPrereq(JsonNode scfPrereq) {
method testBoolean (line 427) | private List<String> testBoolean(JsonNode node, String valueIfTrue) {
method spellPrereq (line 433) | private String spellPrereq(JsonNode spellPrereq) {
method sharedPrerequisites (line 457) | private ObjectNode sharedPrerequisites(ArrayNode prerequisites) {
method listPrerequisites (line 474) | String listPrerequisites(JsonNode variantNode) {
method immuneResist (line 574) | ImmuneResist immuneResist() {
method abilityScores (line 582) | AbilityScores abilityScores(JsonNode scoreNode) {
method speed (line 593) | String speed(JsonNode speedNode) {
method speed (line 597) | String speed(JsonNode speedNode, boolean includeZeroWalk) {
method speedValue (line 622) | String speedValue(String key, JsonNode speedValue, boolean includeZero...
method findAc (line 645) | void findAc(AcHp acHp) {
method findHp (line 690) | void findHp(AcHp acHp) {
method getToken (line 720) | ImageRef getToken() {
method collectImmunities (line 795) | String collectImmunities(JsonNode fromNode, VulnerabilityFields field) {
method textValue (line 830) | private String textValue(VulnerabilityFields field, String text) {
method collectSortedTraits (line 837) | List<NamedText> collectSortedTraits(JsonNode array) {
method collectTraits (line 852) | List<NamedText> collectTraits(String field) {
method collectTraits (line 867) | void collectTraits(List<NamedText> traits, JsonNode array) {
method addNamedTrait (line 895) | void addNamedTrait(List<NamedText> traits, String name, JsonNode node) {
method collectEntries (line 924) | List<String> collectEntries(JsonNode node) {
method sortedTraits (line 931) | List<JsonNode> sortedTraits(JsonNode arrayNode) {
method build (line 984) | public final Tools5eQuteBase build() {
method buildNote (line 996) | public final Tools5eQuteNote buildNote() {
method buildQuteResource (line 1008) | protected Tools5eQuteBase buildQuteResource() {
method buildQuteNote (line 1013) | protected Tools5eQuteNote buildQuteNote() {
type VulnerabilityFields (line 1018) | enum VulnerabilityFields implements JsonNodeReader {
type PrereqFields (line 1030) | enum PrereqFields implements JsonNodeReader {
method fromString (line 1068) | static PrereqFields fromString(String name) {
FILE: src/main/java/dev/ebullient/convert/tools/dnd5e/Json2QuteCompose.java
class Json2QuteCompose (line 17) | public class Json2QuteCompose extends Json2QuteCommon {
method Json2QuteCompose (line 24) | public Json2QuteCompose(Tools5eIndexType type, Tools5eIndex index, Str...
method Json2QuteCompose (line 28) | public Json2QuteCompose(Tools5eIndexType type, Tools5eIndex index, Str...
method add (line 34) | public void add(JsonNode node) {
method getName (line 43) | @Override
method getSources (line 48) | @Override
method getSplitNotes (line 53) | public List<Tools5eQuteNote> getSplitNotes() {
method buildQuteNote (line 57) | @Override
method isSplittable (line 94) | private boolean isSplittable() {
method typeTag (line 102) | private String typeTag() {
method appendSplitElement (line 114) | private void appendSplitElement(JsonNode entry, List<String> text, Tag...
method appendElement (line 154) | private void appendElement(JsonNode entry, List<String> text, Tags tag...
method flatten (line 187) | private void flatten(JsonNode entry) {
method appendTable (line 209) | private void appendTable(String name, JsonNode entry, List<String> tex...
method chooseFrom (line 250) | String chooseFrom(JsonNode choose) {
method appendAction (line 263) | private void appendAction(JsonNode entry, List<String> text) {
method flattenActionTime (line 288) | private String flattenActionTime(JsonNode entry) {
method appendItemProperties (line 303) | private void appendItemProperties(List<String> text, Tags tags) {
method propertyIncluded (line 358) | private boolean propertyIncluded(JsonNode x) {
type ComposedTypeFields (line 367) | enum ComposedTypeFields implements JsonNodeReader {
FILE: src/main/java/dev/ebullient/convert/tools/dnd5e/Json2QuteDeck.java
class Json2QuteDeck (line 20) | public class Json2QuteDeck extends Json2QuteCommon {
method Json2QuteDeck (line 22) | Json2QuteDeck(Tools5eIndex index, Tools5eIndexType type, JsonNode json...
method buildQuteResource (line 26) | @Override
method appendCard (line 64) | public void appendCard(boolean hasCardArt, List<Card> cards, JsonNode ...
method getImage (line 84) | ImageRef getImage(JsonNodeReader field, JsonNode imgSource) {
type DeckFields (line 97) | enum DeckFields implements JsonNodeReader {
FILE: src/main/java/dev/ebullient/convert/tools/dnd5e/Json2QuteDeity.java
class Json2QuteDeity (line 26) | public class Json2QuteDeity extends Json2QuteCommon {
method Json2QuteDeity (line 28) | Json2QuteDeity(Tools5eIndex index, Tools5eIndexType type, JsonNode jso...
method buildQuteResource (line 32) | @Override
method dietyAlignment (line 66) | String dietyAlignment() {
method getSymbolImage (line 75) | ImageRef getSymbolImage() {
method findDeities (line 88) | public static Iterable<String> findDeities(List<Tuple> allDeities) {
type DeityField (line 151) | public enum DeityField implements JsonNodeReader {
FILE: src/main/java/dev/ebullient/convert/tools/dnd5e/Json2QuteFeat.java
class Json2QuteFeat (line 19) | public class Json2QuteFeat extends Json2QuteCommon {
method Json2QuteFeat (line 20) | public Json2QuteFeat(Tools5eIndex index, Tools5eIndexType type, JsonNo...
method buildQuteResource (line 24) | @Override
method initFullEntries (line 57) | JsonNode initFullEntries() {
method entryToListItemText (line 119) | JsonNode entryToListItemText(JsonNode abilityNode) {
method entryToListItemItem (line 123) | JsonNode entryToListItemItem(JsonNode abilityNode) {
type FeatFields (line 130) | enum FeatFields implements JsonNodeReader {
FILE: src/main/java/dev/ebullient/convert/tools/dnd5e/Json2QuteHazard.java
class Json2QuteHazard (line 14) | public class Json2QuteHazard extends Json2QuteCommon {
method Json2QuteHazard (line 16) | public Json2QuteHazard(Tools5eIndex index, Tools5eIndexType type, Json...
method buildQuteResource (line 20) | @Override
type TrapHazFields (line 44) | enum TrapHazFields implements JsonNodeReader {
method getHazardType (line 48) | String getHazardType(String key) {
FILE: src/main/java/dev/ebullient/convert/tools/dnd5e/Json2QuteItem.java
class Json2QuteItem (line 23) | public class Json2QuteItem extends Json2QuteCommon {
method Json2QuteItem (line 26) | Json2QuteItem(Tools5eIndex index, Tools5eIndexType type, JsonNode json...
method buildQuteResource (line 30) | @Override
method createVariant (line 62) | private Variant createVariant(JsonNode variantNode, Tags tags) {
method processType (line 257) | private void processType(ItemType type,
method attunement (line 277) | private String attunement(JsonNode variantNode) {
method focusType (line 291) | private String focusType(JsonNode variantNode) {
method coinValue (line 304) | private String coinValue(JsonNode variantNode) {
method itemName (line 309) | String itemName(JsonNode variantNode) {
method itemText (line 323) | String itemText(List<ImageRef> imageRef) {
method insertItemRefText (line 346) | void insertItemRefText(List<String> text, String input) {
method armorClass (line 372) | String armorClass(JsonNode variantNode, ItemType type, ItemType typeAl...
method getItemType (line 393) | ItemType getItemType(Tools5eSources variantSources, JsonNode node, Ite...
method findProperties (line 398) | void findProperties(Tools5eSources variantSources, JsonNode variantNode,
method findMastery (line 419) | void findMastery(Tools5eSources variantSources, JsonNode variantNode,
type EncodedType (line 432) | enum EncodedType {
method typeIn (line 440) | boolean typeIn(ItemType type, ItemType typeAlt) {
method not (line 445) | boolean not(ItemType type) {
type ItemField (line 450) | enum ItemField implements JsonNodeReader {
FILE: src/main/java/dev/ebullient/convert/tools/dnd5e/Json2QuteLegendaryGroup.java
class Json2QuteLegendaryGroup (line 12) | public class Json2QuteLegendaryGroup extends Json2QuteCommon {
method Json2QuteLegendaryGroup (line 14) | Json2QuteLegendaryGroup(Tools5eIndex index, Tools5eIndexType type, Jso...
method buildQuteNote (line 18) | @Override
method appendSectionText (line 37) | void appendSectionText(List<String> text, LeGroupFields field, String ...
type LeGroupFields (line 54) | enum LeGroupFields implements JsonNodeReader {
FILE: src/main/java/dev/ebullient/convert/tools/dnd5e/Json2QuteMonster.java
class Json2QuteMonster (line 44) | public class Json2QuteMonster extends Json2QuteCommon {
method isNpc (line 45) | public static boolean isNpc(JsonNode source) {
method Json2QuteMonster (line 56) | Json2QuteMonster(Tools5eIndex index, Tools5eIndexType type, JsonNode j...
method buildQuteResource (line 64) | @Override
method findCreatureType (line 117) | void findCreatureType() {
method mapType (line 150) | String mapType(String type) {
method monsterPb (line 179) | String monsterPb(String cr) {
method monsterSavesAndSkills (line 186) | SavesAndSkills monsterSavesAndSkills() {
method getSavingThrow (line 225) | SavingThrow getSavingThrow(String name, JsonNode node) {
method getModifier (line 236) | SkillModifier getModifier(String name, JsonNode value) {
method initiative (line 249) | Initiative initiative(AbilityScores abilityScores, String cr) {
method monsterAlignment (line 290) | String monsterAlignment() {
method monsterSpellcasting (line 318) | List<Spellcasting> monsterSpellcasting() {
method getSpells (line 408) | List<String> getSpells(JsonNode source) {
method toLink (line 430) | private String toLink(String spellText) {
method collectAllTraits (line 436) | Traits collectAllTraits() {
method traitDescription (line 468) | TraitDescription traitDescription(JsonNode source, MonsterFields field...
method linkedSenses (line 534) | String linkedSenses() {
method linkifySense (line 549) | String linkifySense(String sense) {
method gear (line 557) | List<String> gear() {
method getImagePath (line 582) | @Override
method findMonsterVariants (line 590) | public static List<JsonNode> findMonsterVariants(
method hydrateVersion (line 647) | public static String hydrateVersion(String parentKey, JsonNode parentS...
method filterSources (line 669) | private static void filterSources(JsonNodeReader field, ObjectNode par...
method getVersionsBasic (line 686) | public static JsonNode getVersionsBasic(JsonNode version) {
method getVersionsTemplate (line 691) | public static List<JsonNode> getVersionsTemplate(JsonNode version) {
method replaceTemplateVariables (line 714) | static JsonNode replaceTemplateVariables(JsonNode node, JsonNode varia...
method mutExpandCopy (line 752) | public static void mutExpandCopy(JsonNode node) {
type MonsterType (line 768) | public enum MonsterType {
method toDirectory (line 785) | public String toDirectory() {
method fromString (line 789) | public static MonsterType fromString(String type) {
method fromNode (line 800) | public static MonsterType fromNode(JsonNode node, JsonTextConverter<...
method toDirectory (line 817) | public static String toDirectory(String type) {
type MonsterFields (line 823) | enum MonsterFields implements JsonNodeReader {
FILE: src/main/java/dev/ebullient/convert/tools/dnd5e/Json2QuteNote.java
class Json2QuteNote (line 8) | public class Json2QuteNote extends Json2QuteCommon {
method Json2QuteNote (line 13) | Json2QuteNote(Tools5eIndex index, Tools5eIndexType type, JsonNode json...
method useSuffix (line 18) | Json2QuteNote useSuffix(boolean useSuffix) {
method getName (line 23) | @Override
method buildQuteNote (line 28) | @Override
FILE: src/main/java/dev/ebullient/convert/tools/dnd5e/Json2QuteObject.java
class Json2QuteObject (line 14) | public class Json2QuteObject extends Json2QuteMonster {
method Json2QuteObject (line 16) | Json2QuteObject(Tools5eIndex index, Tools5eIndexType type, JsonNode js...
method buildQuteResource (line 20) | @Override
method findObjectType (line 52) | private String findObjectType() {
type ObjectFields (line 62) | enum ObjectFields implements JsonNodeReader {
FILE: src/main/java/dev/ebullient/convert/tools/dnd5e/Json2QuteOptionalFeature.java
class Json2QuteOptionalFeature (line 13) | public class Json2QuteOptionalFeature extends Json2QuteCommon {
method Json2QuteOptionalFeature (line 14) | public Json2QuteOptionalFeature(Tools5eIndex index, Tools5eIndexType t...
method buildQuteResource (line 18) | @Override
FILE: src/main/java/dev/ebullient/convert/tools/dnd5e/Json2QuteOptionalFeatureType.java
class Json2QuteOptionalFeatureType (line 13) | public class Json2QuteOptionalFeatureType extends Json2QuteCommon {
method Json2QuteOptionalFeatureType (line 18) | Json2QuteOptionalFeatureType(Tools5eIndex index, JsonNode node, Option...
method getName (line 24) | @Override
method buildQuteNote (line 29) | @Override
FILE: src/main/java/dev/ebullient/convert/tools/dnd5e/Json2QutePsionicTalent.java
class Json2QutePsionicTalent (line 17) | public class Json2QutePsionicTalent extends Json2QuteCommon {
method Json2QutePsionicTalent (line 19) | Json2QutePsionicTalent(Tools5eIndex index, Tools5eIndexType type, Json...
method buildQuteResource (line 23) | @Override
method getPsionicTypeOrder (line 40) | String getPsionicTypeOrder() {
method getPsionicModes (line 62) | Collection<NamedText> getPsionicModes() {
method getModeName (line 88) | String getModeName(JsonNode mode) {
type PsionicFields (line 112) | enum PsionicFields implements JsonNodeReader {
FILE: src/main/java/dev/ebullient/convert/tools/dnd5e/Json2QuteRace.java
class Json2QuteRace (line 23) | public class Json2QuteRace extends Json2QuteCommon {
method Json2QuteRace (line 27) | Json2QuteRace(Tools5eIndex index, Tools5eIndexType type, JsonNode json...
method buildQuteResource (line 31) | @Override
method getSpeed (line 64) | String getSpeed(JsonNode value) {
method creatureTypes (line 91) | String creatureTypes() {
method spellcastingAbility (line 101) | String spellcastingAbility() {
method getRaceAbility (line 119) | String getRaceAbility() {
method decoratedAmount (line 136) | String decoratedAmount(int amount) {
method getSubraceName (line 143) | public static String getSubraceName(String raceName, String subraceNam...
method prepareBaseRace (line 156) | public static void prepareBaseRace(Tools5eIndex tools5eIndex, JsonNode...
method updateBaseRace (line 206) | public static void updateBaseRace(Tools5eIndex tools5eIndex, JsonNode ...
type RaceFields (line 257) | enum RaceFields implements JsonNodeReader {
FILE: src/main/java/dev/ebullient/convert/tools/dnd5e/Json2QuteReward.java
class Json2QuteReward (line 13) | public class Json2QuteReward extends Json2QuteCommon {
method Json2QuteReward (line 15) | public Json2QuteReward(Tools5eIndex index, Tools5eIndexType type, Json...
method buildQuteResource (line 19) | @Override
type RewardField (line 53) | enum RewardField implements JsonNodeReader {
FILE: src/main/java/dev/ebullient/convert/tools/dnd5e/Json2QuteSpell.java
class Json2QuteSpell (line 26) | public class Json2QuteSpell extends Json2QuteCommon {
method Json2QuteSpell (line 65) | Json2QuteSpell(Tools5eIndex index, Tools5eIndexType type, JsonNode jso...
method buildQuteResource (line 70) | @Override
method getSchool (line 132) | SpellSchool getSchool() {
method spellIsRitual (line 137) | boolean spellIsRitual() {
method spellComponents (line 146) | String spellComponents() {
method materialComponents (line 166) | String materialComponents(JsonNode source) {
method spellDuration (line 173) | String spellDuration() {
method addDuration (line 191) | void addDuration(JsonNode element, StringBuilder result) {
method spellRange (line 218) | String spellRange() {
method spellCastingTime (line 252) | String spellCastingTime() {
method spellAreaTags (line 290) | String spellAreaTags() {
method spellDamageInflict (line 298) | String spellDamageInflict() {
method spellSavingThrows (line 306) | String spellSavingThrows() {
method spellConditionInflict (line 314) | String spellConditionInflict() {
method spellAbilityChecks (line 322) | String spellAbilityChecks() {
method spellMiscTags (line 330) | String spellMiscTags() {
method spellAffectsCreatureTypes (line 338) | String spellAffectsCreatureTypes() {
method spellConditionImmune (line 346) | String spellConditionImmune() {
method spellDamageImmune (line 354) | String spellDamageImmune() {
method spellDamageResist (line 362) | String spellDamageResist() {
method spellDamageVulnerable (line 370) | String spellDamageVulnerable() {
method spellAttacks (line 378) | String spellAttacks() {
method spellScalingLevelDice (line 386) | String spellScalingLevelDice() {
method spellHigherLevelEntries (line 441) | String spellHigherLevelEntries() {
method formatKeyword (line 449) | private String formatKeyword(String value) {
method formatAbility (line 456) | private String formatAbility(String ability) {
method formatMiscTag (line 463) | private String formatMiscTag(String tag) {
method formatSpellAttack (line 470) | private String formatSpellAttack(String code) {
type SpellFields (line 481) | enum SpellFields implements JsonNodeReader {
FILE: src/main/java/dev/ebullient/convert/tools/dnd5e/Json2QuteSpellIndex.java
class Json2QuteSpellIndex (line 22) | public class Json2QuteSpellIndex extends Json2QuteCommon {
method Json2QuteSpellIndex (line 29) | Json2QuteSpellIndex(Tools5eIndex index) {
method buildNotes (line 34) | public Collection<? extends QuteNote> buildNotes() {
method createClassList (line 95) | private QuteNote createClassList(String className, SpellByLevel spells...
method createSchoolList (line 124) | private QuteNote createSchoolList(SpellSchool spellSchool, SpellByLeve...
method createOtherList (line 153) | private QuteNote createOtherList(String key, SpellRefByLevel spellsByO...
class SpellRefByLevel (line 186) | private class SpellRefByLevel extends SpellByLevel {
method SpellRefByLevel (line 189) | SpellRefByLevel(SpellEntry.SpellReference reference) {
method isEmpty (line 193) | boolean isEmpty() {
class SpellByLevel (line 198) | private class SpellByLevel {
method add (line 201) | void add(SpellEntry entry) {
method getLevel (line 206) | Set<SpellEntry> getLevel(String level) {
method isEmpty (line 211) | boolean isEmpty() {
FILE: src/main/java/dev/ebullient/convert/tools/dnd5e/Json2QuteTable.java
class Json2QuteTable (line 12) | public class Json2QuteTable extends Json2QuteCommon {
method Json2QuteTable (line 14) | Json2QuteTable(Tools5eIndex index, Tools5eIndexType type, JsonNode jso...
method buildQuteNote (line 18) | @Override
FILE: src/main/java/dev/ebullient/convert/tools/dnd5e/Json2QuteVehicle.java
class Json2QuteVehicle (line 23) | public class Json2QuteVehicle extends Json2QuteCommon {
method Json2QuteVehicle (line 27) | Json2QuteVehicle(Tools5eIndex index, Tools5eIndexType type, JsonNode j...
method buildQuteResource (line 32) | @Override
method vehicleSize (line 60) | String vehicleSize(Tags tags) {
method vehicleSpeed (line 80) | String vehicleSpeed() {
method getActions (line 87) | private List<NamedText> getActions() {
method getAcHp (line 100) | private ShipAcHp getAcHp(JsonNode node) {
method getCost (line 112) | private String getCost(JsonNode node) {
method convertCost (line 124) | private String convertCost(JsonNode node) {
method shipCrewCargoPace (line 133) | private ShipCrewCargoPace shipCrewCargoPace() {
method poundsToTons (line 214) | private String poundsToTons(JsonNode sourceNode) {
method shipSections (line 221) | private List<ShipSection> shipSections() {
method getShipSections (line 234) | void getShipSections(List<ShipSection> sections) {
method addLocomotion (line 283) | void addLocomotion(List<String> speed, JsonNode locomotionNode) {
method addMovementSpeed (line 291) | void addMovementSpeed(List<String> speed, JsonNode speedNode) {
method getSpelljammerSections (line 299) | private void getSpelljammerSections(List<ShipSection> sections) {
method getWarMachineSections (line 323) | private void getWarMachineSections(List<ShipSection> sections) {
method getCreatureSections (line 344) | private void getCreatureSections(List<ShipSection> sections) {
method collectNamedEntries (line 383) | private List<String> collectNamedEntries(JsonNode source, JsonNodeRead...
method collectSortedEntries (line 389) | private List<String> collectSortedEntries(JsonNode source, JsonNodeRea...
type VehicleType (line 394) | enum VehicleType {
method VehicleType (line 404) | VehicleType(String value) {
method from (line 408) | static VehicleType from(JsonNode node) {
type VehicleFields (line 422) | enum VehicleFields implements JsonNodeReader {
FILE: src/main/java/dev/ebullient/convert/tools/dnd5e/JsonSource.java
type JsonSource (line 39) | public interface JsonSource extends JsonTextReplacement {
method getName (line 44) | default String getName() {
method textContains (line 48) | default boolean textContains(List<String> haystack, String needle) {
method getTextOrEmpty (line 52) | default String getTextOrEmpty(JsonNode x, String field) {
method getTextOrDefault (line 59) | default String getTextOrDefault(JsonNode x, String field, String value) {
method booleanOrDefault (line 66) | default boolean booleanOrDefault(JsonNode source, String key, boolean ...
method intOrDefault (line 71) | default int intOrDefault(JsonNode source, String key, int value) {
method intOrThrow (line 76) | default int intOrThrow(JsonNode source, String key) {
method getSourceText (line 86) | default String getSourceText(JsonNode node) {
method getSourceText (line 90) | default String getSourceText(ParseState parseState) {
method getSourceText (line 94) | default String getSourceText(Tools5eSources currentSource) {
method getLabeledSource (line 98) | default String getLabeledSource(JsonNode node) {
method getLabeledSource (line 102) | default String getLabeledSource(Tools5eSources currentSource) {
method buildImageRef (line 106) | default ImageRef buildImageRef(JsonMediaHref mediaHref, String imageBa...
method getFileName (line 110) | default String getFileName() {
method appendToText (line 123) | @Override
method appendObjectToText (line 148) | default void appendObjectToText(List<String> text, JsonNode node, Stri...
method appendAbility (line 237) | default void appendAbility(AppendTypeValue type, List<String> text, Js...
method appendAttack (line 289) | default void appendAttack(List<String> text, JsonNode entry) {
method appendCallout (line 302) | default void appendCallout(String callout, String title, List<String> ...
method appendClassFeatureRef (line 311) | default void appendClassFeatureRef(List<String> text, JsonNode entry, ...
method appendEntriesToText (line 329) | default void appendEntriesToText(List<String> text, JsonNode entryNode...
method appendEntryItem (line 353) | default void appendEntryItem(List<String> text, JsonNode itemNode) {
method appendGallery (line 363) | default void appendGallery(List<String> text, JsonNode imageNode) {
method appendImage (line 373) | default void appendImage(List<String> text, JsonNode imageNode) {
method appendLink (line 383) | default void appendLink(List<String> text, JsonNode link) {
type ListType (line 395) | enum ListType {
method ListType (line 401) | ListType(String marker) {
method appendList (line 406) | default void appendList(List<String> text, ArrayNode itemArray, ListTy...
method appendOptionalFeature (line 425) | default void appendOptionalFeature(List<String> text, JsonNode entry, ...
method appendOptionalFeatureRef (line 436) | default void appendOptionalFeatureRef(List<String> text, JsonNode entr...
method appendOptions (line 456) | default void appendOptions(List<String> text, JsonNode entry) {
method appendInset (line 486) | default void appendInset(AppendTypeValue type, List<String> text, Json...
method appendFlowchart (line 523) | default void appendFlowchart(List<String> text, JsonNode entry, String...
method appendQuote (line 539) | default void appendQuote(List<String> text, JsonNode entry) {
method appendStatblock (line 554) | default void appendStatblock(List<String> text, JsonNode entry, String...
method appendStatblockInline (line 565) | default void appendStatblockInline(List<String> text, JsonNode entry, ...
method equivalentNode (line 641) | default boolean equivalentNode(JsonNode dataNode, JsonNode existingNod...
method embedReference (line 654) | default void embedReference(List<String> text, JsonNode entry, Tools5e...
method appendTable (line 703) | default void appendTable(List<String> text, JsonNode tableNode) {
method appendMarkdownTable (line 737) | default String appendMarkdownTable(List<String> table, List<String> in...
method appendHtmlTable (line 868) | default String appendHtmlTable(List<String> table, List<String> inner,
method appendTableText (line 980) | default void appendTableText(String name, List<String> inner, List<Str...
method appendTableGroup (line 999) | default void appendTableGroup(List<String> text, JsonNode tableGroup, ...
method findTableName (line 1022) | default String findTableName(JsonNode tableNode) {
method findTable (line 1027) | default String findTable(Tools5eIndexType keyType, JsonNode matchTable) {
method unpackFluffNode (line 1045) | default void unpackFluffNode(Tools5eIndexType fluffType, JsonNode fluf...
method getImages (line 1070) | default void getImages(JsonNode imageNode, List<ImageRef> images) {
method readImageRef (line 1081) | default ImageRef readImageRef(JsonNode imageNode) {
method readLink (line 1091) | default JsonMediaHref readLink(JsonNode linkNode) {
method readHref (line 1100) | default JsonHref readHref(JsonNode href) {
method asAbilityEnum (line 1109) | default String asAbilityEnum(JsonNode textNode) {
method toAlignmentCharacters (line 1113) | default String toAlignmentCharacters(String src) {
method alignmentListToFull (line 1118) | default String alignmentListToFull(JsonNode alignmentList) {
method alignmentObjToFull (line 1147) | default String alignmentObjToFull(JsonNode alignmentNode) {
method mapAlignmentToString (line 1171) | default String mapAlignmentToString(String a) {
method levelToPb (line 1213) | static int levelToPb(int level) {
method monsterCr (line 1218) | default String monsterCr(JsonNode monster) {
method crToXp (line 1232) | default double crToXp(JsonNode cr) {
method crToPb (line 1242) | default int crToPb(JsonNode cr) {
method crToPb (line 1249) | default int crToPb(String crValue) {
method crToNumber (line 1256) | default double crToNumber(String crValue) {
method getSize (line 1273) | default String getSize(JsonNode value) {
method spanWrap (line 1290) | default String spanWrap(String cssClass, String text) {
method sizeToString (line 1296) | default String sizeToString(String size) {
method crToTagValue (line 1313) | static String crToTagValue(String cr) {
method asModifier (line 1322) | default String asModifier(double value) {
method asModifier (line 1326) | default String asModifier(int value) {
method articleFor (line 1330) | default String articleFor(String value) {
method numberToText (line 1341) | default String numberToText(int value) {
method damageTypeToFull (line 1387) | default String damageTypeToFull(String dmgType) {
method convertCurrency (line 1409) | default String convertCurrency(int cp) {
method featureTypeToString (line 1427) | public static String featureTypeToString(String featureType, Map<Strin...
method spellLevelToText (line 1473) | public static String spellLevelToText(String level) {
class JsonMediaHref (line 1483) | @RegisterForReflection
class JsonHref (line 1496) | @RegisterForReflection
type AbilityScoreFields (line 1540) | public enum AbilityScoreFields implements JsonNodeReader {
method AbilityScoreFields (line 1551) | AbilityScoreFields() {
method AbilityScoreFields (line 1555) | AbilityScoreFields(String altName) {
method nodeName (line 1559) | public String nodeName() {
type Tools5eFields (line 1564) | enum Tools5eFields implements JsonNodeReader {
type TableFields (line 1624) | enum TableFields implements JsonNodeReader {
method getFirstRow (line 1642) | static String getFirstRow(JsonNode tableNode) {
type AlignmentFields (line 1651) | enum AlignmentFields implements JsonNodeReader {
type AttackFields (line 1658) | enum AttackFields implements JsonNodeReader {
type RollFields (line 1664) | enum RollFields implements JsonNodeReader {
type AppendTypeValue (line 1671) | enum AppendTypeValue implements JsonNodeReader.FieldValue {
method value (line 1728) | @Override
method valueFrom (line 1733) | static AppendTypeValue valueFrom(JsonNode source, JsonNodeReader fie...
FILE: src/main/java/dev/ebullient/convert/tools/dnd5e/JsonTextReplacement.java
type JsonTextReplacement (line 38) | public interface JsonTextReplacement extends JsonTextConverter<Tools5eIn...
method index (line 66) | Tools5eIndex index();
method getSources (line 68) | Tools5eSources getSources();
method tui (line 70) | default Tui tui() {
method cfg (line 74) | default CompendiumConfig cfg() {
method useCompendium (line 78) | default boolean useCompendium() {
method linkifier (line 82) | default Tools5eLinkifier linkifier() {
method getImagePath (line 86) | default String getImagePath() {
method findAndReplace (line 91) | default List<String> findAndReplace(JsonNode jsonSource, String field) {
method findAndReplace (line 95) | default List<String> findAndReplace(JsonNode jsonSource, String field,...
method joinAndReplace (line 114) | default String joinAndReplace(JsonNode jsonSource, String field) {
method joinAndReplace (line 129) | default String joinAndReplace(ArrayNode array) {
method replaceText (line 135) | default String replaceText(String input) {
method tableHeader (line 139) | default String tableHeader(String x) {
method replacePromptStrings (line 158) | default String replacePromptStrings(String s) {
method _replaceTokenText (line 189) | default String _replaceTokenText(String input, boolean nested) {
method replaceSavingThrow (line 468) | default String replaceSavingThrow(MatchResult match) {
method replaceActSaveFail (line 476) | default String replaceActSaveFail(MatchResult match) {
method replaceSkillOrAbility (line 492) | default String replaceSkillOrAbility(MatchResult match) {
method replaceSkillCheck (line 538) | default String replaceSkillCheck(MatchResult match) {
method linkifySkill (line 565) | default String linkifySkill(SkillOrAbility skill) {
method linkifyRules (line 571) | default String linkifyRules(Tools5eIndexType type, String text) {
method linkify (line 596) | default String linkify(MatchResult match) {
method linkify (line 604) | default String linkify(Tools5eIndexType type, String s) {
method linkifyThreePart (line 704) | default String linkifyThreePart(Tools5eIndexType type, String match) {
method linkifyFourPart (line 717) | default String linkifyFourPart(Tools5eIndexType type, String match) {
method linkifyLegendaryGroup (line 726) | default String linkifyLegendaryGroup(Tools5eSources lgSources) {
method linkifyClassFeature (line 733) | default String linkifyClassFeature(String match) {
method linkifyOptionalFeatureType (line 748) | default String linkifyOptionalFeatureType(MatchResult match) {
method linkifySubclass (line 828) | default String linkifySubclass(String match) {
method linkifySubclassFeature (line 844) | default String linkifySubclassFeature(String match) {
method linkifyVariantRule (line 917) | default String linkifyVariantRule(String variant) {
method linkifyReference (line 941) | default String linkifyReference(String linkText, String key) {
method findKey (line 973) | default String findKey(Tools5eIndexType type, String name, String sour...
method linkifyItemAttribute (line 990) | default String linkifyItemAttribute(Tools5eIndexType type, String s) {
method handleCitation (line 1017) | default String handleCitation(String citationTag) {
method decoratedUaName (line 1043) | default String decoratedUaName(String name, Tools5eSources sources) {
method convertToNumber (line 1051) | default double convertToNumber(String text) {
FILE: src/main/java/dev/ebullient/convert/tools/dnd5e/MagicVariant.java
class MagicVariant (line 30) | public class MagicVariant implements JsonSource {
method findSpecificVariants (line 42) | public static List<JsonNode> findSpecificVariants(Tools5eIndex index, ...
method populateGenericVariant (line 48) | public static void populateGenericVariant(final JsonNode variant) {
method populateVariant (line 56) | private void populateVariant(final JsonNode variant) {
method findVariants (line 117) | private List<JsonNode> findVariants(Tools5eIndex index, Tools5eIndexTy...
method editionMatch (line 215) | boolean editionMatch(JsonNode baseItem, JsonNode genericVariant) {
method hasRequiredProperty (line 240) | boolean hasRequiredProperty(JsonNode baseItem, JsonNode genericVariant) {
method hasExcludedProperty (line 265) | boolean hasExcludedProperty(JsonNode baseItem, JsonNode genericVariant) {
method matchesRequiresExcludes (line 280) | private boolean matchesRequiresExcludes(JsonNode candidate, JsonNode r...
method testProperty (line 292) | private boolean testProperty(JsonNode candidate, String reqKey, JsonNo...
method arrayContains (line 311) | boolean arrayContains(JsonNode array, JsonNode value) {
method resolveEntryAttributes (line 315) | private JsonNode resolveEntryAttributes(
method processText (line 328) | private String processText(String text, Function<String, String> token...
method tokenResolver (line 365) | private BiFunction<String, Boolean, String> tokenResolver(final JsonNo...
method tokenResolver (line 377) | private BiFunction<String, Boolean, String> tokenResolver(final JsonNo...
method createSpecificVariant (line 417) | private JsonNode createSpecificVariant(JsonNode baseItem, JsonNode gen...
method resetOrRemove (line 524) | private void resetOrRemove(JsonNodeReader field, JsonNode source, Json...
type MagicItemField (line 533) | enum MagicItemField implements JsonNodeReader {
method index (line 567) | @Override
method getSources (line 572) | @Override
FILE: src/main/java/dev/ebullient/convert/tools/dnd5e/OptionalFeatureIndex.java
class OptionalFeatureIndex (line 27) | @RegisterForReflection
method OptionalFeatureIndex (line 33) | OptionalFeatureIndex(Tools5eIndex index) {
method addOptionalFeatureType (line 37) | public OptionalFeatureType addOptionalFeatureType(String featureType, ...
method addOptionalFeature (line 50) | public void addOptionalFeature(String finalKey, JsonNode optFeatureNod...
method amendSources (line 59) | public void amendSources(String key, JsonNode jsonSource) {
method removeUnusedOptionalFeatures (line 87) | public void removeUnusedOptionalFeatures(
method get (line 105) | public OptionalFeatureType get(JsonNode node) {
method get (line 113) | public OptionalFeatureType get(String featureType) {
method clear (line 122) | public void clear() {
method getMap (line 126) | public Map<String, OptionalFeatureType> getMap() {
class OptionalFeatureCondition (line 130) | public static class OptionalFeatureCondition {
method OptionalFeatureCondition (line 139) | public OptionalFeatureCondition(int order, String name,
method order (line 157) | public int order() {
method isEmpty (line 161) | public boolean isEmpty() {
method toString (line 165) | @Override
class OptionalFeatureType (line 182) | static class OptionalFeatureType {
method OptionalFeatureType (line 197) | OptionalFeatureType(String abbreviation, HomebrewMetaTypes homebrewM...
method amendSources (line 215) | public void amendSources(Tools5eSources otherSources) {
method addHomebrewMeta (line 225) | public void addHomebrewMeta(HomebrewMetaTypes homebrew) {
method mySources (line 232) | private Tools5eSources mySources() {
method addConsumer (line 239) | public void addConsumer(String key) {
method addFeature (line 243) | public void addFeature(String key) {
method getFilename (line 247) | public String getFilename() {
method getSources (line 251) | public Tools5eSources getSources() {
method testConsumersInUse (line 255) | public boolean testConsumersInUse(Function<String, Boolean> test) {
method testFeaturesInUse (line 262) | public boolean testFeaturesInUse(Function<String, Boolean> test) {
method getTitle (line 269) | public String getTitle() {
method getSource (line 279) | private String getSource(HomebrewMetaTypes homebrewMeta) {
method inSRD (line 298) | private boolean inSRD(String abbreviation) {
method getKey (line 305) | @JsonIgnore
method linkifier (line 310) | Tools5eLinkifier linkifier() {
method cfg (line 315) | @Override
method index (line 320) | @Override
method getSources (line 325) | @Override
type OftFields (line 330) | enum OftFields implements JsonNodeReader {
FILE: src/main/java/dev/ebullient/convert/tools/dnd5e/PsionicType.java
type PsionicType (line 7) | public interface PsionicType {
method combineWith (line 9) | default String combineWith(String order) {
method getFullName (line 19) | String getFullName();
method isAltDisplay (line 21) | boolean isAltDisplay();
class CustomPsionicType (line 23) | @RegisterForReflection
method getFullName (line 32) | public String getFullName() {
method isAltDisplay (line 36) | public boolean isAltDisplay() {
type PsionicTypeEnum (line 41) | enum PsionicTypeEnum implements PsionicType {
method PsionicTypeEnum (line 48) | PsionicTypeEnum(String shortName) {
method getFullName (line 52) | public String getFullName() {
method getShortName (line 56) | public String getShortName() {
method isAltDisplay (line 60) | public boolean isAltDisplay() {
FILE: src/main/java/dev/ebullient/convert/tools/dnd5e/SkillOrAbility.java
type SkillOrAbility (line 19) | public interface SkillOrAbility {
method value (line 24) | String value();
method source (line 26) | String source();
method ordinal (line 28) | int ordinal();
method fromTextValue (line 30) | public static SkillOrAbility fromTextValue(String v) {
method format (line 56) | public static String format(String key, Tools5eIndex index, Tools5eSou...
class CustomSkillOrAbility (line 61) | public class CustomSkillOrAbility implements SkillOrAbility {
method CustomSkillOrAbility (line 67) | public CustomSkillOrAbility(String name) {
method CustomSkillOrAbility (line 74) | public CustomSkillOrAbility(JsonNode skill) {
method value (line 81) | @Override
method source (line 86) | @Override
method ordinal (line 91) | public int ordinal() {
type SkillOrAbilityEnum (line 96) | enum SkillOrAbilityEnum implements SkillOrAbility {
method SkillOrAbilityEnum (line 131) | SkillOrAbilityEnum(String longValue, boolean isSkill) {
method value (line 137) | public String value() {
method source (line 141) | public String source() {
method getAbilityScore (line 147) | public static String getAbilityScore(JsonNode abilityScore) {
method getAbilityScoreIncreases (line 152) | public static String getAbilityScoreIncreases(JsonNode abilityScores) {
method getAbilityScoreIncrease (line 157) | public static String getAbilityScoreIncrease(JsonNode abilityScores) {
method processAbilityScoreArray (line 161) | private static String processAbilityScoreArray(JsonNode abilityScores,...
method abilityScore (line 176) | private static String abilityScore(JsonNode abilityNode, boolean incre...
method toAbilityString (line 195) | private static String toAbilityString(String nameAbv, JsonNode value, ...
method toModifier (line 205) | private static String toModifier(JsonNode value) {
type AsiChoiceFields (line 214) | public enum AsiChoiceFields implements JsonNodeReader {
method readFromChoice (line 228) | private String readFromChoice(JsonNode choiceNode, boolean increase) {
method readWeightedChoice (line 255) | private String readWeightedChoice(JsonNode choiceNode) {
method optionsFrom (line 285) | private static List<String> optionsFrom(JsonNode fromNode) {
type AsiFields (line 297) | public enum AsiFields implements JsonNodeReader {
method AsiFields (line 313) | AsiFields() {
method AsiFields (line 317) | AsiFields(SkillOrAbilityEnum ability) {
method AsiFields (line 321) | AsiFields(SkillOrAbilityEnum ability, String altName) {
method nodeName (line 326) | public String nodeName() {
method getAbility (line 330) | public SkillOrAbilityEnum getAbility() {
method longName (line 334) | public String longName() {
method asiFieldFromString (line 338) | private static AsiFields asiFieldFromString(String name) {
FILE: src/main/java/dev/ebullient/convert/tools/dnd5e/SpellEntry.java
class SpellEntry (line 24) | public class SpellEntry {
method SpellEntry (line 43) | public SpellEntry(String key, JsonNode spellNode) {
method getLevelText (line 53) | public String getLevelText() {
method getLevel (line 57) | public String getLevel() {
method getName (line 61) | public String getName() {
method addSpellReference (line 70) | public SpellReference addSpellReference(String refererKey, boolean exp...
method addReference (line 88) | public SpellReference addReference(String refererKey, String constrain...
method addReference (line 103) | public SpellReference addReference(SpellReference ref) {
method addOrReplace (line 107) | private SpellReference addOrReplace(SpellReference spellRef, Map<Strin...
method spellIsRitual (line 116) | private boolean spellIsRitual(JsonNode spellNode) {
method spellComponents (line 125) | private List<String> spellComponents(JsonNode spellNode) {
method materialComponents (line 141) | String materialComponents(JsonNode source, JsonSource converter) {
method spellAttack (line 148) | private List<String> spellAttack(JsonNode spellNode) {
method spellSchool (line 162) | private SpellSchool spellSchool(JsonNode spellNode) {
method getReference (line 167) | public SpellReference getReference(String key) {
method getMostSpecificReference (line 180) | public SpellReference getMostSpecificReference(String key) {
method inClassList (line 192) | public boolean inClassList(String x) {
method isExpanded (line 196) | public boolean isExpanded(String className) {
method linkify (line 200) | public String linkify() {
method toString (line 205) | @Override
method hashCode (line 210) | @Override
method equals (line 218) | @Override
class SpellReference (line 240) | public static class SpellReference {
method SpellReference (line 252) | public SpellReference(String key, boolean expanded) {
method SpellReference (line 256) | public SpellReference(String key, String constraint, String asLevel,...
method isSpecific (line 282) | boolean isSpecific() {
method hashCode (line 288) | @Override
method equals (line 296) | @Override
method toString (line 318) | @Override
method tagifyReference (line 323) | public String tagifyReference() {
method listFileName (line 331) | public String listFileName() {
method linkifyReference (line 335) | public String linkifyReference() {
method sourceString (line 362) | private String sourceString(Tools5eIndexType type, String value) {
method describe (line 369) | public String describe() {
method linkifier (line 389) | private static Tools5eLinkifier linkifier() {
FILE: src/main/java/dev/ebullient/convert/tools/dnd5e/SpellIndex.java
class SpellIndex (line 19) | public class SpellIndex implements JsonSource {
method SpellIndex (line 27) | public SpellIndex(Tools5eIndex index) {
method clear (line 31) | public void clear() {
method getSpellEntry (line 35) | public SpellEntry getSpellEntry(String key) {
method addSpell (line 50) | public SpellEntry addSpell(String key, JsonNode spellNode) {
method buildSpellIndex (line 62) | public void buildSpellIndex(Collection<JsonNode> allNodes) {
method readSpellSources (line 77) | private void readSpellSources() {
method processSpellSourceType (line 110) | private void processSpellSourceType(SpellEntry spellEntry, String type...
method processClassRefs (line 124) | private void processClassRefs(SpellEntry spellEntry, JsonNode data, bo...
method processSubclassRefs (line 167) | private void processSubclassRefs(SpellEntry spellEntry, JsonNode data) {
method processSimpleRefs (line 201) | private void processSimpleRefs(SpellEntry spellEntry, JsonNode data, S...
method resolveRefType (line 221) | private Tools5eIndexType resolveRefType(String typeName) {
method processAdditionalSpells (line 237) | private void processAdditionalSpells(Collection<JsonNode> allNodes) {
method readClassesFromSpell (line 265) | private void readClassesFromSpell(String spellKey, JsonNode spellNode) {
method readClassType (line 302) | private void readClassType(SpellEntry spellEntry, JsonNode reference, ...
method readAdditionalSpells (line 328) | private void readAdditionalSpells(String refererKey, JsonNode refererN...
method gatherSpells (line 354) | private void gatherSpells(String refererKey, JsonNode spellList, boole...
method toSpellList (line 372) | private void toSpellList(String refererKey, JsonNode spellList, String...
method resolveRechargeSpells (line 423) | public void resolveRechargeSpells(String refererKey, JsonNode recharge...
method resolveFilter (line 444) | public void resolveFilter(String refererKey, JsonNode filter, String c...
method addFromText (line 499) | private void addFromText(String refererKey, String tag, String constra...
class FilterConditions (line 514) | static class FilterConditions {
method setClasses (line 525) | public void setClasses(String[] classList) {
method setLevels (line 534) | public void setLevels(String[] level) {
method setSchools (line 541) | public void setSchools(String[] school) {
method setSources (line 548) | public void setSources(String[] source) {
method setSpellAttack (line 555) | public void setSpellAttack(String[] source) {
method setComponentsMisc (line 561) | public void setComponentsMisc(String[] components) {
method matchAll (line 567) | boolean matchAll(SpellEntry spell) {
method testClasses (line 577) | private boolean testClasses(SpellEntry spell) {
method testLevels (line 581) | private boolean testLevels(SpellEntry spell) {
method testSchools (line 585) | private boolean testSchools(SpellEntry spell) {
method testSources (line 589) | private boolean testSources(SpellEntry spell, Tools5eSources spellSo...
method testSpellAttack (line 593) | private boolean testSpellAttack(SpellEntry spell) {
method testSpellComponents (line 598) | private boolean testSpellComponents(SpellEntry spell) {
type SpellIndexFields (line 608) | enum SpellIndexFields implements JsonNodeReader {
method SpellIndexFields (line 643) | SpellIndexFields(String nodeName) {
method SpellIndexFields (line 647) | SpellIndexFields() {
method nodeName (line 651) | @Override
method index (line 657) | @Override
method getSources (line 662) | @Override
FILE: src/main/java/dev/ebullient/convert/tools/dnd5e/SpellSchool.java
type SpellSchool (line 3) | public interface SpellSchool {
method name (line 5) | String name();
method code (line 7) | String code();
method code (line 10) | @Override
method name (line 15) | @Override
type SchoolEnum (line 21) | enum SchoolEnum implements SpellSchool {
method SchoolEnum (line 35) | SchoolEnum(String abbreviation) {
method code (line 39) | public String code() {
method fromEncodedValue (line 44) | static SpellSchool fromEncodedValue(String v) {
FILE: src/main/java/dev/ebullient/convert/tools/dnd5e/Tools5eIndex.java
class Tools5eIndex (line 45) | public class Tools5eIndex implements JsonSource, ToolsIndex {
method instance (line 48) | public static Tools5eIndex instance() {
method isSrdBasicOnly (line 52) | public static boolean isSrdBasicOnly() {
method Tools5eIndex (line 106) | public Tools5eIndex(CompendiumConfig config) {
method importTree (line 111) | public Tools5eIndex importTree(String filename, JsonNode node) {
method importHomebrewTree (line 127) | private void importHomebrewTree(HomebrewMetaTypes homebrew) {
method indexTypes (line 139) | private void indexTypes(String filename, JsonNode node) {
method addToSubraceIndex (line 238) | void addToSubraceIndex(Tools5eIndexType type, JsonNode node) {
method addMagicVariantToIndex (line 242) | void addMagicVariantToIndex(Tools5eIndexType type, JsonNode node) {
method addBaseItemToIndex (line 248) | void addBaseItemToIndex(Tools5eIndexType type, JsonNode node) {
method addToIndex (line 253) | void addToIndex(Tools5eIndexType type, JsonNode node) {
method prepare (line 321) | public void prepare() {
method defineSubraces (line 554) | private void defineSubraces() {
method findVariants (line 615) | List<JsonNode> findVariants(String key, JsonNode jsonSource, List<Json...
method isReprinted (line 635) | private boolean isReprinted(String finalKey, JsonNode jsonSource) {
method processDependentType (line 731) | private boolean processDependentType(final String key) {
method notPrepared (line 839) | public boolean notPrepared() {
method elementsMatching (line 843) | public List<JsonNode> elementsMatching(Tools5eIndexType type, String m...
method nodesMatching (line 849) | private List<JsonNode> nodesMatching(String pattern) {
method addSrdEntry (line 856) | private void addSrdEntry(String key, JsonNode node) {
method addAlias (line 872) | void addAlias(String key, String alias) {
method getSubclassKey (line 883) | public String getSubclassKey(String targetKey) {
method getAliasesFor (line 888) | public List<String> getAliasesFor(String targetKey) {
method getAliasOrDefault (line 895) | public String getAliasOrDefault(String key) {
method getAliasOrDefault (line 902) | public String getAliasOrDefault(String key, boolean includeReprints) {
method getNode (line 935) | public JsonNode getNode(String finalKey) {
method getHomebrewMetaTypes (line 942) | public Collection<HomebrewMetaTypes> getHomebrewMetaTypes(Tools5eSourc...
method findItemProperty (line 946) | public ItemProperty findItemProperty(String tagReference, Tools5eSourc...
method findItemType (line 972) | public ItemType findItemType(String tagReference, Tools5eSources sourc...
method findItemMastery (line 998) | public ItemMastery findItemMastery(String tagReference, Tools5eSources...
method findSkillOrAbility (line 1024) | public SkillOrAbility findSkillOrAbility(String key, Tools5eSources so...
method findSpellSchool (line 1042) | public SpellSchool findSpellSchool(String code, Tools5eSources sources) {
method findSubclasses (line 1057) | public Set<String> findSubclasses(String classKey) {
method resolveClassSource (line 1066) | public String resolveClassSource(String className, String classSource) {
method findClassFeatures (line 1080) | public Set<String> findClassFeatures(String classOrSubclassKey) {
method findTable (line 1084) | public JsonNode findTable(SourceAndPage sourceAndPage, String rowData) {
method matchTable (line 1101) | private Optional<JsonNode> matchTable(String rowData, JsonNode table) {
method getOriginNoFallback (line 1109) | public JsonNode getOriginNoFallback(String finalKey) {
method getOrigin (line 1121) | public JsonNode getOrigin(String finalKey) {
method linkifyByName (line 1157) | public String linkifyByName(Tools5eIndexType type, String name) {
method customContentIncluded (line 1213) | public boolean customContentIncluded() {
method sourceIncluded (line 1222) | public boolean sourceIncluded(String source) {
method isIncluded (line 1226) | public boolean isIncluded(String key) {
method isIncluded (line 1231) | public boolean isIncluded(String key, boolean followReprints) {
method isExcluded (line 1236) | public boolean isExcluded(String key) {
method recordTableReference (line 1240) | public void recordTableReference(String key) {
method isTableReferenced (line 1244) | public boolean isTableReferenced(String key) {
method differentSource (line 1248) | public boolean differentSource(Tools5eSources sources, String source) {
method includedEntries (line 1256) | public Set<Entry<String, JsonNode>> includedEntries() {
method getOptionalFeatureType (line 1263) | public OptionalFeatureType getOptionalFeatureType(JsonNode optfeatureN...
method getOptionalFeatureType (line 1267) | public OptionalFeatureType getOptionalFeatureType(String featureType) {
method writeFullIndex (line 1274) | @Override
method writeFilteredIndex (line 1292) | @Override
method getAdventure (line 1300) | @Override
method getBook (line 1306) | @Override
method linkSources (line 1312) | void linkSources(Tools5eIndexType type, JsonNode dataNode) {
method markdownConverter (line 1329) | @Override
method cfg (line 1334) | @Override
method index (line 1339) | @Override
method getSources (line 1344) | @Override
method getSpellIndex (line 1349) | public SpellIndex getSpellIndex() {
method toString (line 1353) | @Override
method cleanup (line 1368) | public void cleanup() {
class Tuple (line 1401) | static class Tuple {
method Tuple (line 1405) | public Tuple(String key, JsonNode node) {
method Tuple (line 1409) | public Tuple(String key, JsonNode node, String name) {
method getName (line 1417) | public String getName() {
method getSource (line 1426) | public String getSource() {
FILE: src/main/java/dev/ebullient/convert/tools/dnd5e/Tools5eIndexType.java
type Tools5eIndexType (line 18) | public enum Tools5eIndexType implements IndexType, JsonNodeReader {
method Tools5eIndexType (line 101) | Tools5eIndexType() {
method Tools5eIndexType (line 105) | Tools5eIndexType(String templateName) {
method templateName (line 109) | public String templateName() {
method fromText (line 113) | public static Tools5eIndexType fromText(String name) {
method getTypeFromKey (line 131) | public static Tools5eIndexType getTypeFromKey(String key) {
method getTypeFromNode (line 139) | public static Tools5eIndexType getTypeFromNode(JsonNode node) {
method createKey (line 144) | @Override
method createKey (line 264) | public String createKey(String name, String source) {
method fromTagReference (line 279) | public String fromTagReference(String crossRef) {
method toTagReference (line 404) | public String toTagReference(JsonNode entry) {
method linkify (line 441) | public String linkify(JsonSource convert, JsonNode entry) {
method getSubclassKey (line 446) | public static String getSubclassKey(String className, String classSour...
method fromChildKey (line 458) | public String fromChildKey(String key) {
method multiNode (line 481) | public boolean multiNode() {
method writeFile (line 499) | public boolean writeFile() {
method useQuteNote (line 525) | public boolean useQuteNote() {
method useCompendiumBase (line 549) | public boolean useCompendiumBase() {
method defaultSourceString (line 567) | public String defaultSourceString() {
method defaultOutputSource (line 604) | public String defaultOutputSource() {
method hasVariants (line 628) | boolean hasVariants() {
method isFluffType (line 635) | boolean isFluffType() {
method isDependentType (line 658) | boolean isDependentType() {
method isOutputType (line 672) | boolean isOutputType() {
type IndexFields (line 676) | enum IndexFields implements JsonNodeReader {
method withArrayFrom (line 692) | public void withArrayFrom(JsonNode node, BiConsumer<Tools5eIndexType, ...
method withArrayFrom (line 698) | public void withArrayFrom(JsonNode node, String field, BiConsumer<Tool...
method isKey (line 704) | boolean isKey(String crossRef) {
FILE: src/main/java/dev/ebullient/convert/tools/dnd5e/Tools5eJsonSourceCopier.java
class Tools5eJsonSourceCopier (line 27) | public class Tools5eJsonSourceCopier extends JsonSourceCopier<Tools5eInd...
method Tools5eJsonSourceCopier (line 61) | Tools5eJsonSourceCopier(Tools5eIndex index) {
method index (line 65) | @Override
method getSources (line 70) | @Override
method getOriginNode (line 75) | @Override
method mergePreserveKey (line 80) | @Override
method getCopyEntryProps (line 86) | @Override
method mergeSubrace (line 92) | public JsonNode mergeSubrace(JsonNode subraceNode, JsonNode raceNode) {
method mergeNodes (line 201) | @Override
method resolveDynamicVariable (line 272) | @Override
method doModProp (line 326) | protected void doModProp(
method doScalarAddHit (line 350) | private void doScalarAddHit(String originKey, JsonNode modInfo, String...
method doScalarAddDc (line 362) | private void doScalarAddDc(String originKey, JsonNode modInfo, String ...
method doScalarMultXp (line 373) | private void doScalarMultXp(String originKey, JsonNode modInfo, Object...
method doMaxSize (line 406) | private void doMaxSize(String originKey, JsonNode modInfo, ObjectNode ...
method doAddSpells (line 436) | void doAddSpells(String originKey, JsonNode modInfo, JsonNode copyFrom...
method doReplaceSpells (line 513) | void doReplaceSpells(String originKey, JsonNode modInfo, JsonNode copy...
method replaceSpells (line 551) | void replaceSpells(String originKey, ObjectNode currentSpells, JsonNod...
method doRemoveSpells (line 573) | void doRemoveSpells(String originKey, JsonNode modInfo, JsonNode copyF...
method removeSpells (line 621) | void removeSpells(String originKey, ArrayNode spellList, JsonNode remo...
method doAddSenses (line 630) | void doAddSenses(String originKey, JsonNode modInfo, JsonNode copyFrom...
method doAddSkills (line 657) | void doAddSkills(String originKey, JsonNode modInfo, ObjectNode target) {
method getShortName (line 683) | public static String getShortName(JsonNode target, boolean isTitleCase) {
method getShortNameFromName (line 708) | public static String getShortNameFromName(String name, boolean isNamed...
method getAbilityModNumber (line 717) | int getAbilityModNumber(int abilityScore) {
method getAbilityForSkill (line 721) | String getAbilityForSkill(String skill) {
FILE: src/main/java/dev/ebullient/convert/tools/dnd5e/Tools5eLinkifier.java
class Tools5eLinkifier (line 17) | public class Tools5eLinkifier {
method instance (line 20) | public static Tools5eLinkifier instance() {
method Tools5eLinkifier (line 30) | private Tools5eLinkifier() {
method monsterPath (line 34) | public String monsterPath(boolean isNpc, String type) {
method monsterPath (line 38) | public String monsterPath(boolean isNpc, MonsterType type) {
method vaultRoot (line 42) | public String vaultRoot(Tools5eSources sources) {
method vaultRoot (line 46) | public String vaultRoot(Tools5eIndexType type) {
method getRelativePath (line 52) | public String getRelativePath(Tools5eSources sources) {
method getRelativePath (line 56) | public String getRelativePath(Tools5eIndexType type) {
method getTargetFileName (line 82) | public String getTargetFileName(String name, Tools5eSources sources) {
method getTargetFileName (line 93) | public String getTargetFileName(String name, String source, Tools5eInd...
method fixFileName (line 97) | private String fixFileName(String fileName, Tools5eSources sources) {
method fixFileName (line 101) | private String fixFileName(String fileName, String primarySource, Tool...
method sourceIfNotDefault (line 113) | private static String sourceIfNotDefault(String source, Tools5eIndexTy...
method link (line 148) | public String link(String linkText, String key) {
method link (line 156) | public String link(Tools5eSources linkSource) {
method link (line 166) | public String link(String linkText, Tools5eSources linkSource) {
method createLink (line 174) | private String createLink(String linkText, String key, Tools5eSources ...
method linkOrText (line 209) | private String linkOrText(String linkText, String key, String dirName,...
method linkCard (line 218) | private String linkCard(String linkText, String cardKey) {
method linkClass (line 232) | private String linkClass(String linkText, String classKey) {
method linkClassFeature (line 239) | private String linkClassFeature(String linkText, String featureKey) {
method linkCreature (line 257) | private String linkCreature(String linkText, String creatureKey) {
method linkDeity (line 270) | private String linkDeity(String linkText, String deityKey) {
method linkOptionalFeature (line 277) | public String linkOptionalFeature(String linkText, String featureType) {
method linkRule (line 290) | private String linkRule(String linkText, String ruleKey) {
method linkSpellEntry (line 313) | public String linkSpellEntry(Tools5eSources sources) {
method linkSubclass (line 323) | public String linkSubclass(String linkText, String subclassKey) {
method linkSubclassFeature (line 329) | public String linkSubclassFeature(String linkText,
method linkVariantRules (line 354) | private String linkVariantRules(String linkText, String rulesKey) {
method getDeityResourceName (line 366) | public String getDeityResourceName(Tools5eSources deitySources) {
method getClassResource (line 390) | public String getClassResource(String className, String classSource) {
method getSubclassResource (line 394) | public String getSubclassResource(String subclassKey) {
method getSubclassResource (line 401) | public String getSubclassResource(String subclass, String parentClass,...
method getOptionalFeatureTypeResource (line 421) | public String getOptionalFeatureTypeResource(String name) {
method getClassSpellList (line 425) | public String getClassSpellList(JsonNode classNode) {
method getClassSpellList (line 429) | public String getClassSpellList(String className) {
method getSpellList (line 435) | public String getSpellList(String name, Tools5eSources sources) {
method decoratedName (line 445) | public String decoratedName(JsonNode entry) {
method decoratedName (line 450) | public String decoratedName(Tools5eIndexType type, JsonNode entry) {
method decoratedName (line 467) | public String decoratedName(String name, JsonNode entry) {
method decoratedFeatureTypeName (line 479) | public String decoratedFeatureTypeName(Tools5eSources valueSources, Js...
method slugify (line 534) | String slugify(String s) {
method reset (line 538) | void reset() {
FILE: src/main/java/dev/ebullient/convert/tools/dnd5e/Tools5eMarkdownConverter.java
class Tools5eMarkdownConverter (line 20) | public class Tools5eMarkdownConverter implements MarkdownConverter {
method Tools5eMarkdownConverter (line 24) | public Tools5eMarkdownConverter(Tools5eIndex index, MarkdownWriter wri...
method writeAll (line 29) | public Tools5eMarkdownConverter writeAll() {
method writeImages (line 33) | public Tools5eMarkdownConverter writeImages() {
method writeFiles (line 40) | public Tools5eMarkdownConverter writeFiles(IndexType type) {
class WritingQueue (line 44) | static class WritingQueue {
method writeFiles (line 54) | public Tools5eMarkdownConverter writeFiles(List<? extends IndexType> t...
method _writeFiles (line 124) | private void _writeFiles(List<? extends IndexType> types, WritingQueue...
method writeQuteBaseFiles (line 157) | private void writeQuteBaseFiles(Tools5eIndexType type, String key, Jso...
method writeQuteNoteFiles (line 192) | private void writeQuteNoteFiles(Tools5eIndexType nodeType, String key,...
method append (line 290) | <T extends QuteBase> void append(Tools5eIndexType type, T note, List<T...
method linkifier (line 300) | private static Tools5eLinkifier linkifier() {
FILE: src/main/java/dev/ebullient/convert/tools/dnd5e/Tools5eSources.java
class Tools5eSources (line 34) | @TemplateData
method isBasicRules (line 44) | private static boolean isBasicRules(String key, JsonNode jsonElement) {
method isBasicRules2024 (line 53) | private static boolean isBasicRules2024(String key, JsonNode jsonEleme...
method has2024basicSrd (line 62) | public static boolean has2024basicSrd() {
method has2024Content (line 68) | public static boolean has2024Content() {
method has2014basicSrd (line 74) | public static boolean has2014basicSrd() {
method has2014Content (line 80) | public static boolean has2014Content() {
method includedByConfig (line 86) | public static boolean includedByConfig(String key) {
method excludedByConfig (line 91) | public static boolean excludedByConfig(String key) {
method filterRuleApplied (line 95) | public static boolean filterRuleApplied(String key) {
method findSources (line 100) | public static Tools5eSources findSources(String key) {
method findSources (line 107) | public static Tools5eSources findSources(JsonNode node) {
method constructSources (line 112) | public static Tools5eSources constructSources(String key, JsonNode nod...
method findOrTemporary (line 125) | public static Tools5eSources findOrTemporary(JsonNode node) {
method getImages (line 147) | public static Collection<ImageRef> getImages() {
method getInlineNotes (line 151) | public static Collection<QuteBase> getInlineNotes(String key) {
method addInlineNote (line 155) | public void addInlineNote(QuteBase note) {
method getFonts (line 159) | public static Collection<FontRef> getFonts() {
method addFonts (line 165) | public static void addFonts(JsonNode source, JsonNodeReader field) {
method addFont (line 177) | public static void addFont(String fontFamily, String fontString) {
method addFont (line 189) | public static void addFont(String fontString) {
method getFontReference (line 194) | public static String getFontReference(String fontString) {
method isSrd (line 204) | public static boolean isSrd(JsonNode node) {
method srdName (line 210) | public static String srdName(JsonNode node) {
method Tools5eSources (line 227) | private Tools5eSources(Tools5eIndexType type, String key, JsonNode jso...
method addBrewSource (line 242) | private void addBrewSource(JsonNodeReader field, JsonNode jsonElement) {
method isHomebrew (line 249) | public boolean isHomebrew() {
method isSrdOrBasicRules (line 254) | public boolean isSrdOrBasicRules() {
method includedByConfig (line 262) | public boolean includedByConfig() {
method filterRuleApplied (line 269) | public boolean filterRuleApplied() {
method getDecoratedName (line 273) | public String getDecoratedName() {
method testSourceRules (line 277) | private void testSourceRules() {
method testSourceRules (line 287) | private boolean testSourceRules(CompendiumConfig config, Optional<Bool...
method testSourceIncluded (line 305) | private boolean testSourceIncluded(CompendiumConfig config) {
method testSrdRules2014 (line 312) | private boolean testSrdRules2014(CompendiumConfig config) {
method testSrdRules2024 (line 320) | private boolean testSrdRules2024(CompendiumConfig config) {
method includedBy (line 328) | @Override
method getType (line 341) | @Override
method isSynthetic (line 346) | @Override
method edition (line 351) | public String edition() {
method isClassic (line 355) | public boolean isClassic() {
method getSourceText (line 359) | public String getSourceText() {
method findNode (line 377) | public JsonNode findNode() {
method findName (line 385) | protected String findName(IndexType type, JsonNode jsonElement) {
method findSourceText (line 407) | @Override
method uaSource (line 467) | public Optional<String> uaSource() {
method buildTokenImageRef (line 472) | public ImageRef buildTokenImageRef(Tools5eIndex index, String sourcePa...
method buildImageRef (line 484) | public ImageRef buildImageRef(Tools5eIndex index, JsonMediaHref mediaH...
method amendSources (line 543) | public void amendSources(Tools5eSources otherSources) {
method amendSources (line 549) | public void amendSources(Set<String> brewSources) {
method amendHomebrewSources (line 554) | public void amendHomebrewSources(JsonNode homebrewElement) {
method contains (line 560) | public boolean contains(Tools5eSources sources) {
type SourceAttributes (line 565) | public enum SourceAttributes implements JsonNodeReader {
method clear (line 573) | public static void clear() {
method isClassicEdition (line 582) | public static boolean isClassicEdition(JsonNode baseItem) {
FILE: src/main/java/dev/ebullient/convert/tools/dnd5e/qute/AbilityScores.java
method getModifier (line 38) | public static int getModifier(AbilityScore score) {
method scoreToModifier (line 45) | public static int scoreToModifier(int score) {
method toArray (line 53) | public int[] toArray() {
method getStr (line 65) | public String getStr() {
method getStrStat (line 70) | public int getStrStat() {
method getStrMod (line 75) | public String getStrMod() {
method getDex (line 80) | public String getDex() {
method getDexStat (line 85) | public int getDexStat() {
method getDexMod (line 90) | public String getDexMod() {
method getCon (line 95) | public String getCon() {
method getConStat (line 100) | public int getConStat() {
method getConMod (line 105) | public String getConMod() {
method getInt (line 110) | public String getInt() {
method getIntStat (line 115) | public int getIntStat() {
method getIntMod (line 120) | public String getIntMod() {
method getWis (line 125) | public String getWis() {
method getWisStat (line 130) | public int getWisStat() {
method getWisMod (line 135) | public String getWisMod() {
method getCha (line 140) | public String getCha() {
method getChaStat (line 145) | public int getChaStat() {
method getChaMod (line 150) | public String getChaMod() {
method getScore (line 154) | public AbilityScore getScore(String name) {
method toString (line 173) | @Override
method isSpecial (line 193) | public boolean isSpecial() {
method modifier (line 198) | public int modifier() {
method toString (line 202) | @Override
class Builder (line 211) | public static class Builder {
method Builder (line 219) | public Builder() {
method setStrength (line 222) | public Builder setStrength(int strength) {
method setDexterity (line 227) | public Builder setDexterity(int dexterity) {
method setConstitution (line 232) | public Builder setConstitution(int constitution) {
method setIntelligence (line 237) | public Builder setIntelligence(int intelligence) {
method setWisdom (line 242) | public Builder setWisdom(int wisdom) {
method setCharisma (line 247) | public Builder setCharisma(int charisma) {
method build (line 252) | public AbilityScores build() {
FILE: src/main/java/dev/ebullient/convert/tools/dnd5e/qute/AcHp.java
class AcHp (line 16) | @TemplateData
method AcHp (line 35) | public AcHp() {
method AcHp (line 38) | public AcHp(Integer ac, String acText, Integer hp, String hpText, Stri...
method AcHp (line 46) | public AcHp(AcHp other) {
method getHpDiceRoller (line 58) | public String getHpDiceRoller() {
method getHp (line 67) | public String getHp() {
method toString (line 71) | public String toString() {
FILE: src/main/java/dev/ebullient/convert/tools/dnd5e/qute/ImmuneResist.java
class ImmuneResist (line 16) | @TemplateData
method ImmuneResist (line 27) | public ImmuneResist() {
method ImmuneResist (line 30) | public ImmuneResist(String vulnerable, String resist, String immune, S...
method isPresent (line 38) | public boolean isPresent() {
method toString (line 45) | @Override
FILE: src/main/java/dev/ebullient/convert/tools/dnd5e/qute/QuteBackground.java
class QuteBackground (line 15) | @TemplateData
method QuteBackground (line 23) | public QuteBackground(Tools5eSources sources, String name, String source,
FILE: src/main/java/dev/ebullient/convert/tools/dnd5e/qute/QuteBastion.java
class QuteBastion (line 19) | @TemplateData
method QuteBastion (line 40) | public QuteBastion(Tools5eSources sources, String name, String source,
method getHirelingDescription (line 55) | public String getHirelingDescription() {
method getSpaceDescription (line 67) | public String getSpaceDescription() {
method getDescription (line 94) | public String getDescription() {
method Space (line 123) | public Space(String name, Integer squares, Integer cost, Integer time) {
method getDescription (line 128) | public String getDescription(String type, String facilityName) {
FILE: src/main/java/dev/ebullient/convert/tools/dnd5e/qute/QuteClass.java
class QuteClass (line 21) | @TemplateData
method QuteClass (line 54) | public QuteClass(Tools5eSources sources, String name, String source,
method prereq (line 109) | public String prereq() {
method prereqSpecial (line 120) | public String prereqSpecial() {
method profIntro (line 137) | public String profIntro() {
method toString (line 141) | @Override
method toString (line 223) | @Override
method getProficiencies (line 235) | public String getProficiencies() {
method getArmorString (line 263) | public String getArmorString() {
method getJoinOrDefault (line 296) | public String getJoinOrDefault(List<String> value, String conjunct) {
method HitPointDie (line 326) | public HitPointDie(String name, int number, int face, boolean isClassi...
method toString (line 330) | @Override
FILE: src/main/java/dev/ebullient/convert/tools/dnd5e/qute/QuteDeck.java
class QuteDeck (line 17) | @TemplateData
method QuteDeck (line 26) | public QuteDeck(CompendiumSources sources, String name, String source,
class Card (line 33) | @TemplateData
method Card (line 50) | public Card(String name, ImageRef face, String text, String suitValu...
FILE: src/main/java/dev/ebullient/convert/tools/dnd5e/qute/QuteDeity.java
class QuteDeity (line 15) | @TemplateData
method QuteDeity (line 37) | public QuteDeity(Tools5eSources sources, String name, String source,
method getAltNames (line 54) | @Override
method targetFile (line 59) | @Override
FILE: src/main/java/dev/ebullient/convert/tools/dnd5e/qute/QuteFeat.java
class QuteFeat (line 15) | @TemplateData
method QuteFeat (line 27) | public QuteFeat(Tools5eSources sources, String name, String source,
FILE: src/main/java/dev/ebullient/convert/tools/dnd5e/qute/QuteHazard.java
class QuteHazard (line 15) | @TemplateData
method QuteHazard (line 21) | public QuteHazard(CompendiumSources sources, String name, String source,
FILE: src/main/java/dev/ebullient/convert/tools/dnd5e/qute/QuteItem.java
class QuteItem (line 19) | @TemplateData
method QuteItem (line 28) | public QuteItem(Tools5eSources sources, String source,
method getAltNames (line 38) | @Override
method getDetail (line 49) | public String getDetail() {
method getSubtypeString (line 54) | public String getSubtypeString() {
method getProperties (line 59) | public String getProperties() {
method getMastery (line 64) | public String getMastery() {
method getArmorClass (line 69) | public String getArmorClass() {
method getDamage (line 74) | public String getDamage() {
method getDamage2h (line 79) | public String getDamage2h() {
method getRange (line 84) | public String getRange() {
method getStrengthRequirement (line 89) | public Integer getStrengthRequirement() {
method getStealthPenalty (line 94) | public boolean getStealthPenalty() {
method getPrerequisite (line 99) | public String getPrerequisite() {
method getCost (line 104) | public String getCost() {
method getCostCp (line 109) | public Integer getCostCp() {
method getWeight (line 114) | public Double getWeight() {
method getVariantAliases (line 122) | public String getVariantAliases() {
method getVariantSectionLinks (line 135) | public String getVariantSectionLinks() {
method getProperties (line 249) | public String getProperties() {
method getMastery (line 254) | public String getMastery() {
FILE: src/main/java/dev/ebullient/convert/tools/dnd5e/qute/QuteMonster.java
class QuteMonster (line 39) | @TemplateData
method QuteMonster (line 94) | public QuteMonster(Tools5eSources sources, String name, String source,...
method targetPath (line 149) | @Override
method getHp (line 155) | public String getHp() {
method getAc (line 160) | public Integer getAc() {
method getAcText (line 165) | public String getAcText() {
method getHpText (line 170) | public String getHpText() {
method getHitDice (line 175) | public String getHitDice() {
method getSpellcasting (line 187) | public String getSpellcasting() {
method getRawSpellcasting (line 195) | public List<Spellcasting> getRawSpellcasting() {
method getVulnerable (line 200) | public String getVulnerable() {
method getResist (line 205) | public String getResist() {
method getImmune (line 210) | public String getImmune() {
method getConditionImmune (line 215) | public String getConditionImmune() {
method getFullType (line 220) | public String getFullType() {
method getScoreString (line 224) | @Deprecated
method getSavingThrows (line 233) | public String getSavingThrows() {
method getSkills (line 244) | public String getSkills() {
method getTrait (line 252) | public List<NamedText> getTrait() {
method getAction (line 257) | public List<NamedText> getAction() {
method getBonusAction (line 262) | public List<NamedText> getBonusAction() {
method getReaction (line 267) | public List<NamedText> getReaction() {
method getLegendary (line 272) | public List<NamedText> getLegendary() {
method traitsWithHeader (line 276) | private List<NamedText> traitsWithHeader(TraitDescription traitDesc) {
method getLegendaryGroup (line 292) | public Collection<NamedText> getLegendaryGroup() {
method getLegendaryGroupLink (line 309) | public String getLegendaryGroupLink() {
method get5eInitiativeYamlNoSource (line 319) | public String get5eInitiativeYamlNoSource() {
method get5eInitiativeYaml (line 329) | public String get5eInitiativeYaml() {
method get5eInitiativeYaml (line 333) | private String get5eInitiativeYaml(boolean withSource) {
method get5eStatblockYamlNoSource (line 356) | public String get5eStatblockYamlNoSource() {
method get5eStatblockYaml (line 367) | public String get5eStatblockYaml() {
method render5eStatblockYaml (line 371) | private String render5eStatblockYaml(boolean withSource) {
method traitsFrom (line 440) | private List<NamedText> traitsFrom(TraitDescription traitDesc) {
method yamlMonsterName (line 447) | private String yamlMonsterName(boolean withSource) {
method add (line 501) | public void add(int i, NamedText nt) {
method isPresent (line 505) | public boolean isPresent() {
method add (line 509) | public void add(NamedText nt) {
method asNamedText (line 513) | public NamedText asNamedText() {
class Spellcasting (line 550) | @TemplateData
method toString (line 605) | @Override
method getDesc (line 614) | public String getDesc() {
method spellToTitle (line 681) | String spellToTitle(String key, Spells spells) {
method spellSlots (line 697) | String spellSlots(String key, Spells spells) {
method appendList (line 704) | void appendList(List<String> text, String title, List<String> spells) {
method appendList (line 712) | void appendList(List<String> text, Function<String, String> titleFun...
class Spells (line 735) | @TemplateData
method SavingThrow (line 757) | public SavingThrow(String ability, String special) {
method SavingThrow (line 762) | public SavingThrow(String ability, int modifier) {
method SavingThrow (line 767) | public SavingThrow(String ability, AbilityScore score) {
method isSpecial (line 772) | public boolean isSpecial() {
method mapValue (line 776) | public Object mapValue() {
method toString (line 780) | @Override
method SkillModifier (line 801) | public SkillModifier(String skill, String skillLink, String special) {
method SkillModifier (line 805) | public SkillModifier(String skill, String skillLink, int modifier) {
method isSpecial (line 810) | public boolean isSpecial() {
method mapValue (line 814) | public Object mapValue() {
method toString (line 818) | @Override
class SavesAndSkills (line 830) | @TemplateData
method withParent (line 836) | private SavesAndSkills withParent(QuteMonster parent) {
method getSaves (line 859) | public String getSaves() {
method getSaveValues (line 869) | public List<Map<String, Object>> getSaveValues() {
method getSaveOrDefault (line 891) | public Map<String, Object> getSaveOrDefault() {
method addToMap (line 915) | private void addToMap(Map<String, Object> map, SavingThrow s, boolea...
method getSkills (line 927) | public String getSkills() {
method getSkillValues (line 947) | public List<Map<String, Object>> getSkillValues() {
method flattenChoices (line 972) | public List<String> flattenChoices() {
method Initiative (line 1000) | public Initiative(int bonus) {
method Initiative (line 1004) | public Initiative(int bonus, InitiativeMode mode) {
method getPassiveInitiative (line 1015) | public String getPassiveInitiative() {
method toString (line 1024) | public String toString() {
type InitiativeMode (line 1035) | public enum InitiativeMode {
method fromString (line 1043) | public static InitiativeMode fromString(String string) {
type HiddenType (line 1057) | @JavadocIgnore
type DurationType (line 1075) | @JavadocIgnore
method DurationType (line 1090) | DurationType(String durationText) {
FILE: src/main/java/dev/ebullient/convert/tools/dnd5e/qute/QuteObject.java
class QuteObject (line 20) | @TemplateData
method QuteObject (line 49) | public QuteObject(CompendiumSources sources,
method getHp (line 78) | public String getHp() {
method getAc (line 83) | public Integer getAc() {
method getAcText (line 88) | public String getAcText() {
method getHpText (line 93) | public String getHpText() {
method getHitDice (line 98) | public String getHitDice() {
method getVulnerable (line 103) | public String getVulnerable() {
method getResist (line 108) | public String getResist() {
method getImmune (line 113) | public String getImmune() {
method getConditionImmune (line 118) | public String getConditionImmune() {
method get5eInitiativeYaml (line 126) | public String get5eInitiativeYaml() {
method get5eStatblockYaml (line 141) | public String get5eStatblockYaml() {
FILE: src/main/java/dev/ebullient/convert/tools/dnd5e/qute/QutePsionic.java
class QutePsionic (line 16) | @TemplateData
method QutePsionic (line 26) | public QutePsionic(CompendiumSources sources, String name, String source,
FILE: src/main/java/dev/ebullient/convert/tools/dnd5e/qute/QuteRace.java
class QuteRace (line 16) | @TemplateData
method QuteRace (line 34) | public QuteRace(Tools5eSources sources, String name, String source,
method getCssClass (line 49) | public String getCssClass() {
FILE: src/main/java/dev/ebullient/convert/tools/dnd5e/qute/QuteReward.java
class QuteReward (line 15) | @TemplateData
method QuteReward (line 27) | public QuteReward(CompendiumSources sources, String name, String source,
FILE: src/main/java/dev/ebullient/convert/tools/dnd5e/qute/QuteSpell.java
class QuteSpell (line 17) | @TemplateData
method QuteSpell (line 75) | public QuteSpell(Tools5eSources sources, String name, String source, S...
method getClassList (line 139) | public List<String> getClassList() {
FILE: src/main/java/dev/ebullient/convert/tools/dnd5e/qute/QuteSubclass.java
class QuteSubclass (line 15) | @TemplateData
method QuteSubclass (line 28) | public QuteSubclass(Tools5eSources sources,
method targetFile (line 44) | @Override
method title (line 51) | @Override
FILE: src/main/java/dev/ebullient/convert/tools/dnd5e/qute/QuteVehicle.java
class QuteVehicle (line 25) | @TemplateData
method QuteVehicle (line 58) | public QuteVehicle(CompendiumSources sources, String name, String source,
method getIsShip (line 84) | public boolean getIsShip() {
method getIsSpelljammer (line 89) | public boolean getIsSpelljammer() {
method getIsWarMachine (line 94) | public boolean getIsWarMachine() {
method getIsCreature (line 99) | public boolean getIsCreature() {
method getIsObject (line 104) | public boolean getIsObject() {
class ShipCrewCargoPace (line 122) | @TemplateData
method ShipCrewCargoPace (line 147) | public ShipCrewCargoPace(String vehicleType, String crew, String cre...
method toString (line 161) | public String toString() {
class ShipAcHp (line 227) | @TemplateData
method ShipAcHp (line 238) | public ShipAcHp(String type, Integer ac, String acText, Integer hp, ...
method ShipAcHp (line 247) | public ShipAcHp(String type, AcHp creatureAcHp) {
method toString (line 252) | public String toString() {
class ShipSection (line 289) | @TemplateData
method ShipSection (line 302) | public ShipSection(String name, ShipAcHp acHp, List<String> speed, L...
method toString (line 310) | public String toString() {
FILE: src/main/java/dev/ebullient/convert/tools/dnd5e/qute/Tools5eQuteBase.java
class Tools5eQuteBase (line 22) | @TemplateData
method Tools5eQuteBase (line 32) | public Tools5eQuteBase(CompendiumSources sources, String name, String ...
method sources (line 38) | @Override
method getHasImages (line 46) | public boolean getHasImages() {
method getHasMoreImages (line 53) | public boolean getHasMoreImages() {
method getShowPortraitImage (line 61) | public String getShowPortraitImage() {
method getShowAllImages (line 72) | public String getShowAllImages() {
method getShowMoreImages (line 80) | public String getShowMoreImages() {
method createImageLinks (line 84) | private String createImageLinks(boolean omitFirst) {
method withTargetFile (line 102) | public Tools5eQuteBase withTargetFile(String filename) {
method targetFile (line 107) | public String targetFile() {
method withTargetPath (line 114) | public Tools5eQuteBase withTargetPath(String path) {
method targetPath (line 119) | public String targetPath() {
method withTemplate (line 129) | public Tools5eQuteBase withTemplate(String template) {
method template (line 134) | public String template() {
method inlineNotes (line 138) | public Collection<QuteBase> inlineNotes() {
method getVaultPath (line 144) | @Override
method linkifier (line 153) | protected Tools5eLinkifier linkifier() {
FILE: src/main/java/dev/ebullient/convert/tools/dnd5e/qute/Tools5eQuteNote.java
class Tools5eQuteNote (line 19) | @TemplateData
method Tools5eQuteNote (line 26) | public Tools5eQuteNote(CompendiumSources sources, String name, String ...
method Tools5eQuteNote (line 30) | public Tools5eQuteNote(String name, String sourceText, String text, Ta...
method Tools5eQuteNote (line 34) | public Tools5eQuteNote(String name, String sourceText, List<String> te...
method withTargetFile (line 38) | public Tools5eQuteNote withTargetFile(String filename) {
method targetFile (line 43) | public String targetFile() {
method withTargetPath (line 47) | public Tools5eQuteNote withTargetPath(String path) {
method targetPath (line 52) | public String targetPath() {
method withTemplate (line 56) | public Tools5eQuteNote withTemplate(String template) {
method template (line 61) | public String template() {
method inlineNotes (line 65) | public Collection<QuteBase> inlineNotes() {
FILE: src/main/java/dev/ebullient/convert/tools/pf2e/Json2QuteAbility.java
class Json2QuteAbility (line 13) | public class Json2QuteAbility extends Json2QuteBase {
method Json2QuteAbility (line 15) | public Json2QuteAbility(Pf2eIndex index, Pf2eIndexType type, JsonNode ...
method buildQuteNote (line 19) | @Override
type Pf2eAbility (line 24) | public enum Pf2eAbility implements Pf2eJsonNodeReader {
method createAbility (line 66) | private static QuteAbility createAbility(JsonNode node, JsonSource c...
method createEmbeddedAbility (line 91) | public static QuteAbility createEmbeddedAbility(JsonNode node, JsonS...
method getLinkFrom (line 95) | public String getLinkFrom(JsonNode node, JsonSource convert) {
type Pf2eGenericAbilityReference (line 110) | private enum Pf2eGenericAbilityReference implements Pf2eJsonNodeRead...
FILE: src/main/java/dev/ebullient/convert/tools/pf2e/Json2QuteAction.java
class Json2QuteAction (line 14) | public class Json2QuteAction extends Json2QuteBase {
method Json2QuteAction (line 16) | public Json2QuteAction(Pf2eIndex index, JsonNode node) {
method buildQuteResource (line 20) | @Override
type Pf2eAction (line 49) | public enum Pf2eAction implements Pf2eJsonNodeReader {
class ActionType (line 59) | @RegisterForReflection
method addTags (line 73) | public void addTags(JsonSource convert, Tags tags) {
method isBasic (line 91) | public boolean isBasic() {
method isItem (line 95) | public boolean isItem() {
method build (line 99) | public QuteAction.ActionType build(JsonSource convert) {
method createSubclassLink (line 135) | private String createSubclassLink(String subclassName) {
method createAncestryLink (line 146) | private String createAncestryLink(String ancestry) {
method createHeritageLink (line 153) | private String createHeritageLink(String heritage) {
method createVersatileHeritageLink (line 164) | private String createVersatileHeritageLink(String versatile) {
class Skill (line 177) | @RegisterForReflection
method buildString (line 184) | public String buildString(JsonSource convert) {
FILE: src/main/java/dev/ebullient/convert/tools/pf2e/Json2QuteAffliction.java
class Json2QuteAffliction (line 22) | public class Json2QuteAffliction extends Json2QuteBase {
method Json2QuteAffliction (line 24) | public Json2QuteAffliction(Pf2eIndex index, Pf2eIndexType type, JsonNo...
method buildQuteNote (line 28) | @Override
type Pf2eAffliction (line 33) | public enum Pf2eAffliction implements Pf2eJsonNodeReader {
method createAffliction (line 99) | private static QuteAffliction createAffliction(
method createInlineAffliction (line 184) | static QuteAffliction createInlineAffliction(JsonNode node, JsonSour...
method getNestedAffliction (line 189) | private static JsonNode getNestedAffliction(JsonNode node) {
FILE: src/main/java/dev/ebullient/convert/tools/pf2e/Json2QuteArchetype.java
class Json2QuteArchetype (line 16) | public class Json2QuteArchetype extends Json2QuteBase {
method Json2QuteArchetype (line 18) | public Json2QuteArchetype(Pf2eIndex index, JsonNode rootNode) {
method buildQuteResource (line 22) | @Override
method getFeatures (line 41) | List<String> getFeatures(int dedicationLevel) {
method createQuteFeat (line 104) | QuteFeat createQuteFeat(JsonNode feat, String level) {
method findFeat (line 109) | QuteFeat findFeat(String levelKey) {
method render (line 122) | String render(QuteFeat quteFeat, boolean archetypeFeat) {
type ArchetypeField (line 131) | enum ArchetypeField implements Pf2eJsonNodeReader {
FILE: src/main/java/dev/ebullient/convert/tools/pf2e/Json2QuteBackground.java
class Json2QuteBackground (line 11) | public class Json2QuteBackground extends Json2QuteBase {
method Json2QuteBackground (line 13) | public Json2QuteBackground(Pf2eIndex index, JsonNode rootNode) {
method buildQuteResource (line 17) | @Override
type Pf2eBackground (line 38) | enum Pf2eBackground implements Pf2eJsonNodeReader {
FILE: src/main/java/dev/ebullient/convert/tools/pf2e/Json2QuteBase.java
class Json2QuteBase (line 8) | public abstract class Json2QuteBase implements JsonSource {
method Json2QuteBase (line 14) | public Json2QuteBase(Pf2eIndex index, Pf2eIndexType type, JsonNode roo...
method Json2QuteBase (line 18) | public Json2QuteBase(Pf2eIndex index, Pf2eIndexType type, JsonNode roo...
method index (line 25) | @Override
method getSources (line 30) | @Override
method build (line 35) | public Pf2eQuteBase build() {
method buildNote (line 44) | public Pf2eQuteNote buildNote() {
method buildQuteResource (line 53) | protected Pf2eQuteBase buildQuteResource() {
method buildQuteNote (line 58) | protected Pf2eQuteNote buildQuteNote() {
FILE: src/main/java/dev/ebullient/convert/tools/pf2e/Json2QuteBook.java
class Json2QuteBook (line 19) | public class Json2QuteBook extends Json2QuteBase {
method Json2QuteBook (line 24) | public Json2QuteBook(Pf2eIndex index, Pf2eIndexType type, JsonNode roo...
method buildBook (line 34) | public List<Pf2eQuteNote> buildBook() {
method chapterPage (line 109) | Pf2eQuteNote chapterPage(String name, JsonNode pageNode) {
class Ordinal (line 123) | @RegisterForReflection
type Pf2eBook (line 129) | enum Pf2eBook implements Pf2eJsonNodeReader {
FILE: src/main/java/dev/ebullient/convert/tools/pf2e/Json2QuteCompose.java
class Json2QuteCompose (line 18) | public class Json2QuteCompose extends Json2QuteBase {
method Json2QuteCompose (line 23) | public Json2QuteCompose(Pf2eIndexType type, Pf2eIndex index, String ti...
method add (line 30) | public void add(JsonNode node) {
method getSources (line 47) | @Override
method buildNote (line 52) | @Override
method appendElement (line 72) | private void appendElement(JsonNode entry, List<String> text, Tags tag...
method addDomainSpells (line 98) | void addDomainSpells(String name, List<String> text) {
type ComposeFields (line 112) | enum ComposeFields implements Pf2eJsonNodeReader {
FILE: src/main/java/dev/ebullient/convert/tools/pf2e/Json2QuteCreature.java
class Json2QuteCreature (line 18) | public class Json2QuteCreature extends Json2QuteBase {
method Json2QuteCreature (line 20) | public Json2QuteCreature(Pf2eIndex index, JsonNode rootNode) {
method buildQuteResource (line 24) | @Override
type Pf2eCreature (line 59) | enum Pf2eCreature implements Pf2eJsonNodeReader {
method create (line 86) | private static QuteCreature create(JsonNode node, JsonSource convert) {
method getSkillsFrom (line 114) | private QuteCreature.CreatureSkills getSkillsFrom(JsonNode source, J...
method getLanguagesFrom (line 125) | private QuteCreature.CreatureLanguages getLanguagesFrom(JsonNode nod...
type Pf2eCreatureLanguages (line 135) | enum Pf2eCreatureLanguages implements Pf2eJsonNodeReader {
method getCreatureAbilitiesFrom (line 145) | private QuteCreature.CreatureAbilities getCreatureAbilitiesFrom(Json...
type Pf2eCreatureAbilities (line 154) | enum Pf2eCreatureAbilities implements Pf2eJsonNodeReader {
method getSensesFrom (line 160) | private List<QuteCreature.CreatureSense> getSensesFrom(JsonNode sour...
type Pf2eCreatureSense (line 170) | enum Pf2eCreatureSense implements Pf2eJsonNodeReader {
method getSpellcastingFrom (line 179) | private List<QuteCreature.CreatureSpellcasting> getSpellcastingFrom(...
method getRitualsFrom (line 186) | private List<QuteCreature.CreatureRitualCasting> getRitualsFrom(Json...
type Pf2eCreatureSpellcasting (line 193) | enum Pf2eCreatureSpellcasting implements Pf2eJsonNodeReader {
method getRitual (line 237) | private static QuteCreature.CreatureRitualCasting getRitual(JsonNo...
method getSpellcasting (line 251) | private static QuteCreature.CreatureSpellcasting getSpellcasting(J...
method getSpellsFrom (line 264) | private List<QuteCreature.CreatureSpells> getSpellsFrom(JsonNode s...
type Pf2eCreatureSpellReference (line 279) | enum Pf2eCreatureSpellReference implements Pf2eJsonNodeReader {
method getSpellReference (line 289) | private static QuteCreature.CreatureSpellReference getSpellReferen...
FILE: src/main/java/dev/ebullient/convert/tools/pf2e/Json2QuteDeity.java
class Json2QuteDeity (line 29) | public class Json2QuteDeity extends Json2QuteBase {
method Json2QuteDeity (line 31) | public Json2QuteDeity(Pf2eIndex index, JsonNode rootNode) {
method buildQuteResource (line 35) | @Override
method buildIntercession (line 64) | private QuteDeity.QuteDivineIntercession buildIntercession() {
method buildCleric (line 84) | QuteDeity.QuteDeityCleric buildCleric() {
method buildAvatar (line 117) | QuteDeity.QuteDivineAvatar buildAvatar(Tags tags) {
method buildAvatarAbility (line 166) | private NamedText buildAvatarAbility(JsonNode abilityNode) {
method buildAvatarAttack (line 172) | private QuteInlineAttack buildAvatarAttack(JsonNode actionNode, Tags t...
method commandmentToString (line 191) | String commandmentToString(List<String> edictOrAnathema) {
class EntryAndSomething (line 197) | @RegisterForReflection
method buildAbilityString (line 204) | String buildAbilityString(JsonSource convert) {
method buildSkillString (line 211) | public String buildSkillString(JsonSource convert) {
method buildFavoredWeapon (line 220) | public String buildFavoredWeapon(JsonSource convert) {
type Pf2eDeity (line 230) | enum Pf2eDeity implements Pf2eJsonNodeReader {
method Pf2eDeity (line 277) | Pf2eDeity() {
method Pf2eDeity (line 281) | Pf2eDeity(String nodeName) {
method nodeName (line 285) | public String nodeName() {
FILE: src/main/java/dev/ebullient/convert/tools/pf2e/Json2QuteFeat.java
class Json2QuteFeat (line 12) | public class Json2QuteFeat extends Json2QuteBase {
method Json2QuteFeat (line 14) | public Json2QuteFeat(Pf2eIndex index, JsonNode rootNode) {
method buildQuteResource (line 18) | @Override
method buildArchetype (line 45) | public QuteFeat buildArchetype(String archetypeName, String dedication...
type Pf2eFeat (line 75) | public enum Pf2eFeat implements Pf2eJsonNodeReader {
FILE: src/main/java/dev/ebullient/convert/tools/pf2e/Json2QuteHazard.java
class Json2QuteHazard (line 14) | public class Json2QuteHazard extends Json2QuteBase {
method Json2QuteHazard (line 16) | public Json2QuteHazard(Pf2eIndex index, JsonNode rootNode) {
method buildQuteResource (line 20) | @Override
type Pf2eHazard (line 45) | enum Pf2eHazard implements Pf2eJsonNodeReader {
type Pf2eHazardAttribute (line 59) | enum Pf2eHazardAttribute implements Pf2eJsonNodeReader {
method buildStealth (line 65) | static QuteHazard.QuteHazardStealth buildStealth(JsonNode node, Json...
method buildPerception (line 73) | static QuteDataGenericStat.SimpleStat buildPerception(JsonNode node,...
FILE: src/main/java/dev/ebullient/convert/tools/pf2e/Json2QuteItem.java
class Json2QuteItem (line 29) | public class Json2QuteItem extends Json2QuteBase {
method Json2QuteItem (line 32) | public Json2QuteItem(Pf2eIndex index, JsonNode rootNode) {
method buildQuteResource (line 36) | @Override
method getPrice (line 69) | private String getPrice(JsonNode rootNode) {
method getShieldData (line 104) | private QuteItemShieldData getShieldData() {
method getArmorData (line 118) | private QuteItemArmorData getArmorData() {
method getWeaponData (line 139) | private List<QuteItemWeaponData> getWeaponData(Tags tags) {
method getVariants (line 155) | private List<QuteItem.QuteItemVariant> getVariants(Tags tags) {
method getContract (line 179) | private Collection<NamedText> getContract(Tags tags) {
method keysToList (line 200) | Collection<NamedText> keysToList(List<Pf2eItem> keys) {
method buildActivate (line 211) | QuteItemActivate buildActivate() {
method getGroup (line 227) | private String getGroup() {
method getCategory (line 244) | String getCategory(Tags tags) {
method penalty (line 258) | private String penalty(String input, String suffix) {
type Pf2eItem (line 265) | enum Pf2eItem implements Pf2eJsonNodeReader {
method properName (line 302) | String properName() {
type Pf2eItemVariant (line 307) | enum Pf2eItemVariant implements Pf2eJsonNodeReader {
type Pf2eWeaponData (line 315) | public enum Pf2eWeaponData implements Pf2eJsonNodeReader {
method buildWeaponData (line 325) | public static QuteItemWeaponData buildWeaponData(JsonNode source,
method getDamageString (line 355) | public static String getDamageString(JsonNode source, JsonSource con...
method getDamageType (line 374) | static String getDamageType(JsonNodeReader damageType, JsonNode sour...
FILE: src/main/java/dev/ebullient/convert/tools/pf2e/Json2QuteRitual.java
class Json2QuteRitual (line 20) | public class Json2QuteRitual extends Json2QuteSpell {
method Json2QuteRitual (line 23) | public Json2QuteRitual(Pf2eIndex index, JsonNode rootNode) {
method buildQuteResource (line 27) | @Override
method getQuteRitualSpellTarget (line 49) | QuteSpellTarget getQuteRitualSpellTarget(Tags tags) {
method getQuteRitualCast (line 69) | QuteRitualCasting getQuteRitualCast() {
method getQuteRitualChecks (line 81) | QuteRitualChecks getQuteRitualChecks() {
class RitualSecondaryCaster (line 98) | @RegisterForReflection
method buildString (line 104) | public String buildString(JsonSource convert) {
class RitualCheck (line 113) | @RegisterForReflection
method buildPrimaryString (line 120) | public String buildPrimaryString(JsonSource convert) {
method buildSecondaryString (line 128) | public String buildSecondaryString(JsonSource convert) {
method skillsToString (line 139) | String skillsToString(JsonSource convert) {
FILE: src/main/java/dev/ebullient/convert/tools/pf2e/Json2QuteSpell.java
class Json2QuteSpell (line 31) | public class Json2QuteSpell extends Json2QuteBase {
method Json2QuteSpell (line 34) | public Json2QuteSpell(Pf2eIndex index, JsonNode rootNode) {
method Json2QuteSpell (line 38) | protected Json2QuteSpell(Pf2eIndex index, Pf2eIndexType type, JsonNode...
method buildQuteResource (line 42) | @Override
method getQuteSpellTarget (line 114) | QuteSpellTarget getQuteSpellTarget(Tags tags) {
method getHeightenedCast (line 133) | Collection<NamedText> getHeightenedCast() {
method getHeightenedValue (line 158) | String getHeightenedValue(JsonNode value) {
method getAmpEffects (line 164) | QuteSpellAmp getAmpEffects() {
type Pf2eSpell (line 204) | public enum Pf2eSpell implements Pf2eJsonNodeReader {
method getComponentsFrom (line 234) | List<Pf2eSpellComponent> getComponentsFrom(JsonNode source, JsonSour...
method getSpellSaveFrom (line 245) | private QuteSpellSave getSpellSaveFrom(JsonNode source, JsonSource c...
method getSpellDurationFrom (line 262) | private QuteSpellDuration getSpellDurationFrom(JsonNode source, Json...
class SpellArea (line 278) | @RegisterForReflection
type Pf2eSpellComponent (line 284) | enum Pf2eSpellComponent implements FieldValue {
method Pf2eSpellComponent (line 293) | Pf2eSpellComponent(String encoding, String addedTrait) {
method value (line 298) | @Override
method getAddedTrait (line 304) | public String getAddedTrait() {
method getRulesLink (line 309) | public String getRulesLink(JsonSource convert) {
method valueFrom (line 314) | static Pf2eSpellComponent valueFrom(String value) {
FILE: src/main/java/dev/ebullient/convert/tools/pf2e/Json2QuteTable.java
class Json2QuteTable (line 14) | public class Json2QuteTable extends Json2QuteBase {
method Json2QuteTable (line 16) | public Json2QuteTable(Pf2eIndex index, JsonNode rootNode) {
method buildQuteNote (line 20) | @Override
FILE: src/main/java/dev/ebullient/convert/tools/pf2e/Json2QuteTrait.java
class Json2QuteTrait (line 13) | public class Json2QuteTrait extends Json2QuteBase {
method Json2QuteTrait (line 15) | public Json2QuteTrait(Pf2eIndex index, JsonNode rootNode) {
method buildQuteResource (line 19) | @Override
method buildIndex (line 49) | static Pf2eQuteNote buildIndex(Pf2eIndex index) {
type TraitField (line 55) | enum TraitField implements Pf2eJsonNodeReader {
FILE: src/main/java/dev/ebullient/convert/tools/pf2e/JsonSource.java
type JsonSource (line 27) | public interface JsonSource extends JsonTextReplacement {
method collectTraitsFrom (line 36) | default Set<String> collectTraitsFrom(JsonNode sourceNode, Tags tags) {
method appendToText (line 55) | @Override
method appendObjectToText (line 79) | default void appendObjectToText(List<String> text, JsonNode node, Stri...
method appendTextHeaderBlock (line 146) | default void appendTextHeaderBlock(List<String> text, JsonNode node, S...
method appendTextHeaderFlavorBlock (line 172) | default void appendTextHeaderFlavorBlock(List<String> text, JsonNode n...
method appendList (line 181) | default void appendList(List<String> text, ArrayNode itemArray) {
method appendPaper (line 200) | default void appendPaper(List<String> text, JsonNode paper, String cal...
method appendQuote (line 217) | default void appendQuote(List<String> text, JsonNode entry) {
method appendCallout (line 240) | default void appendCallout(List<String> text, JsonNode entry, String c...
method appendLevelEffect (line 267) | default void appendLevelEffect(List<String> text, JsonNode node) {
method appendSuccessDegree (line 277) | default void appendSuccessDegree(List<String> text, JsonNode node) {
method appendAffliction (line 307) | default void appendAffliction(List<String> text, JsonNode node) {
method appendRenderable (line 312) | private void appendRenderable(List<String> text, QuteUtil.Renderable r...
method appendTable (line 317) | default void appendTable(List<String> text, JsonNode tableNode) {
method appendHtmlTable (line 365) | default String appendHtmlTable(JsonNode tableNode, List<String> table,...
method replaceHtmlText (line 464) | default String replaceHtmlText(JsonNode cell) {
method replaceMarkdownTableText (line 470) | default String replaceMarkdownTableText(JsonNode cell) {
method appendMarkdownTable (line 475) | default String appendMarkdownTable(JsonNode tableNode, List<String> ta...
method embedData (line 529) | default void embedData(List<String> text, JsonNode dataNode) {
method embedGenericData (line 602) | default List<String> embedGenericData(String tag, JsonNode data) {
type SuccessDegree (line 654) | enum SuccessDegree implements Pf2eJsonNodeReader {
method SuccessDegree (line 662) | SuccessDegree(String nodeName) {
method nodeName (line 666) | public String nodeName() {
type TableField (line 671) | enum TableField implements Pf2eJsonNodeReader {
type AppendTypeValue (line 680) | enum AppendTypeValue implements FieldValue {
method AppendTypeValue (line 716) | AppendTypeValue() {
method AppendTypeValue (line 720) | AppendTypeValue(String nodeValue) {
method value (line 724) | public String value() {
method getBlockType (line 729) | static AppendTypeValue getBlockType(JsonNode source) {
method isBlockTypeOf (line 734) | boolean isBlockTypeOf(JsonNode node) {
FILE: src/main/java/dev/ebullient/convert/tools/pf2e/JsonTextReplacement.java
type JsonTextReplacement (line 21) | public interface JsonTextReplacement extends JsonTextConverter<Pf2eIndex...
type Field (line 23) | enum Field implements Pf2eJsonNodeReader {
method index (line 57) | Pf2eIndex index();
method getSources (line 59) | Pf2eSources getSources();
method tui (line 61) | default Tui tui() {
method cfg (line 65) | default CompendiumConfig cfg() {
method replaceText (line 69) | default String replaceText(String input) {
method _replaceTokenText (line 73) | default String _replaceTokenText(String input, boolean nested) {
method replaceFootnoteReference (line 192) | default String replaceFootnoteReference(MatchResult match) {
method replaceActionAs (line 197) | default String replaceActionAs(MatchResult match) {
method linkifyRuneItem (line 225) | default String linkifyRuneItem(MatchResult match) {
method linkify (line 240) | default String linkify(MatchResult match) {
method linkify (line 249) | default String linkify(Pf2eIndexType targetType, String match) {
method linkifyTrait (line 324) | default String linkifyTrait(String match) {
method linkifyTrait (line 364) | default String linkifyTrait(JsonNode traitNode, String traitName, Stri...
method traitTitle (line 379) | private String traitTitle(JsonNode traitNode) {
method linkifyRules (line 395) | default String linkifyRules(Pf2eIndexType type, String text, String ru...
method linkifyClass (line 407) | default String linkifyClass(String match) {
method linkifyClassFeature (line 436) | default String linkifyClassFeature(String match) {
method linkifySubClassFeature (line 448) | default String linkifySubClassFeature(String match) {
type Pf2eAlignmentValue (line 459) | enum Pf2eAlignmentValue implements JsonNodeReader.FieldValue {
method Pf2eAlignmentValue (line 472) | Pf2eAlignmentValue(String s) {
method value (line 476) | @Override
method toString (line 481) | @Override
method valueFrom (line 486) | static Pf2eAlignmentValue valueFrom(String value) {
FILE: src/main/java/dev/ebullient/convert/tools/pf2e/Pf2eActivity.java
type Pf2eActivity (line 11) | public enum Pf2eActivity {
method Pf2eActivity (line 28) | Pf2eActivity(String longName, String textGlyph, String glyph) {
method toActivity (line 38) | public static Pf2eActivity toActivity(String unit, int number) {
method getLongName (line 63) | public String getLongName() {
method getTextGlyph (line 67) | public String getTextGlyph() {
method getGlyph (line 71) | public String getGlyph() {
method linkify (line 75) | public String linkify(String rulesRoot) {
method getRulesPath (line 80) | public String getRulesPath(String rulesRoot) {
method toQuteActivity (line 84) | public QuteDataActivity toQuteActivity(JsonSource convert, String text) {
FILE: src/main/java/dev/ebullient/convert/tools/pf2e/Pf2eIndex.java
class Pf2eIndex (line 27) | public class Pf2eIndex implements ToolsIndex, JsonSource {
method Pf2eIndex (line 44) | public Pf2eIndex(CompendiumConfig config) {
method notPrepared (line 48) | @Override
method importTree (line 53) | @Override
method addToIndex (line 91) | void addToIndex(Pf2eIndexType type, JsonNode node) {
method prepareTrait (line 135) | String prepareTrait(String key, JsonNode node) {
method addQuickLookup (line 153) | private void addQuickLookup(Map<String, String> lookup, JsonNode node,...
method replaceName (line 164) | private String replaceName(Pf2eIndexType type, String newName, String ...
method addDataToIndex (line 175) | void addDataToIndex(JsonNode data, String filename) {
method prepare (line 201) | @Override
method createTraitReference (line 230) | private void createTraitReference(String key, JsonNode node, Pf2eSourc...
method createArchetypeReference (line 241) | void createArchetypeReference(String key, JsonNode node, Pf2eSources s...
method createDomainReference (line 253) | void createDomainReference(String key, JsonNode node) {
method keyIsIncluded (line 259) | boolean keyIsIncluded(String key, JsonNode node) {
method isIncluded (line 282) | public boolean isIncluded(String key) {
method findNode (line 292) | public static JsonNode findNode(Pf2eSources sources) {
method aliasOrDefault (line 296) | public String aliasOrDefault(String key) {
method getIncludedNode (line 300) | public JsonNode getIncludedNode(String key) {
method featKeys (line 304) | public Set<String> featKeys(String archetypeKey) {
method domainSpells (line 309) | public Set<String> domainSpells(String domain) {
method conditionToSource (line 314) | public String conditionToSource(String trait) {
method traitToSource (line 318) | public String traitToSource(String trait) {
method getOrigin (line 322) | public JsonNode getOrigin(String key) {
method getAdventure (line 326) | @Override
method getBook (line 332) | @Override
method markdownConverter (line 340) | @Override
method writeFullIndex (line 345) | @Override
method writeFilteredIndex (line 357) | @Override
method filteredEntries (line 367) | public Set<Map.Entry<String, JsonNode>> filteredEntries() {
method categoryTraitMap (line 374) | public Map<String, Collection<String>> categoryTraitMap() {
method cfg (line 380) | @Override
method index (line 385) | @Override
method getSources (line 390) | @Override
FILE: src/main/java/dev/ebullient/convert/tools/pf2e/Pf2eIndexType.java
type Pf2eIndexType (line 18) | public enum Pf2eIndexType implements IndexType, JsonNodeReader {
method Pf2eIndexType (line 75) | Pf2eIndexType() {
method Pf2eIndexType (line 79) | Pf2eIndexType(String templateName) {
method templateName (line 90) | public String templateName() {
method isDefaultSource (line 94) | public boolean isDefaultSource(String source) {
method withArrayFrom (line 98) | public void withArrayFrom(JsonNode node, BiConsumer<Pf2eIndexType, Jso...
method fromText (line 102) | public static Pf2eIndexType fromText(String name) {
method getTypeFromKey (line 108) | public static Pf2eIndexType getTypeFromKey(String key) {
method createKey (line 113) | @Override
method createKey (line 125) | public String createKey(String name, String source) {
method getVaultRoot (line 132) | public String getVaultRoot(Pf2eIndex index) {
method getFilePath (line 136) | public Path getFilePath(Pf2eIndex index) {
method relativeRepositoryRoot (line 140) | public String relativeRepositoryRoot(Pf2eIndex index) {
method convertJson2QuteBase (line 150) | public Pf2eQuteBase convertJson2QuteBase(Pf2eIndex index, JsonNode nod...
method alwaysInclude (line 168) | public boolean alwaysInclude() {
method checkCopiesAndReprints (line 175) | public boolean checkCopiesAndReprints() {
method useQuteNote (line 182) | public boolean useQuteNote() {
method useCompendiumBase (line 199) | public boolean useCompendiumBase() {
method isOutputType (line 213) | public boolean isOutputType() {
method relativePath (line 240) | public String relativePath() {
method defaultSourceString (line 265) | public String defaultSourceString() {
method defaultSource (line 269) | public DefaultSource defaultSource() {
FILE: src/main/java/dev/ebullient/convert/tools/pf2e/Pf2eJsonNodeReader.java
type Pf2eJsonNodeReader (line 43) | public interface Pf2eJsonNodeReader extends JsonNodeReader {
method getAlignmentsFrom (line 49) | default List<String> getAlignmentsFrom(JsonNode alignNode, JsonSource ...
method getSpeedFrom (line 57) | default QuteDataSpeed getSpeedFrom(JsonNode source, JsonSource convert) {
method getFrequencyFrom (line 62) | default QuteDataFrequency getFrequencyFrom(JsonNode source, JsonSource...
method getDefensesFrom (line 67) | default QuteDataDefenses getDefensesFrom(JsonNode source, JsonSource c...
method getActivityFrom (line 72) | default QuteDataActivity getActivityFrom(JsonNode source, JsonSource c...
method getDurationFrom (line 77) | default QuteDataDuration getDurationFrom(JsonNode source, JsonSource c...
method getSavingThrowsFrom (line 82) | default QuteDataDefenses.QuteSavingThrows getSavingThrowsFrom(JsonNode...
method getNamedBonusFrom (line 90) | default QuteDataNamedBonus getNamedBonusFrom(JsonNode source, JsonSour...
method getRangeFrom (line 95) | default QuteDataRange getRangeFrom(JsonNode source, JsonSource convert) {
method getAttacksFrom (line 100) | default List<QuteInlineAttack> getAttacksFrom(JsonNode source, JsonSou...
method getActivationComponentsFrom (line 109) | default List<String> getActivationComponentsFrom(JsonNode source, Set<...
method getAbilityOrAfflictionsFrom (line 133) | default List<Qu
Condensed preview — 541 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (3,683K chars).
[
{
"path": ".editorconfig",
"chars": 380,
"preview": "# EditorConfig helps developers define and maintain consistent\n# coding styles between different editors and IDEs\n# edit"
},
{
"path": ".github/CODEOWNERS",
"chars": 19,
"preview": "* @ebullient\n"
},
{
"path": ".github/ISSUE_TEMPLATE/bug_report.yaml",
"chars": 2651,
"preview": "name: Bug Report\ndescription: File a bug report\ntitle: \"🐛 \"\nlabels: [\"type: bug\"]\nbody:\n - type: markdown\n attribute"
},
{
"path": ".github/ISSUE_TEMPLATE/feature_request.md",
"chars": 438,
"preview": "---\nname: Feature request\nabout: 'It would be nice if... '\ntitle: \"✨ \"\nlabels: enhancement\nassignees: ''\n\n---\n\n**Describ"
},
{
"path": ".github/actions/data-cache/action.yml",
"chars": 8523,
"preview": "name: 'Tools data cache'\ndescription: 'find latest release; construct cache key; fetch/build cache'\n\ninputs:\n failIfMis"
},
{
"path": ".github/actions/native-data-cache/action.yml",
"chars": 482,
"preview": "name: 'Fetch Tools data cache'\ndescription: 'Fetch cache using known key'\n\ninputs:\n cache_key:\n description: Key for"
},
{
"path": ".github/augment-release.sh",
"chars": 520,
"preview": "#!/usr/bin/env bash\n\nif [ -z \"$1\" ]; then\n echo \"Specify target version\"\n exit 1\nfi\nif [ -z \"$JRELEASER_GITHUB_TOKEN\" "
},
{
"path": ".github/dependabot.yml",
"chars": 513,
"preview": "# Please see the documentation for all configuration options:\n# https://help.github.com/github/administering-a-repositor"
},
{
"path": ".github/project.yml",
"chars": 233,
"preview": "name: TTRPG Convert CLI\nrelease:\n current-version: 3.3.1\n next-version: 3.3.1\n snapshot-version: 399-SNAPSHOT\nbuild:\n"
},
{
"path": ".github/workflows/cache.yml",
"chars": 1573,
"preview": "name: Refresh cache\non:\n schedule:\n - cron: '0 2 * * 1' # Mondays at 2 AM UTC\n workflow_dispatch:\n\njobs:\n clear_c"
},
{
"path": ".github/workflows/maven.yml",
"chars": 3622,
"preview": "name: Main Maven build\n\non:\n workflow_dispatch:\n push:\n branches:\n - main\n paths:\n - .github/workflows"
},
{
"path": ".github/workflows/pull-request.yml",
"chars": 1985,
"preview": "name: PR Maven Build\non:\n pull_request:\n paths:\n - \"**.xml\"\n - \"*.yml\"\n - \"src/**\"\n - \"ide-confi"
},
{
"path": ".github/workflows/release.yml",
"chars": 4669,
"preview": "name: Create a release\n\non:\n workflow_dispatch:\n inputs:\n semver:\n description: \"New version or major, m"
},
{
"path": ".github/workflows/scorecard.yml",
"chars": 3000,
"preview": "# This workflow uses actions that are not certified by GitHub. They are provided\n# by a third-party and are governed by "
},
{
"path": ".github/workflows/test-data.yml",
"chars": 2459,
"preview": "name: Test with data (scheduled)\non:\n schedule:\n - cron: \"7 9 * * */5\"\n\n workflow_dispatch:\n\nenv:\n JAVA_VERSION: 1"
},
{
"path": ".github/workflows/website.yml",
"chars": 452,
"preview": "name: Update docs\n\non:\n workflow_dispatch:\n push:\n branches:\n - main\n paths:\n - \"**.md\"\n\npermissions: "
},
{
"path": ".gitignore",
"chars": 747,
"preview": "sources\nexcludes.json\npublish\ncompendium\nartifacts\ndefault\n\n#Maven\ntarget/\npom.xml.tag\npom.xml.releaseBackup\npom.xml.ver"
},
{
"path": ".markdownlint.yaml",
"chars": 76,
"preview": "MD007:\n indent: 4\nMD013: false\nMD033:\n allowed_elements:\n - blockquote\n"
},
{
"path": ".mvn/wrapper/.gitignore",
"chars": 18,
"preview": "maven-wrapper.jar\n"
},
{
"path": ".mvn/wrapper/maven-wrapper.properties",
"chars": 168,
"preview": "wrapperVersion=3.3.4\ndistributionType=only-script\ndistributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/"
},
{
"path": "AGENTS.md",
"chars": 2769,
"preview": "This file provides guidance to AI Agents working with code in this repository.\n\n**For complete build commands, architect"
},
{
"path": "CHANGELOG.md",
"chars": 20996,
"preview": "# Changelog\n\n[examples/config]: examples/config\n[ex-snippets]: examples/css-snippets\n[ex-templates]: examples/templates\n"
},
{
"path": "CLAUDE.md",
"chars": 11,
"preview": "@AGENTS.md\n"
},
{
"path": "CONTRIBUTING.md",
"chars": 10014,
"preview": "# Contributing\n\nI am always thrilled to receive pull requests, and I do my best to process them as fast as possible. Not"
},
{
"path": "LICENSE",
"chars": 11357,
"preview": " Apache License\n Version 2.0, January 2004\n "
},
{
"path": "README-WINDOWS.md",
"chars": 8869,
"preview": "# Running on Windows\n\n> [!TIP]\n> See also Obsidian TTRPG Tutorials: [TTRPG-Convert-CLI 5e][] or [TTRPG-Convert-CLI PF2e]"
},
{
"path": "README.md",
"chars": 18640,
"preview": "# TTRPG convert CLI\n\n 2004, 2006 The Linux Foundation and its contributors.\n1 Lette"
},
{
"path": "docs/README.md",
"chars": 3814,
"preview": "# Documentation\n\n- [Other ways to run the CLI](./alternateRun.md)\n- [Create a config file](./configuration.md)\n - [Co"
},
{
"path": "docs/alternateRun.md",
"chars": 8767,
"preview": "# Other ways to run the CLI\n\n- [Use JBang](#use-jbang)\n- [Use Homebrew](#use-homebrew)\n - [Use pre-built platform bin"
},
{
"path": "docs/configuration.md",
"chars": 27749,
"preview": "# CLI Configuration guide\n\n> [!IMPORTANT]\n> 🚀 Respect copyrights and support content creators; use only the sources you "
},
{
"path": "docs/sourceMap.md",
"chars": 17583,
"preview": "# Source mapping\n\n- [5etools](#source-name-mapping-for-5etools)\n- [Pf2eTools](#source-name-mapping-for-pf2etools)\n\nHere "
},
{
"path": "docs/templates/ImageRef.md",
"chars": 1479,
"preview": "# ImageRef\n\nCreate links to referenced images.\n\nThe general form of a markdown image link is: `\n\n### altNames\n\nAlternate names. (optional)\n"
},
{
"path": "docs/templates/QuteBase.md",
"chars": 1692,
"preview": "# QuteBase\n\nDefines attributes inherited by other Qute templates.\n\nNotes created from `QuteBase` (or a derivative) will "
},
{
"path": "docs/templates/QuteNote.md",
"chars": 1699,
"preview": "# QuteNote\n\nCommon attributes for simple notes. THese attributes are more\noften used by books, adventures, rules, etc.\n\n"
},
{
"path": "docs/templates/README.md",
"chars": 1171,
"preview": "# Qute Template Reference\n\nThe following pages describe attributes that you can use to customize\ngenerated output in Qut"
},
{
"path": "docs/templates/Reprinted.md",
"chars": 215,
"preview": "# Reprinted\n\nA simple record to hold the name and source of a reprinted item.\n\n## Attributes\n\n[name](#name), [source](#s"
},
{
"path": "docs/templates/SourceAndPage.md",
"chars": 338,
"preview": "# SourceAndPage\n\nA representation of a source and page number. This attribute will print\nitself nicely if you don't refe"
},
{
"path": "docs/templates/TtrpgTemplateExtension.md",
"chars": 2461,
"preview": "# TtrpgTemplateExtension\n\nQute template extensions for TTRPG data.\n\nUse these functions to help render TTRPG data in Qut"
},
{
"path": "docs/templates/dnd5e/AbilityScores/AbilityScore.md",
"chars": 259,
"preview": "# AbilityScore\n\nAbility score. Usually an integer, but can be a special value (string) instead.\n\n## Attributes\n\n[score]("
},
{
"path": "docs/templates/dnd5e/AbilityScores/README.md",
"chars": 2096,
"preview": "# AbilityScores\n\n5eTools Ability Score attributes.\n\nUsed to describe a monster, object or vehicle's ability scores.\n\nIf "
},
{
"path": "docs/templates/dnd5e/AbilityScores.md",
"chars": 1511,
"preview": "# AbilityScores\n\n5eTools Ability Score attributes.\n\nUsed to describe a monster, object or vehicle's ability scores.\n\nIf "
},
{
"path": "docs/templates/dnd5e/AcHp.md",
"chars": 803,
"preview": "# AcHp\n\n5eTools armor class and hit points attributes\n\nThis data object provides a default mechanism for creating\na mark"
},
{
"path": "docs/templates/dnd5e/ImmuneResist.md",
"chars": 804,
"preview": "# ImmuneResist\n\n5eTools vulnerabilities, resistances, immunities, and condition immunities\n\nThis data object provides a "
},
{
"path": "docs/templates/dnd5e/QuteBackground.md",
"chars": 2569,
"preview": "# QuteBackground\n\n5eTools background attributes (`background2md.txt`).\n\nExtension of [Tools5eQuteBase](Tools5eQuteBase.m"
},
{
"path": "docs/templates/dnd5e/QuteBastion/Hireling.md",
"chars": 496,
"preview": "# Hireling\n\nHireling information. Either exact or min must be present.\n\n## Attributes\n\n[description](#description), [exa"
},
{
"path": "docs/templates/dnd5e/QuteBastion/README.md",
"chars": 3110,
"preview": "# QuteBastion\n\n5eTools background attributes (`bastion2md.txt`).\n\nExtension of [Tools5eQuteBase](../Tools5eQuteBase.md)."
},
{
"path": "docs/templates/dnd5e/QuteBastion/Space.md",
"chars": 523,
"preview": "# Space\n\n\n## Attributes\n\n[cost](#cost), [description](#description), [name](#name), [prevSpace](#prevspace), [squares](#"
},
{
"path": "docs/templates/dnd5e/QuteClass/HitPointDie.md",
"chars": 692,
"preview": "# HitPointDie\n\nDescribes the hit point die used by the class.\n\nIf referenced as a unit (ignoring inner attributes), it w"
},
{
"path": "docs/templates/dnd5e/QuteClass/Multiclassing.md",
"chars": 1160,
"preview": "# Multiclassing\n\nDescribes the multiclassing information for the class.\n\nIf referenced as a unit (ignoring inner attribu"
},
{
"path": "docs/templates/dnd5e/QuteClass/README.md",
"chars": 3193,
"preview": "# QuteClass\n\n5eTools class attributes (`class2md.txt`)\n\nExtension of [Tools5eQuteBase](../Tools5eQuteBase.md).\n\n## Attri"
},
{
"path": "docs/templates/dnd5e/QuteClass/StartingEquipment.md",
"chars": 1202,
"preview": "# StartingEquipment\n\nDescribes the starting equipment for the class.\n\nIf referenced as a unit (ignoring inner attributes"
},
{
"path": "docs/templates/dnd5e/QuteClass.md",
"chars": 1504,
"preview": "# QuteClass\n\n5eTools class attributes (`class2md.txt`)\n\nExtension of [Tools5eQuteBase](Tools5eQuteBase.md).\n\n## Attribut"
},
{
"path": "docs/templates/dnd5e/QuteDeck/Card.md",
"chars": 436,
"preview": "# Card\n\n\n## Attributes\n\n[face](#face), [name](#name), [sourceAndPage](#sourceandpage), [suitValue](#suitvalue), [text](#"
},
{
"path": "docs/templates/dnd5e/QuteDeck/README.md",
"chars": 2525,
"preview": "# QuteDeck\n\n5eTools deck attributes (`deck2md.txt`)\n\nExtension of [Tools5eQuteBase](../Tools5eQuteBase.md).\n\n## Attribut"
},
{
"path": "docs/templates/dnd5e/QuteDeity.md",
"chars": 3044,
"preview": "# QuteDeity\n\n5eTools deity attributes (`deity2md.txt`)\n\nExtension of [Tools5eQuteBase](Tools5eQuteBase.md).\n\n## Attribut"
},
{
"path": "docs/templates/dnd5e/QuteFeat.md",
"chars": 2679,
"preview": "# QuteFeat\n\n5eTools feat and optional feat attributes (`feat2md.txt`)\n\nExtension of [Tools5eQuteBase](Tools5eQuteBase.md"
},
{
"path": "docs/templates/dnd5e/QuteHazard.md",
"chars": 2446,
"preview": "# QuteHazard\n\n5eTools hazard attributes (`hazard2md.txt`)\n\nExtension of [Tools5eQuteBase](Tools5eQuteBase.md).\n\n## Attri"
},
{
"path": "docs/templates/dnd5e/QuteItem/README.md",
"chars": 4476,
"preview": "# QuteItem\n\n5eTools item attributes (`item2md.txt`)\n\nExtension of [Tools5eQuteBase](../Tools5eQuteBase.md).\n\n## Attribut"
},
{
"path": "docs/templates/dnd5e/QuteItem/Variant.md",
"chars": 4847,
"preview": "# Variant\n\n\n## Attributes\n\n[age](#age), [ammo](#ammo), [armorClass](#armorclass), [attunement](#attunement), [baseItem]("
},
{
"path": "docs/templates/dnd5e/QuteMonster/Initiative.md",
"chars": 384,
"preview": "# Initiative\n\n5eTools creature initiative attributes.\n\n## Attributes\n\n[bonus](#bonus), [mode](#mode), [passive](#passive"
},
{
"path": "docs/templates/dnd5e/QuteMonster/InitiativeMode.md",
"chars": 89,
"preview": "# InitiativeMode\n\nInitiative mode: \"advantage\", \"disadvantage\", or \"none\"\n\n## Attributes\n"
},
{
"path": "docs/templates/dnd5e/QuteMonster/README.md",
"chars": 7681,
"preview": "# QuteMonster\n\n5eTools creature attributes (`monster2md.txt`)\n\nExtension of [Tools5eQuteBase](../Tools5eQuteBase.md).\n\n#"
},
{
"path": "docs/templates/dnd5e/QuteMonster/SavesAndSkills.md",
"chars": 924,
"preview": "# SavesAndSkills\n\n5eTools creature saving throws and skill attributes.\n\n## Attributes\n\n[saveOrDefault](#saveordefault), "
},
{
"path": "docs/templates/dnd5e/QuteMonster/SavingThrow.md",
"chars": 378,
"preview": "# SavingThrow\n\nSaving throw modifier.\n\nUsually an integer, but may be a \"special\" value (string, homebrew).\n\n## Attribut"
},
{
"path": "docs/templates/dnd5e/QuteMonster/SkillModifier.md",
"chars": 454,
"preview": "# SkillModifier\n\nSkill modifier.\n\nUsually an integer, but may be a \"special\" value (string, homebrew).\n\n## Attributes\n\n["
},
{
"path": "docs/templates/dnd5e/QuteMonster/Spellcasting.md",
"chars": 1905,
"preview": "# Spellcasting\n\n5eTools creature spellcasting attributes.\n\nThis data object provides a default mechanism for creating\na "
},
{
"path": "docs/templates/dnd5e/QuteMonster/Spells.md",
"chars": 318,
"preview": "# Spells\n\n5eTools creature spell attributes (associated with a spell level)\n\n## Attributes\n\n[lowerBound](#lowerbound), ["
},
{
"path": "docs/templates/dnd5e/QuteMonster/TraitDescription.md",
"chars": 348,
"preview": "# TraitDescription\n\n5eTools creature trait description.\n\n## Attributes\n\n[description](#description), [present](#present)"
},
{
"path": "docs/templates/dnd5e/QuteMonster/Traits.md",
"chars": 1069,
"preview": "# Traits\n\n5eTools creature traits.\n\n## Attributes\n\n[actions](#actions), [bonusActions](#bonusactions), [lairActions](#la"
},
{
"path": "docs/templates/dnd5e/QuteObject.md",
"chars": 4353,
"preview": "# QuteObject\n\n5eTools object attributes (`object2md.txt`)\n\nExtension of [Tools5eQuteBase](Tools5eQuteBase.md).\n\n## Attri"
},
{
"path": "docs/templates/dnd5e/QutePsionic.md",
"chars": 2567,
"preview": "# QutePsionic\n\n5eTools psionic talent attributes (`psionic2md.txt`)\n\nExtension of [Tools5eQuteBase](Tools5eQuteBase.md)."
},
{
"path": "docs/templates/dnd5e/QuteRace.md",
"chars": 3078,
"preview": "# QuteRace\n\n5eTools race attributes (`race2md.txt`)\n\nExtension of [Tools5eQuteBase](Tools5eQuteBase.md).\n\n## Attributes\n"
},
{
"path": "docs/templates/dnd5e/QuteReward.md",
"chars": 2766,
"preview": "# QuteReward\n\n5eTools reward attributes (`reward2md.txt`)\n\nExtension of [Tools5eQuteBase](Tools5eQuteBase.md).\n\n## Attri"
},
{
"path": "docs/templates/dnd5e/QuteSpell.md",
"chars": 4808,
"preview": "# QuteSpell\n\n5eTools spell attributes (`spell2md.txt`)\n\nExtension of [Tools5eQuteBase](Tools5eQuteBase.md).\n\n## Attribut"
},
{
"path": "docs/templates/dnd5e/QuteSubclass.md",
"chars": 2878,
"preview": "# QuteSubclass\n\n5eTools subclass attributes (`subclass2md.txt`)\n\nExtension of [Tools5eQuteBase](Tools5eQuteBase.md).\n\n##"
},
{
"path": "docs/templates/dnd5e/QuteVehicle/README.md",
"chars": 4009,
"preview": "# QuteVehicle\n\n5eTools vehicle attributes (`vehicle2md.txt`)\n\nSeveral different types of vehicle use this template, incl"
},
{
"path": "docs/templates/dnd5e/QuteVehicle/ShipAcHp.md",
"chars": 989,
"preview": "# ShipAcHp\n\n5eTools vehicle armor class and hit points attributes\n\nThis data object provides a default mechanism for cre"
},
{
"path": "docs/templates/dnd5e/QuteVehicle/ShipCrewCargoPace.md",
"chars": 887,
"preview": "# ShipCrewCargoPace\n\n5eTools Ship crew, cargo, and pace attributes\n\nThis data object provides a default mechanism for cr"
},
{
"path": "docs/templates/dnd5e/QuteVehicle/ShipSection.md",
"chars": 505,
"preview": "# ShipSection\n\n5eTools vehicle sections\n\nThis data object provides a default mechanism for creating\na marked up string b"
},
{
"path": "docs/templates/dnd5e/README.md",
"chars": 2977,
"preview": "# 5eTools templates\n\nQute templates for generating content from 5eTools data.\n\n## References\n\n- [AbilityScores](AbilityS"
},
{
"path": "docs/templates/dnd5e/Tools5eQuteBase.md",
"chars": 2521,
"preview": "# Tools5eQuteBase\n\nAttributes for notes that are generated from the 5eTools data.\nThis is a trivial extension of [QuteBa"
},
{
"path": "docs/templates/dnd5e/Tools5eQuteNote.md",
"chars": 1696,
"preview": "# Tools5eQuteNote\n\nAttributes for notes that are generated from the 5eTools data.\nThis is a trivial extension of [QuteNo"
},
{
"path": "docs/templates/pf2e/Pf2eQuteBase.md",
"chars": 1758,
"preview": "# Pf2eQuteBase\n\nAttributes for notes that are generated from the Pf2eTools data.\nThis is a trivial extension of [QuteBas"
},
{
"path": "docs/templates/pf2e/Pf2eQuteNote.md",
"chars": 1754,
"preview": "# Pf2eQuteNote\n\nAttributes for notes that are generated from the Pf2eTools data.\nThis is a trivial extension of [QuteNot"
},
{
"path": "docs/templates/pf2e/QuteAbility.md",
"chars": 4421,
"preview": "# QuteAbility\n\nPf2eTools Ability attributes (`ability2md.txt` or `inline-ability2md.txt`).\n\nAbilities are rendered both "
},
{
"path": "docs/templates/pf2e/QuteAbilityOrAffliction.md",
"chars": 479,
"preview": "# QuteAbilityOrAffliction\n\nA union type which is either a [QuteAbility](QuteAbility.md)\nor a [QuteAffliction](QuteAfflic"
},
{
"path": "docs/templates/pf2e/QuteAction/ActionType.md",
"chars": 1085,
"preview": "# ActionType\n\nPf2eTools Action type attributes.\n\nThis data object provides a default mechanism for creating\na marked up "
},
{
"path": "docs/templates/pf2e/QuteAction/README.md",
"chars": 2616,
"preview": "# QuteAction\n\nPf2eTools Action attributes (`action2md.txt`)\n\nExtension of [Pf2eQuteBase](../Pf2eQuteBase.md)\n\n## Attribu"
},
{
"path": "docs/templates/pf2e/QuteAffliction/QuteAfflictionSave.md",
"chars": 269,
"preview": "# QuteAfflictionSave\n\nAffliction saving throw\n\n## Attributes\n\n[notes](#notes), [save](#save), [value](#value)\n\n### notes"
},
{
"path": "docs/templates/pf2e/QuteAffliction/QuteAfflictionStage.md",
"chars": 210,
"preview": "# QuteAfflictionStage\n\nPf2eTools affliction stage attributes.\n\n## Attributes\n\n[duration](#duration), [text](#text)\n\n### "
},
{
"path": "docs/templates/pf2e/QuteAffliction/README.md",
"chars": 2778,
"preview": "# QuteAffliction\n\nPf2eTools Affliction attributes (inline/embedded, `inline-affliction2md.txt`)\n\nExtension of [Pf2eQuteN"
},
{
"path": "docs/templates/pf2e/QuteArchetype.md",
"chars": 1792,
"preview": "# QuteArchetype\n\nPf2eTools Archetype attributes (`archetype2md.txt`)\n\nExtension of [Pf2eQuteBase](Pf2eQuteBase.md)\n\n## A"
},
{
"path": "docs/templates/pf2e/QuteBackground.md",
"chars": 1598,
"preview": "# QuteBackground\n\nPf2eTools Background attributes (`background2md.txt`)\n\nExtension of [Pf2eQuteBase](Pf2eQuteBase.md)\n\n#"
},
{
"path": "docs/templates/pf2e/QuteBook/BookInfo.md",
"chars": 575,
"preview": "# BookInfo\n\nPf2eTools book information\n\nThis data object provides a default mechanism for creating\na marked up string ba"
},
{
"path": "docs/templates/pf2e/QuteBook/README.md",
"chars": 1753,
"preview": "# QuteBook\n\nPf2eTools Book attributes (`book2md.txt`)\n\nExtension of [Pf2eQuteNote](../Pf2eQuteNote.md)\n\n## Attributes\n\n["
},
{
"path": "docs/templates/pf2e/QuteCreature/CreatureAbilities.md",
"chars": 754,
"preview": "# CreatureAbilities\n\nA creature's abilities, split into the section of the statblock where they should be displayed. Eac"
},
{
"path": "docs/templates/pf2e/QuteCreature/CreatureLanguages.md",
"chars": 399,
"preview": "# CreatureLanguages\n\nThe languages and language features known by a creature. Example default output:\n`Common, Sylvan; t"
},
{
"path": "docs/templates/pf2e/QuteCreature/CreatureRitualCasting.md",
"chars": 336,
"preview": "# CreatureRitualCasting\n\nInformation about a type of ritual casting available to this creature.\n\n## Attributes\n\n[dc](#dc"
},
{
"path": "docs/templates/pf2e/QuteCreature/CreatureSense.md",
"chars": 340,
"preview": "# CreatureSense\n\nA creature's senses. Example default output: `tremorsense (imprecise) 20ft`\n\n## Attributes\n\n[name](#nam"
},
{
"path": "docs/templates/pf2e/QuteCreature/CreatureSkills.md",
"chars": 430,
"preview": "# CreatureSkills\n\nA creature's skill information. Example default output:\n\n```md\nAthletics +10, Cult Lore +10 (lore on t"
},
{
"path": "docs/templates/pf2e/QuteCreature/CreatureSpellReference.md",
"chars": 588,
"preview": "# CreatureSpellReference\n\nA spell known by the creature.\n\n```md\n[shadow siphon](#) (acid only) (×2)\n```\n\n## Attributes\n\n"
},
{
"path": "docs/templates/pf2e/QuteCreature/CreatureSpellcasting.md",
"chars": 1616,
"preview": "# CreatureSpellcasting\n\nInformation about a type of spellcasting available to this creature.\n\n## Attributes\n\n[attackBonu"
},
{
"path": "docs/templates/pf2e/QuteCreature/CreatureSpells.md",
"chars": 793,
"preview": "# CreatureSpells\n\nA collection of spells with some additional information.\n\n```md\n**Cantrips (9th)** [daze](#), [shadow "
},
{
"path": "docs/templates/pf2e/QuteCreature/README.md",
"chars": 3150,
"preview": "# QuteCreature\n\nPf2eTools Creature attributes (`creature2md.txt`)\n\nExtension of [Pf2eQuteBase](../Pf2eQuteBase.md)\n\n## A"
},
{
"path": "docs/templates/pf2e/QuteCreature/SpellcastingPreparation.md",
"chars": 42,
"preview": "# SpellcastingPreparation\n\n\n## Attributes\n"
},
{
"path": "docs/templates/pf2e/QuteCreature/SpellcastingTradition.md",
"chars": 40,
"preview": "# SpellcastingTradition\n\n\n## Attributes\n"
},
{
"path": "docs/templates/pf2e/QuteDataActivity.md",
"chars": 573,
"preview": "# QuteDataActivity\n\nPf2eTools activity attributes. This attribute will render itself as a formatted link:\n\n<pre>\n[textGl"
},
{
"path": "docs/templates/pf2e/QuteDataArmorClass.md",
"chars": 465,
"preview": "# QuteDataArmorClass\n\nPf2eTools armor class attributes.\n\nDefault representation example:\n\n```md\n**AC** 15 (10 with mage "
},
{
"path": "docs/templates/pf2e/QuteDataDefenses/QuteSavingThrows.md",
"chars": 671,
"preview": "# QuteSavingThrows\n\nPathfinder 2e saving throws. Example default rendering:\n\n```md\n**Fort** +10 (+12 vs. poison), **Ref*"
},
{
"path": "docs/templates/pf2e/QuteDataDefenses/README.md",
"chars": 1354,
"preview": "# QuteDataDefenses\n\nPf2eTools Armor class, Saving Throws, and other attributes describing defenses of a creature or haza"
},
{
"path": "docs/templates/pf2e/QuteDataDuration.md",
"chars": 520,
"preview": "# QuteDataDuration\n\nA duration of time. This may be either a [QuteDataTimedDuration](QuteDataTimedDuration/README.md), w"
},
{
"path": "docs/templates/pf2e/QuteDataFrequency.md",
"chars": 1079,
"preview": "# QuteDataFrequency\n\nA description of a frequency e.g. \"once\", which may include an interval that this is repeated for.\n"
},
{
"path": "docs/templates/pf2e/QuteDataGenericStat/QuteDataNamedBonus.md",
"chars": 626,
"preview": "# QuteDataNamedBonus\n\nA Pathfinder 2e named bonus, potentially with other conditional bonuses.\n\nExample default represen"
},
{
"path": "docs/templates/pf2e/QuteDataGenericStat/README.md",
"chars": 113,
"preview": "# QuteDataGenericStat\n\nA generic container for a PF2e stat value which may have an attached note.\n\n## Attributes\n"
},
{
"path": "docs/templates/pf2e/QuteDataGenericStat/SimpleStat.md",
"chars": 179,
"preview": "# SimpleStat\n\nA basic [QuteDataGenericStat](README.md) which provides\nonly a value and possibly a note.\n\nDefault represe"
},
{
"path": "docs/templates/pf2e/QuteDataHpHardnessBt/HpStat.md",
"chars": 351,
"preview": "# HpStat\n\nHP value and associated notes. Referencing this directly provides a default representation, e.g.\n`15 to destro"
},
{
"path": "docs/templates/pf2e/QuteDataHpHardnessBt/README.md",
"chars": 835,
"preview": "# QuteDataHpHardnessBt\n\nHit Points, Hardness, and a broken threshold for hazards and shields. Used for creatures, hazard"
},
{
"path": "docs/templates/pf2e/QuteDataRange/README.md",
"chars": 408,
"preview": "# QuteDataRange\n\nA range with a given value and unit of measurement for that value.\n\n## Attributes\n\n[notes](#notes), [un"
},
{
"path": "docs/templates/pf2e/QuteDataRange/RangeUnit.md",
"chars": 28,
"preview": "# RangeUnit\n\n\n## Attributes\n"
},
{
"path": "docs/templates/pf2e/QuteDataSpeed.md",
"chars": 404,
"preview": "# QuteDataSpeed\n\nExamples:\n\n- `10 feet, swim 20 feet (some note); some ability`\n- `10 feet, swim 20 feet, some ability`\n"
},
{
"path": "docs/templates/pf2e/QuteDataTimedDuration/DurationUnit.md",
"chars": 87,
"preview": "# DurationUnit\n\nRepresents different units that a duration might be in.\n\n## Attributes\n"
},
{
"path": "docs/templates/pf2e/QuteDataTimedDuration/README.md",
"chars": 762,
"preview": "# QuteDataTimedDuration\n\nA duration of time, represented by a numerical value and a unit. Sometimes this includes a cust"
},
{
"path": "docs/templates/pf2e/QuteDeity/QuteDeityCleric.md",
"chars": 574,
"preview": "# QuteDeityCleric\n\nPf2eTools cleric divine attributes\n\nThis data object provides a default mechanism for creating\na mark"
},
{
"path": "docs/templates/pf2e/QuteDeity/QuteDivineAvatar.md",
"chars": 538,
"preview": "# QuteDivineAvatar\n\nPf2eTools avatar attributes\n\nThis data object provides a default mechanism for creating\na marked up "
},
{
"path": "docs/templates/pf2e/QuteDeity/QuteDivineIntercession.md",
"chars": 599,
"preview": "# QuteDivineIntercession\n\nPf2eTools divine intercession attributes.\n\nThis data object provides a default mechanism for c"
},
{
"path": "docs/templates/pf2e/QuteDeity/README.md",
"chars": 2340,
"preview": "# QuteDeity\n\nPf2eTools Deity attributes (`deity2md.txt`)\n\nDeities are rendered both standalone and inline (as an admonit"
},
{
"path": "docs/templates/pf2e/QuteFeat.md",
"chars": 2837,
"preview": "# QuteFeat\n\nPf2eTools Feat attributes (`feat2md.txt`)\n\nFeats are rendered both standalone and inline (as an admonition b"
},
{
"path": "docs/templates/pf2e/QuteHazard/QuteHazardStealth.md",
"chars": 598,
"preview": "# QuteHazardStealth\n\nPf2eTools hazard attributes.\n\nThis data object provides a default mechanism for creating\na marked u"
},
{
"path": "docs/templates/pf2e/QuteHazard/README.md",
"chars": 3167,
"preview": "# QuteHazard\n\nPf2eTools Hazard attributes (`hazard2md.txt`)\n\nHazards are rendered both standalone and inline (as an admo"
},
{
"path": "docs/templates/pf2e/QuteInlineAttack/AttackRangeType.md",
"chars": 34,
"preview": "# AttackRangeType\n\n\n## Attributes\n"
},
{
"path": "docs/templates/pf2e/QuteInlineAttack/README.md",
"chars": 1429,
"preview": "# QuteInlineAttack\n\nPf2eTools Attack attributes (inline/embedded, `inline-attack2md.txt`)\n\nWhen used directly, renders a"
},
{
"path": "docs/templates/pf2e/QuteItem/QuteItemActivate.md",
"chars": 811,
"preview": "# QuteItemActivate\n\nPf2eTools item activation attributes.\n\nThis data object provides a default mechanism for creating\na "
},
{
"path": "docs/templates/pf2e/QuteItem/QuteItemArmorData.md",
"chars": 609,
"preview": "# QuteItemArmorData\n\nPf2eTools item armor attributes\n\nThis data object provides a default mechanism for creating\na marke"
},
{
"path": "docs/templates/pf2e/QuteItem/QuteItemShieldData.md",
"chars": 616,
"preview": "# QuteItemShieldData\n\nPf2eTools item shield attributes. When referenced directly, provides a default formatting, e.g.\n\n`"
},
{
"path": "docs/templates/pf2e/QuteItem/QuteItemVariant.md",
"chars": 547,
"preview": "# QuteItemVariant\n\nPf2eTools item variant attributes\n\nThis data object provides a default mechanism for creating\na marke"
},
{
"path": "docs/templates/pf2e/QuteItem/QuteItemWeaponData.md",
"chars": 590,
"preview": "# QuteItemWeaponData\n\nPf2eTools item weapon attributes\n\nThis data object provides a default mechanism for creating\na mar"
},
{
"path": "docs/templates/pf2e/QuteItem/README.md",
"chars": 3153,
"preview": "# QuteItem\n\nPf2eTools Item attributes\n\nExtension of [Pf2eQuteBase](../Pf2eQuteBase.md)\n\n## Attributes\n\n[access](#access)"
},
{
"path": "docs/templates/pf2e/QuteRitual/QuteRitualCasting.md",
"chars": 659,
"preview": "# QuteRitualCasting\n\nPf2eTools ritual casting attributes\n\nThis data object provides a default mechanism for creating\na m"
},
{
"path": "docs/templates/pf2e/QuteRitual/QuteRitualChecks.md",
"chars": 465,
"preview": "# QuteRitualChecks\n\nPf2eTools ritual check attributes\n\nThis data object provides a default mechanism for creating\na mark"
},
{
"path": "docs/templates/pf2e/QuteRitual/README.md",
"chars": 2412,
"preview": "# QuteRitual\n\nPf2eTools Ritual attributes (`ritual2md.txt`)\n\nExtension of [Pf2eQuteBase](../Pf2eQuteBase.md)\n\n## Attribu"
},
{
"path": "docs/templates/pf2e/QuteSpell/QuteSpellAmp.md",
"chars": 338,
"preview": "# QuteSpellAmp\n\nPf2eTools spell Amp attributes\n\nThis attribute will render itself as labeled elements\nif you reference i"
},
{
"path": "docs/templates/pf2e/QuteSpell/QuteSpellDuration.md",
"chars": 507,
"preview": "# QuteSpellDuration\n\nDetails about the duration of the spell.\n\nExample default representations:\n\n- `1 minute`\n- `sustain"
},
{
"path": "docs/templates/pf2e/QuteSpell/QuteSpellSave.md",
"chars": 508,
"preview": "# QuteSpellSave\n\nDetails about the saving throw for a spell.\n\nExample default representations:\n\n- `basic Reflex or Forti"
},
{
"path": "docs/templates/pf2e/QuteSpell/QuteSpellTarget.md",
"chars": 438,
"preview": "# QuteSpellTarget\n\nPf2eTools spell target attributes.\n\nThis attribute will render itself as labeled elements\nif you refe"
},
{
"path": "docs/templates/pf2e/QuteSpell/README.md",
"chars": 3688,
"preview": "# QuteSpell\n\nPf2eTools Spell attributes (`spell2md.txt`)\n\nExtension of [Pf2eQuteBase](../Pf2eQuteBase.md)\n\n## Attributes"
},
{
"path": "docs/templates/pf2e/QuteTrait.md",
"chars": 1712,
"preview": "# QuteTrait\n\nPf2eTools Trait attributes (`trait2md.txt`)\n\nExtension of [Pf2eQuteBase](Pf2eQuteBase.md)\n\n## Attributes\n\n["
},
{
"path": "docs/templates/pf2e/QuteTraitIndex.md",
"chars": 1924,
"preview": "# QuteTraitIndex\n\nPf2eTools Trait index attributes (`indexTrait.md`)\n\nThis replaces the index usually generated for fold"
},
{
"path": "docs/templates/pf2e/README.md",
"chars": 3614,
"preview": "# Pf2eTools templates\n\nQute templates for generating content from Pf2eTools data.\n\nPathfinder data uses a lot of inline "
},
{
"path": "examples/README.md",
"chars": 102,
"preview": "# Examples\n\n- [Admonition types](admonitions)\n- [CSS Snippets](css-snippets)\n- [Templates](templates)\n"
},
{
"path": "examples/admonitions/README.md",
"chars": 742,
"preview": "# Admonitions\n\nInstall and enable the `Admonition` plugin from the Community Plugins pane in Obsidian.\n\nImport one or mo"
},
{
"path": "examples/admonitions/admonitions-5e.json",
"chars": 811,
"preview": "[\n {\n \"type\": \"statblock\",\n \"icon\": {\n \"name\": \"dragon\",\n \"type\": \"font-awesome\"\n },\n \"command\": "
},
{
"path": "examples/admonitions/admonitions-pf2e-v3.json",
"chars": 2777,
"preview": "[\n {\n \"type\": \"embed-feat\",\n \"color\": \"239, 187, 189\",\n \"icon\": {\n \"name\": \"fort-awesome-alt\",\n \"typ"
},
{
"path": "examples/admonitions/other-admonitions.json",
"chars": 1323,
"preview": "[\n {\n \"type\": \"charm\",\n \"icon\": {\n \"name\": \"magic\",\n \"type\": \"font-awesome\"\n },\n \"title\": \"Charm\""
},
{
"path": "examples/config/README.md",
"chars": 974,
"preview": "# Example configuration files\n\n> [!NOTE]\n> ttrpg-convert-cli supports both JSON and YAML config files. Examples of both "
},
{
"path": "examples/config/config.5e.json",
"chars": 939,
"preview": "{\n \"sources\" : {\n \"toolsRoot\" : \"local/5etools/data\",\n \"reference\" : [\n \"DMG\"\n ],\n \"adventure\" : [\n "
},
{
"path": "examples/config/config.5e.yaml",
"chars": 775,
"preview": "---\nsources:\n toolsRoot: \"local/5etools/data\"\n reference:\n - \"DMG\"\n adventure:\n - \"LMoP\"\n book"
},
{
"path": "examples/config/config.pf2e.json",
"chars": 531,
"preview": "{\n \"sources\" : {\n \"reference\" : [\n \"CRB\",\n \"GMG\"\n ],\n \"book\" : [\n \"crb\",\n \"gmg\"\n ]\n },"
},
{
"path": "examples/config/config.pf2e.yaml",
"chars": 428,
"preview": "---\nsources:\n reference:\n - \"CRB\"\n - \"GMG\"\n book:\n - \"crb\"\n - \"gmg\"\npaths:\n compend"
},
{
"path": "examples/config/config.schema.json",
"chars": 2618,
"preview": "{\n \"$schema\" : \"https://json-schema.org/draft/2020-12/schema\",\n \"$defs\" : {\n \"Map(String,String)\" : {\n \"type\" "
},
{
"path": "examples/css-snippets/README.md",
"chars": 1747,
"preview": "# Optional CSS Snippets\n\nThe following CSS snippets have been created to further customize the look of the generated con"
},
{
"path": "examples/css-snippets/dnd5e-compendium.css",
"chars": 150413,
"preview": "@charset \"UTF-8\";\n/*! Source: https://github.com/ebullient/ttrpg-convert-cli/blob/main/src/scss/dnd5e-compendium.scss */"
},
{
"path": "examples/css-snippets/dnd5e-float-images.css",
"chars": 134516,
"preview": "/*! Source: https://github.com/ebullient/ttrpg-convert-cli/blob/main/src/scss/dnd5e-float-images.scss */\np div.image-emb"
},
{
"path": "examples/css-snippets/dnd5e-only-admonitions.css",
"chars": 13233,
"preview": "@charset \"UTF-8\";\n/*! Source: https://github.com/ebullient/ttrpg-convert-cli/blob/main/src/scss/dnd5e-only-admonitions.s"
},
{
"path": "examples/css-snippets/dnd5e-only-statblock.css",
"chars": 2321,
"preview": "/*! Source: https://github.com/ebullient/ttrpg-convert-cli/blob/main/src/scss/dnd5e-only-statblock.scss */\nbody {\n --st"
},
{
"path": "examples/css-snippets/hide-markdown-link-url.css",
"chars": 391,
"preview": "@charset \"UTF-8\";\n/*! Source: https://github.com/ebullient/ttrpg-convert-cli/blob/main/src/scss/hide-markdown-link-url.s"
},
{
"path": "examples/css-snippets/pf2-compendium.css",
"chars": 249198,
"preview": "@charset \"UTF-8\";\n/*! Source: https://github.com/ebullient/ttrpg-convert-cli/blob/main/src/scss/pf2-compendium.scss */\n@"
},
{
"path": "examples/css-snippets/pf2-only-statblocks.css",
"chars": 17007,
"preview": "/*! Source: https://github.com/ebullient/ttrpg-convert-cli/blob/main/src/scss/pf2-only-statblocks.scss */\n@import \"https"
},
{
"path": "examples/templates/README.md",
"chars": 1519,
"preview": "# Templates\n\nThis application uses the [Qute Templating Engine](https://quarkus.io/guides/qute). You can make simple cus"
},
{
"path": "examples/templates/tools5e/README.md",
"chars": 6295,
"preview": "# 5eTools Templates for Obsidian\n\nThis guide explains how to use 5eTools data with Obsidian plugins like Fantasy Statblo"
},
{
"path": "examples/templates/tools5e/images-background2md.txt",
"chars": 454,
"preview": "---\nobsidianUIMode: preview\ncssclasses:\n- json5e-background\n{#if resource.tags }\ntags:\n{#for tag in resource.tags}\n- {ta"
},
{
"path": "examples/templates/tools5e/images-class2md.txt",
"chars": 1087,
"preview": "---\nobsidianUIMode: preview\ncssclasses:\n- json5e-class\n{#if resource.tags }\ntags:\n{#for tag in resource.tags}\n- {tag}\n{/"
},
{
"path": "examples/templates/tools5e/images-item2md.txt",
"chars": 2140,
"preview": "---\nobsidianUIMode: preview\ncssclasses:\n- json5e-item\n{#if resource.tags }\ntags:\n{#for tag in resource.tags}\n- {tag}\n{/f"
},
{
"path": "examples/templates/tools5e/images-monster2md.txt",
"chars": 2771,
"preview": "---\nobsidianUIMode: preview\ncssclasses:\n- json5e-monster\n{#if resource.tags }\ntags:\n{#for tag in resource.tags}\n- {tag}\n"
},
{
"path": "examples/templates/tools5e/images-object2md.txt",
"chars": 1555,
"preview": "---\nobsidianUIMode: preview\ncssclasses:\n- json5e-object\n{#if resource.tags }\ntags:\n{#for tag in resource.tags}\n- {tag}\n{"
},
{
"path": "examples/templates/tools5e/images-race2md.txt",
"chars": 688,
"preview": "---\nobsidianUIMode: preview\ncssclasses:\n- json5e-race\n{#if resource.tags }\ntags:\n{#for tag in resource.tags}\n- {tag}\n{/f"
},
{
"path": "examples/templates/tools5e/images-spell2md.txt",
"chars": 877,
"preview": "---\nobsidianUIMode: preview\ncssclasses:\n- json5e-spell\n{#if resource.tags }\ntags:\n{#for tag in resource.tags}\n- {tag}\n{/"
},
{
"path": "examples/templates/tools5e/images-subclass2md.txt",
"chars": 613,
"preview": "---\nobsidianUIMode: preview\ncssclasses:\n- json5e-class\n{#if resource.tags }\ntags:\n{#for tag in resource.tags}\n- {tag}\n{/"
},
{
"path": "examples/templates/tools5e/images-vehicle2md.txt",
"chars": 2544,
"preview": "---\nobsidianUIMode: preview\ncssclasses:\n- json5e-vehicle\n{#if resource.tags }\ntags:\n{#for tag in resource.tags}\n- {tag}\n"
},
{
"path": "examples/templates/tools5e/mixed/README.md",
"chars": 618,
"preview": "---\ntype: fileIndex\n---\n# Additional (mixed) templates\n\nAdditional examples that mash together optional elements from ot"
},
{
"path": "examples/templates/tools5e/mixed/mixed-background2md.txt",
"chars": 404,
"preview": "---\nobsidianUIMode: preview\ncssclasses:\n- json5e-background\n{#if resource.tags }\ntags:\n{#for tag in resource.tags}\n- {ta"
},
{
"path": "examples/templates/tools5e/mixed/mixed-class2md.txt",
"chars": 1117,
"preview": "---\nobsidianUIMode: preview\ncssclasses:\n- json5e-class\n{#if resource.tags }\ntags:\n{#for tag in resource.tags}\n- {tag}\n{/"
},
{
"path": "examples/templates/tools5e/mixed/mixed-deck2md.txt",
"chars": 411,
"preview": "---\nobsidianUIMode: preview\ncssclasses:\n- json5e-deck\n{#if resource.tags }\ntags:\n{#for tag in resource.tags}\n- {tag}\n{/f"
},
{
"path": "examples/templates/tools5e/mixed/mixed-deity2md.txt",
"chars": 852,
"preview": "---\nobsidianUIMode: preview\ncssclasses:\n- json5e-deity\n{#if resource.tags }\ntags:\n{#for tag in resource.tags}\n- {tag}\n{/"
},
{
"path": "examples/templates/tools5e/mixed/mixed-feat2md.txt",
"chars": 586,
"preview": "---\nobsidianUIMode: preview\ncssclasses:\n- json5e-feat\n{#if resource.tags }\ntags:\n{#for tag in resource.tags}\n- {tag}\n{/f"
},
{
"path": "examples/templates/tools5e/mixed/mixed-hazard2md.txt",
"chars": 483,
"preview": "---\nobsidianUIMode: preview\ncssclasses:\n- json5e-hazard\n{#if resource.tags }\ntags:\n{#for tag in resource.tags}\n- {tag}\n{"
},
{
"path": "examples/templates/tools5e/mixed/mixed-item2md.txt",
"chars": 2104,
"preview": "---\nobsidianUIMode: preview\ncssclasses:\n- json5e-item\n{#if resource.tags }\ntags:\n{#for tag in resource.tags}\n- {tag}\n{/f"
},
{
"path": "examples/templates/tools5e/mixed/mixed-monster2md.txt",
"chars": 2812,
"preview": "---\nobsidianUIMode: preview\ncssclasses:\n- json5e-monster\n{#if resource.tags }\ntags:\n{#for tag in resource.tags}\n- {tag}\n"
},
{
"path": "examples/templates/tools5e/mixed/mixed-object2md.txt",
"chars": 1583,
"preview": "---\nobsidianUIMode: preview\ncssclasses:\n- json5e-object\n{#if resource.tags }\ntags:\n{#for tag in resource.tags}\n- {tag}\n{"
},
{
"path": "examples/templates/tools5e/mixed/mixed-race2md.txt",
"chars": 717,
"preview": "---\nobsidianUIMode: preview\ncssclasses:\n- json5e-race\n{#if resource.tags }\ntags:\n{#for tag in resource.tags}\n- {tag}\n{/f"
},
{
"path": "examples/templates/tools5e/mixed/mixed-reward2md.txt",
"chars": 503,
"preview": "---\nobsidianUIMode: preview\ncssclasses:\n- json5e-reward\n{#if resource.tags }\ntags:\n{#for tag in resource.tags}\n- {tag}\n{"
},
{
"path": "examples/templates/tools5e/mixed/mixed-spell2md.txt",
"chars": 858,
"preview": "---\nobsidianUIMode: preview\ncssclasses:\n- json5e-spell\n{#if resource.tags }\ntags:\n{#for tag in resource.tags}\n- {tag}\n{/"
},
{
"path": "examples/templates/tools5e/mixed/mixed-subclass2md.txt",
"chars": 496,
"preview": "---\nobsidianUIMode: preview\ncssclasses:\n- json5e-class\n{#if resource.tags }\ntags:\n{#for tag in resource.tags}\n- {tag}\n{/"
},
{
"path": "examples/templates/tools5e/mixed/mixed-vehicle2md.txt",
"chars": 2593,
"preview": "---\nobsidianUIMode: preview\ncssclasses:\n- json5e-vehicle\n{#if resource.tags }\ntags:\n{#for tag in resource.tags}\n- {tag}\n"
},
{
"path": "examples/templates/tools5e/monster2md-2024.txt",
"chars": 3568,
"preview": "---\nobsidianUIMode: preview\ncssclasses:\n- json5e-monster\n{#if resource.tags }\ntags:\n{#for tag in resource.tags}\n- {tag}\n"
},
{
"path": "examples/templates/tools5e/monster2md-scores.txt",
"chars": 3005,
"preview": "---\nobsidianUIMode: preview\ncssclasses:\n- json5e-monster\n{#if resource.tags }\ntags:\n{#for tag in resource.tags}\n- {tag}\n"
},
{
"path": "examples/templates/tools5e/monster2md-yamlStatblock-body.txt",
"chars": 493,
"preview": "---\nobsidianUIMode: preview\ncssclasses:\n- json5e-monster\n{#if resource.tags }\ntags:\n{#for tag in resource.tags}\n- {tag}\n"
}
]
// ... and 341 more files (download for full content)
About this extraction
This page contains the full source code of the ebullient/ttrpg-convert-cli GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 541 files (3.3 MB), approximately 899.4k tokens, and a symbol index with 2857 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.