This commit is contained in:
TheGiddyLimit
2024-04-23 23:14:25 +01:00
parent adec95d4ab
commit 99cb60d804
97 changed files with 8206 additions and 5742 deletions

View File

@@ -934,11 +934,11 @@ globalThis.Renderer = function () {
};
this._getPtExpandCollapse = function () {
return `<span class="rd__h-toggle ml-2 clickable no-select" data-rd-h-toggle-button="true" title="Toggle Visibility (CTRL to Toggle All)">[\u2013]</span>`;
return `<span class="rd__h-toggle ml-2 clickable no-select no-print lst-is-exporting-image__hidden" data-rd-h-toggle-button="true" title="Toggle Visibility (CTRL to Toggle All)">[\u2013]</span>`;
};
this._getPtExpandCollapseSpecial = function () {
return `<span class="rd__h-toggle ml-2 clickable no-select" data-rd-h-special-toggle-button="true" title="Toggle Visibility (CTRL to Toggle All)">[\u2013]</span>`;
return `<span class="rd__h-toggle ml-2 clickable no-select no-print lst-is-exporting-image__hidden" data-rd-h-special-toggle-button="true" title="Toggle Visibility (CTRL to Toggle All)">[\u2013]</span>`;
};
this._renderInset = function (entry, textStack, meta, options) {
@@ -1887,6 +1887,20 @@ globalThis.Renderer = function () {
break;
}
case "@5etoolsImg": {
const [displayText, page] = Renderer.splitTagByPipe(text);
const fauxEntry = {
type: "link",
href: {
type: "external",
url: UrlUtil.link(this.getMediaUrl("img", page)),
},
text: displayText,
};
this._recursiveRender(fauxEntry, textStack, meta);
break;
}
// OTHER HOVERABLES ////////////////////////////////////////////////////////////////////////////////
case "@footnote": {
@@ -2817,7 +2831,7 @@ Renderer.utils = class {
let pageLinkPart;
if (opts.page) {
const hash = UrlUtil.URL_TO_HASH_BUILDER[opts.page](it);
dataPart = `data-page="${opts.page}" data-source="${it.source.escapeQuotes()}" data-hash="${hash.escapeQuotes()}" ${opts.extensionData != null ? `data-extension='${JSON.stringify(opts.extensionData).escapeQuotes()}` : ""}'`;
dataPart = `data-page="${opts.page}" data-source="${it.source.escapeQuotes()}" data-hash="${hash.escapeQuotes()}" ${opts.extensionData != null ? `data-extension='${JSON.stringify(opts.extensionData).escapeQuotes()}'` : ""}`;
pageLinkPart = SourceUtil.getAdventureBookSourceHref(it.source, it.page);
// Enable Rivet import for entities embedded in entries
@@ -3122,28 +3136,31 @@ Renderer.utils = class {
return fluff;
}
static async pGetFluff ({entity, pFnPostProcess, fnGetFluffData, fluffUrl, fluffBaseUrl, fluffProp} = {}) {
let predefinedFluff = await Renderer.utils.pGetPredefinedFluff(entity, fluffProp);
static async _pGetFluff ({entity, fluffProp} = {}) {
const fluffEntity = await DataLoader.pCacheAndGet(fluffProp, entity.source, UrlUtil.URL_TO_HASH_BUILDER[fluffProp](entity));
if (fluffEntity) return fluffEntity;
if (entity._versionBase_name && entity._versionBase_source) {
return DataLoader.pCacheAndGet(fluffProp, entity.source, UrlUtil.URL_TO_HASH_BUILDER[fluffProp]({
name: entity._versionBase_name,
source: entity._versionBase_source,
}));
}
return null;
}
static async pGetFluff ({entity, pFnPostProcess, fluffProp} = {}) {
const predefinedFluff = await Renderer.utils.pGetPredefinedFluff(entity, fluffProp);
if (predefinedFluff) {
if (pFnPostProcess) predefinedFluff = await pFnPostProcess(predefinedFluff);
if (pFnPostProcess) return pFnPostProcess(predefinedFluff);
return predefinedFluff;
}
if (!fnGetFluffData && !fluffBaseUrl && !fluffUrl) return null;
const fluffIndex = fluffBaseUrl ? await DataUtil.loadJSON(`${Renderer.get().baseUrl}${fluffBaseUrl}fluff-index.json`) : null;
if (fluffIndex && !fluffIndex[entity.source]) return null;
const data = fnGetFluffData ? await fnGetFluffData() : fluffIndex && fluffIndex[entity.source]
? await DataUtil.loadJSON(`${Renderer.get().baseUrl}${fluffBaseUrl}${fluffIndex[entity.source]}`)
: await DataUtil.loadJSON(`${Renderer.get().baseUrl}${fluffUrl}`);
if (!data) return null;
let fluff = (data[fluffProp] || []).find(it => it.name === entity.name && it.source === entity.source);
if (!fluff && entity._versionBase_name && entity._versionBase_source) fluff = (data[fluffProp] || []).find(it => it.name === entity._versionBase_name && it.source === entity._versionBase_source);
const fluff = await Renderer.utils._pGetFluff({entity, fluffProp});
if (!fluff) return null;
// Avoid modifying the original object
if (pFnPostProcess) fluff = await pFnPostProcess(fluff);
if (pFnPostProcess) return pFnPostProcess(fluff);
return fluff;
}
@@ -4612,6 +4629,10 @@ Renderer.tag = class {
tagName = "5etools";
};
static Tag5etoolsImg = class extends this._TagPipedNoDisplayText {
tagName = "5etoolsImg";
};
static TagAdventure = class extends this._TagPipedNoDisplayText {
tagName = "adventure";
};
@@ -5010,6 +5031,7 @@ Renderer.tag = class {
new this.TagCoinflip(),
new this.Tag5etools(),
new this.Tag5etoolsImg(),
new this.TagAdventure(),
new this.TagBook(),
new this.TagFilter(),
@@ -5361,7 +5383,6 @@ Renderer.feat = class {
static pGetFluff (feat) {
return Renderer.utils.pGetFluff({
entity: feat,
fnGetFluffData: DataUtil.featFluff.loadJSON.bind(DataUtil.featFluff),
fluffProp: "featFluff",
});
}
@@ -5508,20 +5529,51 @@ Renderer.class = class {
);
});
}
static pGetFluff (cls) {
// Handle legacy/deprecated class fluff
// TODO(Future) remove this after ~July 2024
if (cls.fluff instanceof Array) {
cls = {...cls};
cls.fluff = {entries: cls.fluff};
}
return Renderer.utils.pGetFluff({
entity: cls,
fluffProp: "classFluff",
});
}
};
Renderer.subclass = class {
static getCompactRenderedString (sc) {
const entries = MiscUtil.copyFast((sc.subclassFeatures || []).flat());
if (entries[0]?.name === sc.name) delete entries[0].name;
const scEntry = {
type: "section",
name: sc.name,
source: sc.source,
page: sc.page,
entries: MiscUtil.copyFast((sc.subclassFeatures || []).flat()),
entries,
};
return Renderer.hover.getGenericCompactRenderedString(scEntry);
}
static pGetFluff (sc) {
return Renderer.utils.pGetFluff({
entity: sc,
fluffProp: "subclassFluff",
});
}
};
Renderer.classSubclass = class {
static pGetFluff (clsOrSc) {
if (clsOrSc.__prop === "subclass") return Renderer.subclass.pGetFluff(clsOrSc);
return Renderer.class.pGetFluff(clsOrSc);
}
};
Renderer.spell = class {
@@ -6083,7 +6135,6 @@ Renderer.spell = class {
static pGetFluff (sp) {
return Renderer.utils.pGetFluff({
entity: sp,
fluffBaseUrl: `data/spells/`,
fluffProp: "spellFluff",
});
}
@@ -6111,7 +6162,6 @@ Renderer.condition = class {
static pGetFluff (it) {
return Renderer.utils.pGetFluff({
entity: it,
fnGetFluffData: it.__prop === "condition" ? DataUtil.conditionFluff.loadJSON.bind(DataUtil.conditionFluff) : null,
fluffProp: it.__prop === "condition" ? "conditionFluff" : "diseaseFluff",
});
}
@@ -6131,7 +6181,6 @@ Renderer.background = class {
static pGetFluff (bg) {
return Renderer.utils.pGetFluff({
entity: bg,
fnGetFluffData: DataUtil.backgroundFluff.loadJSON.bind(DataUtil.backgroundFluff),
fluffProp: "backgroundFluff",
});
}
@@ -6219,7 +6268,6 @@ Renderer.optionalfeature = class {
static pGetFluff (ent) {
return Renderer.utils.pGetFluff({
entity: ent,
fnGetFluffData: DataUtil.optionalfeatureFluff.loadJSON.bind(DataUtil.optionalfeatureFluff),
fluffProp: "optionalfeatureFluff",
});
}
@@ -6259,7 +6307,6 @@ Renderer.reward = class {
static pGetFluff (ent) {
return Renderer.utils.pGetFluff({
entity: ent,
fnGetFluffData: DataUtil.rewardFluff.loadJSON.bind(DataUtil.rewardFluff),
fluffProp: "rewardFluff",
});
}
@@ -6766,7 +6813,6 @@ Renderer.race = class {
static pGetFluff (race) {
return Renderer.utils.pGetFluff({
entity: race,
fnGetFluffData: DataUtil.raceFluff.loadJSON.bind(DataUtil.raceFluff),
fluffProp: "raceFluff",
});
}
@@ -6952,7 +6998,6 @@ Renderer.object = class {
static pGetFluff (obj) {
return Renderer.utils.pGetFluff({
entity: obj,
fnGetFluffData: DataUtil.objectFluff.loadJSON.bind(DataUtil.objectFluff),
fluffProp: "objectFluff",
});
}
@@ -7087,7 +7132,6 @@ Renderer.traphazard = class {
static pGetFluff (ent) {
return Renderer.utils.pGetFluff({
entity: ent,
fnGetFluffData: ent.__prop === "trap" ? DataUtil.trapFluff.loadJSON.bind(DataUtil.trapFluff) : DataUtil.hazardFluff.loadJSON.bind(DataUtil.hazardFluff),
fluffProp: ent.__prop === "trap" ? "trapFluff" : "hazardFluff",
});
}
@@ -7529,7 +7573,7 @@ Renderer.monster = class {
return e_({
tag: "select",
clazz: "input-xs form-control form-control--minimal w-initial inline-block ve-popwindow__hidden",
clazz: "input-xs form-control form-control--minimal w-initial inline-block ve-popwindow__hidden no-print lst-is-exporting-image__hidden",
name: "mon__sel-summon-spell-level",
children: [
e_({tag: "option", val: "-1", text: "\u2014"}),
@@ -7547,7 +7591,7 @@ Renderer.monster = class {
return e_({
tag: "select",
clazz: "input-xs form-control form-control--minimal w-initial inline-block ve-popwindow__hidden",
clazz: "input-xs form-control form-control--minimal w-initial inline-block ve-popwindow__hidden no-print lst-is-exporting-image__hidden",
name: "mon__sel-summon-class-level",
children: [
e_({tag: "option", val: "-1", text: "\u2014"}),
@@ -7659,12 +7703,12 @@ Renderer.monster = class {
ptCrSpellLevel = `<td colspan="2">
${Parser.monCrToFull(mon.cr, {isMythic: !!mon.mythic})}
${opts.isShowScalers && !opts.isScaledCr && Parser.isValidCr(mon.cr ? (mon.cr.cr || mon.cr) : null) ? `
<button title="Scale Creature By CR (Highly Experimental)" class="mon__btn-scale-cr btn btn-xs btn-default">
<button title="Scale Creature By CR (Highly Experimental)" class="mon__btn-scale-cr btn btn-xs btn-default no-print">
<span class="glyphicon glyphicon-signal"></span>
</button>
` : ""}
${opts.isScaledCr ? `
<button title="Reset CR Scaling" class="mon__btn-reset-cr btn btn-xs btn-default">
<button title="Reset CR Scaling" class="mon__btn-reset-cr btn btn-xs btn-default no-print">
<span class="glyphicon glyphicon-refresh"></span>
</button>
` : ""}
@@ -7978,8 +8022,7 @@ Renderer.monster = class {
static pGetFluff (mon) {
return Renderer.utils.pGetFluff({
entity: mon,
pFnPostProcess: Renderer.monster.postProcessFluff.bind(null, mon),
fluffBaseUrl: `data/bestiary/`,
pFnPostProcess: Renderer.monster.postProcessFluff.bind(Renderer.monster, mon),
fluffProp: "monsterFluff",
});
}
@@ -9413,7 +9456,6 @@ Renderer.item = class {
static pGetFluff (item) {
return Renderer.utils.pGetFluff({
entity: item,
fnGetFluffData: DataUtil.itemFluff.loadJSON.bind(DataUtil.itemFluff),
fluffProp: "itemFluff",
});
}
@@ -10140,7 +10182,6 @@ Renderer.vehicle = class {
static pGetFluff (veh) {
return Renderer.utils.pGetFluff({
entity: veh,
fnGetFluffData: DataUtil.vehicleFluff.loadJSON.bind(DataUtil.vehicleFluff),
fluffProp: "vehicleFluff",
});
}
@@ -10226,7 +10267,6 @@ Renderer.language = class {
static pGetFluff (it) {
return Renderer.utils.pGetFluff({
entity: it,
fnGetFluffData: DataUtil.languageFluff.loadJSON.bind(DataUtil.languageFluff),
fluffProp: "languageFluff",
});
}
@@ -10370,7 +10410,6 @@ Renderer.charoption = class {
static pGetFluff (it) {
return Renderer.utils.pGetFluff({
entity: it,
fnGetFluffData: DataUtil.charoptionFluff.loadJSON.bind(DataUtil.charoptionFluff),
fluffProp: "charoptionFluff",
});
}
@@ -10490,7 +10529,6 @@ Renderer.recipe = class {
static pGetFluff (it) {
return Renderer.utils.pGetFluff({
entity: it,
fnGetFluffData: DataUtil.recipeFluff.loadJSON.bind(DataUtil.recipeFluff),
fluffProp: "recipeFluff",
});
}
@@ -11651,9 +11689,14 @@ Renderer.hover = class {
* @param [opts.isPopout] If the window should be immediately popped out.
* @param [opts.compactReferenceData] Reference (e.g. page/source/hash/others) which can be used to load the contents into the DM screen.
* @param [opts.sourceData] Source JSON (as raw as possible) used to construct this popout.
* @param [opts.isResizeOnlyWidth]
* @param [opts.isHideBottomBorder]
*/
static getShowWindow ($content, position, opts) {
opts = opts || {};
const {isHideBottomBorder, isResizeOnlyWidth} = opts;
if (isHideBottomBorder && !isResizeOnlyWidth) throw new Error(`"isHideBottomBorder" option requires "isResizeOnlyWidth"!`);
Renderer.hover._doInit();
@@ -11680,31 +11723,40 @@ Renderer.hover = class {
const drag = {};
const $brdrTopRightResize = $(`<div class="hoverborder__resize-ne"></div>`)
.on("mousedown touchstart", (evt) => Renderer.hover._getShowWindow_handleDragMousedown({hoverWindow, hoverId, $hov, drag, $wrpContent}, {evt, type: 1}));
.on("mousedown touchstart", (evt) => Renderer.hover._getShowWindow_handleDragMousedown({hoverWindow, hoverId, $hov, drag, $wrpContent}, {evt, type: 1, isResizeOnlyWidth}));
if (isResizeOnlyWidth) $brdrTopRightResize.hideVe();
const $brdrRightResize = $(`<div class="hoverborder__resize-e"></div>`)
.on("mousedown touchstart", (evt) => Renderer.hover._getShowWindow_handleDragMousedown({hoverWindow, hoverId, $hov, drag, $wrpContent}, {evt, type: 2}));
.on("mousedown touchstart", (evt) => Renderer.hover._getShowWindow_handleDragMousedown({hoverWindow, hoverId, $hov, drag, $wrpContent}, {evt, type: 2, isResizeOnlyWidth}));
const $brdrBottomRightResize = $(`<div class="hoverborder__resize-se"></div>`)
.on("mousedown touchstart", (evt) => Renderer.hover._getShowWindow_handleDragMousedown({hoverWindow, hoverId, $hov, drag, $wrpContent}, {evt, type: 3}));
.on("mousedown touchstart", (evt) => Renderer.hover._getShowWindow_handleDragMousedown({hoverWindow, hoverId, $hov, drag, $wrpContent}, {evt, type: 3, isResizeOnlyWidth}));
if (isResizeOnlyWidth) $brdrBottomRightResize.hideVe();
const $brdrBtm = $(`<div class="hoverborder hoverborder--btm ${opts.isBookContent ? "hoverborder-book" : ""}"><div class="hoverborder__resize-s"></div></div>`)
.on("mousedown touchstart", (evt) => Renderer.hover._getShowWindow_handleDragMousedown({hoverWindow, hoverId, $hov, drag, $wrpContent}, {evt, type: 4}));
const $brdrBtm = $(`<div class="hoverborder hoverborder--btm ${opts.isBookContent ? "hoverborder-book" : ""}"></div>`);
const $brdrBtmResize = $(`<div class="hoverborder__resize-s"></div>`)
.on("mousedown touchstart", (evt) => Renderer.hover._getShowWindow_handleDragMousedown({hoverWindow, hoverId, $hov, drag, $wrpContent}, {evt, type: 4, isResizeOnlyWidth}))
.appendTo($brdrBtm);
if (isResizeOnlyWidth) $brdrBtmResize.hideVe();
if (isHideBottomBorder) $brdrBtm.hideVe();
const $brdrBtmLeftResize = $(`<div class="hoverborder__resize-sw"></div>`)
.on("mousedown touchstart", (evt) => Renderer.hover._getShowWindow_handleDragMousedown({hoverWindow, hoverId, $hov, drag, $wrpContent}, {evt, type: 5}));
.on("mousedown touchstart", (evt) => Renderer.hover._getShowWindow_handleDragMousedown({hoverWindow, hoverId, $hov, drag, $wrpContent}, {evt, type: 5, isResizeOnlyWidth}));
if (isResizeOnlyWidth) $brdrBtmLeftResize.hideVe();
const $brdrLeftResize = $(`<div class="hoverborder__resize-w"></div>`)
.on("mousedown touchstart", (evt) => Renderer.hover._getShowWindow_handleDragMousedown({hoverWindow, hoverId, $hov, drag, $wrpContent}, {evt, type: 6}));
.on("mousedown touchstart", (evt) => Renderer.hover._getShowWindow_handleDragMousedown({hoverWindow, hoverId, $hov, drag, $wrpContent}, {evt, type: 6, isResizeOnlyWidth}));
const $brdrTopLeftResize = $(`<div class="hoverborder__resize-nw"></div>`)
.on("mousedown touchstart", (evt) => Renderer.hover._getShowWindow_handleDragMousedown({hoverWindow, hoverId, $hov, drag, $wrpContent}, {evt, type: 7}));
.on("mousedown touchstart", (evt) => Renderer.hover._getShowWindow_handleDragMousedown({hoverWindow, hoverId, $hov, drag, $wrpContent}, {evt, type: 7, isResizeOnlyWidth}));
if (isResizeOnlyWidth) $brdrTopLeftResize.hideVe();
const $brdrTopResize = $(`<div class="hoverborder__resize-n"></div>`)
.on("mousedown touchstart", (evt) => Renderer.hover._getShowWindow_handleDragMousedown({hoverWindow, hoverId, $hov, drag, $wrpContent}, {evt, type: 8}));
.on("mousedown touchstart", (evt) => Renderer.hover._getShowWindow_handleDragMousedown({hoverWindow, hoverId, $hov, drag, $wrpContent}, {evt, type: 8, isResizeOnlyWidth}));
if (isResizeOnlyWidth) $brdrTopResize.hideVe();
const $brdrTop = $(`<div class="hoverborder hoverborder--top ${opts.isBookContent ? "hoverborder-book" : ""}" ${opts.isPermanent ? `data-perm="true"` : ""}></div>`)
.on("mousedown touchstart", (evt) => Renderer.hover._getShowWindow_handleDragMousedown({hoverWindow, hoverId, $hov, drag, $wrpContent}, {evt, type: 9}))
.on("mousedown touchstart", (evt) => Renderer.hover._getShowWindow_handleDragMousedown({hoverWindow, hoverId, $hov, drag, $wrpContent}, {evt, type: 9, isResizeOnlyWidth}))
.on("contextmenu", (evt) => {
Renderer.hover._contextMenuLastClicked = {
hoverId,
@@ -11883,7 +11935,7 @@ Renderer.hover = class {
if (opts.cbClose) opts.cbClose(hoverWindow);
}
static _getShowWindow_handleDragMousedown ({hoverWindow, hoverId, $hov, drag, $wrpContent}, {evt, type}) {
static _getShowWindow_handleDragMousedown ({hoverWindow, hoverId, $hov, drag, $wrpContent}, {evt, type, isResizeOnlyWidth}) {
if (evt.which === 0 || evt.which === 1) evt.preventDefault();
hoverWindow.zIndex = Renderer.hover._getNextZIndex(hoverId);
$hov.css({
@@ -11895,11 +11947,11 @@ Renderer.hover = class {
drag.startY = EventUtil.getClientY(evt);
drag.baseTop = parseFloat($hov.css("top"));
drag.baseLeft = parseFloat($hov.css("left"));
drag.baseHeight = $wrpContent.height();
if (!isResizeOnlyWidth) drag.baseHeight = $wrpContent.height();
drag.baseWidth = parseFloat($hov.css("width"));
if (type < 9) {
$wrpContent.css({
"height": drag.baseHeight,
...(isResizeOnlyWidth ? {} : {"height": drag.baseHeight}),
"max-height": "initial",
});
$hov.css("max-width", "initial");
@@ -12372,6 +12424,8 @@ Renderer.hover = class {
case UrlUtil.PG_VEHICLES: return Renderer.vehicle.pGetFluff;
case UrlUtil.PG_CHAR_CREATION_OPTIONS: return Renderer.charoption.pGetFluff;
case UrlUtil.PG_RECIPES: return Renderer.recipe.pGetFluff;
case UrlUtil.PG_TRAPS_HAZARDS: return Renderer.traphazard.pGetFluff;
case UrlUtil.PG_CLASSES: return Renderer.classSubclass.pGetFluff;
default: return null;
}
}