Skip to content

Commit

Permalink
feat: Property, Saves, Spells, Text, and Traits block types can now r…
Browse files Browse the repository at this point in the history
…ender markdown (#24, #5, #16)
  • Loading branch information
valentine195 committed Jan 13, 2022
1 parent 85bdb5b commit cb75afe
Show file tree
Hide file tree
Showing 9 changed files with 88 additions and 26 deletions.
31 changes: 18 additions & 13 deletions src/data/constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -44,13 +44,7 @@ export const TypeNames: Array<[typeof StatblockItemTypes[number], string]> = [

export type StatblockItemType = typeof StatblockItemTypes[number];

export interface DiceProps {
callback?: string;
property?: keyof Monster;
text?: string;
parse?: boolean;
}
interface CommonProps {
type CommonProps = {
type: StatblockItemType;
id: string;
properties: Array<keyof Monster>;
Expand All @@ -61,8 +55,19 @@ interface CommonProps {
diceProperty?: keyof Monster;
diceText?: string;
diceCallback?: string;
};

export const MarkdownTypes = [
"property",
"traits",
"spells",
"text",
"saves"
] as const;

type GenericTextProp = {
markdown?: boolean;
}
};

type GroupProps = {
type: "group";
Expand Down Expand Up @@ -112,14 +117,14 @@ type TextProps = {
export type GroupItem = CommonProps & GroupProps;
export type HeadingItem = CommonProps & HeadingProps;
export type InlineItem = CommonProps & InlineProps;
export type PropertyItem = CommonProps & PropertyProps;
export type SavesItem = CommonProps & SavesProps;
export type TraitsItem = CommonProps & TraitsProps;
export type SpellsItem = CommonProps & SpellsProps;
export type PropertyItem = CommonProps & PropertyProps & GenericTextProp;
export type SavesItem = CommonProps & SavesProps & GenericTextProp;
export type TraitsItem = CommonProps & TraitsProps & GenericTextProp;
export type SpellsItem = CommonProps & SpellsProps & GenericTextProp;
export type SubHeadingItem = CommonProps & SubHeadingProps;
export type TableItem = CommonProps & TableProps;
export type ImageItem = CommonProps & ImageProps;
export type TextItem = CommonProps & TextProps;
export type TextItem = CommonProps & TextProps & GenericTextProp;

export type StatblockItem =
| GroupItem
Expand Down
31 changes: 29 additions & 2 deletions src/settings/ui/block.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,13 @@ import {
Setting,
TextAreaComponent
} from "obsidian";
import type {
import {
StatblockItem,
PropertyItem,
TableItem,
TraitsItem,
TextItem
TextItem,
MarkdownTypes
} from "src/data/constants";
import type StatBlockPlugin from "src/main";
import TableHeaders from "./TableHeaders.svelte";
Expand Down Expand Up @@ -162,6 +163,32 @@ export class BlockModal extends Modal {
});
}
if (!this.advanced) return;
if (MarkdownTypes.includes(this.block.type as any)) {
new Setting(el)
.setName("Render as Markdown")
.setDesc(
createFragment((e) => {
e.createSpan({
text: "The block will attempt to render as markdown."
});
e.createEl("br");
e.createEl("strong", {
text: "Cannot be used with the Dice option."
});
})
)
.addToggle((t) => {
t.setValue((this.block as TextItem).markdown).onChange(
(v) => {
(this.block as TextItem).markdown = v;
if (v) {
this.block.dice = false;
this.display();
}
}
);
});
}
if (this.block.type == "text") {
new Setting(el)
.setHeading()
Expand Down
4 changes: 2 additions & 2 deletions src/view/ui/Content.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -194,7 +194,8 @@
target: prop,
props: {
name: block.name,
desc: block.desc
desc: block.desc,
render: item.markdown
},
context
});
Expand Down Expand Up @@ -239,7 +240,6 @@
for (let target of targets) {
columnEl.appendChild(target);
console.log(target, target.clientHeight);
if (
columnEl.clientHeight > splitHeight &&
node.childElementCount != columns
Expand Down
17 changes: 17 additions & 0 deletions src/view/ui/MarkdownHolder.svelte
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<script lang="ts">
import { MarkdownRenderer } from "obsidian";
import { getContext } from "svelte";
import type StatBlockRenderer from "../statblock";
export let property: string;
const context = getContext<string>("context");
const renderer = getContext<StatBlockRenderer>("renderer");
const markdown = (node: HTMLElement) => {
MarkdownRenderer.renderMarkdown(property, node, context, renderer);
};
</script>

<div use:markdown />
5 changes: 2 additions & 3 deletions src/view/ui/PropertyLine.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,7 @@
import type StatBlockPlugin from "src/main";
import { getContext } from "svelte";
import { stringify } from "../utils";
import DiceHolder from "./DiceHolder.svelte";
import TextContentHolder from "./TextContentHolder.svelte";
export let monster: Monster;
export let item: PropertyItem;
Expand Down Expand Up @@ -37,7 +36,7 @@
{#if !item.conditioned || (item.conditioned && `${property}`.length)}
<div class="line">
<span class="property-name">{display}</span>
<DiceHolder {property} />
<TextContentHolder render={item.markdown} {property} />
</div>
{/if}

Expand Down
4 changes: 2 additions & 2 deletions src/view/ui/Saves.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import type { SavesItem } from "src/data/constants";
import { toTitleCase } from "src/util/util";
import { getContext } from "svelte";
import DiceHolder from "./DiceHolder.svelte";
import TextContentHolder from "./TextContentHolder.svelte";
export let monster: Monster;
export let item: SavesItem;
Expand Down Expand Up @@ -38,7 +38,7 @@
>{item.display ?? toTitleCase(item.properties[0])}</span
>
<div class="property-text">
<DiceHolder property={saves} />
<TextContentHolder render={item.markdown} property={saves} />
</div>
</div>
</div>
Expand Down
4 changes: 2 additions & 2 deletions src/view/ui/Text.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@
import type { Monster } from "@types";
import type { TextItem } from "src/data/constants";
import { stringify } from "../utils";
import DiceHolder from "./DiceHolder.svelte";
import SectionHeading from "./SectionHeading.svelte";
import TextContentHolder from "./TextContentHolder.svelte";
export let monster: Monster;
export let item: TextItem;
Expand All @@ -23,7 +23,7 @@
<SectionHeading header={item.heading} />
{/if}
<div class="line">
<DiceHolder {property} />
<TextContentHolder render={item.markdown} {property} />
</div>
{/if}

Expand Down
13 changes: 13 additions & 0 deletions src/view/ui/TextContentHolder.svelte
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<script lang="ts">
import DiceHolder from "./DiceHolder.svelte";
import MarkdownHolder from "./MarkdownHolder.svelte";
export let property: string;
export let render: boolean = false;
</script>

{#if render}
<MarkdownHolder {property} />
{:else}
<DiceHolder {property} />
{/if}
5 changes: 3 additions & 2 deletions src/view/ui/Traits.svelte
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
<script lang="ts">
import DiceHolder from "./DiceHolder.svelte";
import TextContentHolder from "./TextContentHolder.svelte";
export let name: string;
export let desc: string;
export let render: boolean;
</script>

<div class="property">
<div class="property-name">{name}</div>
<div class="property-text">
<DiceHolder property={desc} />
<TextContentHolder {render} property={desc} />
</div>
</div>

Expand Down

0 comments on commit cb75afe

Please sign in to comment.