2021-03-25 16:02:55 +01:00
|
|
|
<script>
|
2021-06-08 12:39:07 +02:00
|
|
|
import SpTitle from "./SpTitle.svelte";
|
|
|
|
import SpTiers from "./SpTiers.svelte";
|
|
|
|
import SpKeys from "./SpKeys.svelte";
|
|
|
|
import SpCandidates from "./SpCandidates.svelte";
|
2021-06-18 13:20:54 +02:00
|
|
|
import SpJournal from "./SpJournal.svelte";
|
2021-06-08 12:39:07 +02:00
|
|
|
import { onMount } from "svelte";
|
|
|
|
let v = "loading...";
|
|
|
|
let relpath = "";
|
|
|
|
let relpermalink = "";
|
|
|
|
let protocol = "";
|
|
|
|
let title = "Foo bar";
|
2021-08-13 00:00:52 +02:00
|
|
|
let hases = [];
|
|
|
|
let hasesCandidates = [];
|
|
|
|
let frontmatter = {};
|
|
|
|
let frontmatterLoaded = false;
|
|
|
|
frontmatter["triad"] = [];
|
2021-06-08 12:39:07 +02:00
|
|
|
frontmatter["ascriptions"] = [];
|
|
|
|
frontmatter["notsand"] = [];
|
2021-06-02 02:02:20 +02:00
|
|
|
|
2021-06-08 12:39:07 +02:00
|
|
|
function keyUp(e) {
|
|
|
|
if (e.key == "Escape") {
|
|
|
|
window.history.back();
|
|
|
|
}
|
|
|
|
}
|
2021-06-02 02:02:20 +02:00
|
|
|
|
2021-06-04 01:38:27 +02:00
|
|
|
function diffArrr(arr, arrr) {
|
2021-06-08 12:39:07 +02:00
|
|
|
let diff = new Set(arr);
|
2021-04-24 01:14:16 +02:00
|
|
|
for (let e of arrr) {
|
2021-06-08 12:39:07 +02:00
|
|
|
diff.delete(e);
|
2021-04-24 01:14:16 +02:00
|
|
|
}
|
2021-06-08 12:39:07 +02:00
|
|
|
return Array.from(diff);
|
|
|
|
}
|
|
|
|
|
|
|
|
function newHasTiers(arrgs) {
|
|
|
|
let [fmKeyType, index, oldFmKey, newFmKey] = arrgs.detail;
|
|
|
|
frontmatter[fmKeyType][index] = {
|
|
|
|
fmKey: newFmKey,
|
|
|
|
tiers: [],
|
|
|
|
candidates: METASP[newFmKey].tiers,
|
|
|
|
};
|
|
|
|
hasesCandidates = hasesCandidates.filter((h) => h != newFmKey);
|
2021-08-13 00:00:52 +02:00
|
|
|
hasesCandidates = [...hasesCandidates, oldFmKey];
|
2021-06-08 12:39:07 +02:00
|
|
|
}
|
|
|
|
|
2021-08-12 01:11:00 +02:00
|
|
|
function loadHugoPageMetadata(editHash) {
|
2021-06-08 12:39:07 +02:00
|
|
|
var el = document.createElement("script");
|
|
|
|
el.onload = () => {
|
|
|
|
v = repo.content;
|
|
|
|
if (v.startsWith("\n")) {
|
|
|
|
v = v.substring(1);
|
|
|
|
}
|
|
|
|
|
|
|
|
relpath = repo.path;
|
|
|
|
relpermalink = repo.relpermalink;
|
|
|
|
protocol = document.location.protocol.substring(0, 4);
|
2021-08-13 00:00:52 +02:00
|
|
|
let notSelf = Object.entries(METASP).filter(n => n[1].singular == relpath.split("/")[0])[0][0]
|
|
|
|
hases = Object.keys(METASP).filter(k => k != notSelf);
|
2021-06-08 12:39:07 +02:00
|
|
|
Object.entries(repo.frontmatter).forEach(([fmKey, fmValue]) => {
|
|
|
|
let fmKeyType = "";
|
|
|
|
if (fmKey.toLowerCase().startsWith("has_")) {
|
|
|
|
if (hases.includes(fmKey.substr(4))) {
|
|
|
|
fmKeyType = "triad";
|
|
|
|
fmKey = fmKey.substr(4);
|
|
|
|
}
|
|
|
|
} else if (hases.includes(fmKey.toLowerCase())) {
|
|
|
|
fmKeyType = "ascriptions";
|
|
|
|
} else if (["abstract", "keywords"].includes(fmKey.toLowerCase())) {
|
|
|
|
fmKeyType = "journal";
|
|
|
|
} else {
|
|
|
|
fmKeyType = "notsand";
|
|
|
|
}
|
2021-04-28 17:09:45 +02:00
|
|
|
|
2021-06-08 12:39:07 +02:00
|
|
|
if (["triad", "ascriptions"].includes(fmKeyType)) {
|
|
|
|
if (Array.isArray(fmValue)) {
|
|
|
|
let tiers = [];
|
|
|
|
let candidates = [];
|
|
|
|
METASP[fmKey].tiers.forEach((t) => {
|
|
|
|
if (fmValue.includes(t.file)) {
|
|
|
|
tiers.push(t);
|
|
|
|
} else {
|
2021-08-13 00:00:52 +02:00
|
|
|
candidates.push(t);
|
2021-06-08 12:39:07 +02:00
|
|
|
}
|
|
|
|
});
|
|
|
|
frontmatter[fmKeyType].push({
|
|
|
|
fmKey: fmKey,
|
|
|
|
tiers: tiers,
|
|
|
|
candidates: candidates,
|
|
|
|
});
|
|
|
|
}
|
|
|
|
} else if (fmKeyType == "journal") {
|
|
|
|
frontmatter["journal"] || (frontmatter["journal"] = []);
|
2021-06-18 13:20:54 +02:00
|
|
|
if (Array.isArray(fmValue)) {
|
|
|
|
let fmValueArray = [];
|
|
|
|
fmValue.forEach((v) => fmValueArray.push(v));
|
|
|
|
frontmatter[fmKeyType].push({ fmKey: fmKey, fmValue: fmValueArray });
|
|
|
|
} else {
|
|
|
|
frontmatter[fmKeyType].push({ fmKey: fmKey, fmValue: fmValue });
|
|
|
|
}
|
2021-06-08 12:39:07 +02:00
|
|
|
}
|
|
|
|
});
|
|
|
|
hasesCandidates = diffArrr(hases, [
|
|
|
|
...frontmatter["triad"].map((t) => {
|
|
|
|
return t.fmKey;
|
|
|
|
}),
|
|
|
|
...frontmatter["ascriptions"].map((t) => {
|
|
|
|
return t.fmKey;
|
|
|
|
}),
|
|
|
|
]);
|
2021-04-24 01:14:16 +02:00
|
|
|
|
2021-06-08 12:39:07 +02:00
|
|
|
let tkey = Object.keys(repo.frontmatter).filter((t) => t.toLowerCase() == "title")[0];
|
|
|
|
title = repo.frontmatter[tkey];
|
2021-08-13 00:00:52 +02:00
|
|
|
frontmatterLoaded = true;
|
2021-06-08 12:39:07 +02:00
|
|
|
};
|
2021-08-12 01:11:00 +02:00
|
|
|
el.src = `../js/repo/${editHash}.js`;
|
2021-06-08 12:39:07 +02:00
|
|
|
document.body.appendChild(el);
|
|
|
|
}
|
2021-06-02 02:02:20 +02:00
|
|
|
|
2021-06-08 12:39:07 +02:00
|
|
|
function addToCandidatesRemoveFromTiers(arrgs) {
|
|
|
|
let [fmKeyType, index, fmKey, tier] = arrgs.detail;
|
|
|
|
frontmatter[fmKeyType][index]["fmKey"] = fmKey;
|
|
|
|
frontmatter[fmKeyType][index]["tiers"] = frontmatter[fmKeyType][index]["tiers"].filter(
|
|
|
|
(t) => t !== tier
|
|
|
|
);
|
|
|
|
frontmatter[fmKeyType][index]["candidates"] = [...frontmatter[fmKeyType][index]["candidates"], tier];
|
|
|
|
}
|
2021-06-02 02:02:20 +02:00
|
|
|
|
2021-06-08 12:39:07 +02:00
|
|
|
function addToTiersRemoveFromCandidates(arrgs) {
|
|
|
|
let [fmKeyType, index, , value] = arrgs.detail;
|
|
|
|
const tier = frontmatter[fmKeyType][index]["candidates"].filter((t) => t.file == value);
|
|
|
|
if (tier.length > 0) {
|
|
|
|
frontmatter[fmKeyType][index]["tiers"] = [...frontmatter[fmKeyType][index]["tiers"], tier[0]];
|
|
|
|
frontmatter[fmKeyType][index]["candidates"] = frontmatter[fmKeyType][index]["candidates"].filter(
|
|
|
|
(t) => t != tier[0]
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function toggleFold() {
|
|
|
|
let e = document.getElementById("frontmatter");
|
|
|
|
if (e && e.classList.contains("fmHidden")) {
|
|
|
|
e.classList.remove("fmHidden");
|
|
|
|
e.classList.add("fmShown");
|
|
|
|
} else if (e && e.classList.contains("fmShown")) {
|
|
|
|
e.classList.remove("fmShown");
|
|
|
|
e.classList.add("fmHidden");
|
|
|
|
}
|
2021-06-18 13:20:54 +02:00
|
|
|
let i = document.getElementById("fmicon");
|
|
|
|
if (i && i.classList.contains("fmCollapse")) {
|
|
|
|
i.classList.remove("fmCollapse");
|
|
|
|
i.classList.add("fmExpand");
|
|
|
|
} else if (i && i.classList.contains("fmExpand")) {
|
|
|
|
i.classList.remove("fmExpand");
|
|
|
|
i.classList.add("fmCollapse");
|
|
|
|
}
|
2021-06-08 12:39:07 +02:00
|
|
|
}
|
2021-04-15 00:55:21 +02:00
|
|
|
|
2021-08-12 01:11:00 +02:00
|
|
|
function newFrontmatter() {
|
|
|
|
return Object.entries(frontmatter).filter(val => val[1].length == 0).map(key => key[0])
|
|
|
|
}
|
|
|
|
|
2021-08-13 00:00:52 +02:00
|
|
|
function checkTriad() {
|
|
|
|
let ct = Object.entries(frontmatter).filter(i => i[1].length == 0 && i[0] == "triad")
|
|
|
|
return ct.length == 0 ? false : true
|
|
|
|
}
|
|
|
|
|
2021-08-12 01:11:00 +02:00
|
|
|
function newTriad() {
|
2021-08-13 00:00:52 +02:00
|
|
|
newHasTiers({"detail": ["triad", 0, "authors", "editors"]})
|
2021-08-12 01:11:00 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
function dispatchHash() {
|
|
|
|
var searchParams = new URLSearchParams(location.search);
|
|
|
|
let editHash = searchParams.get('edit')
|
|
|
|
if (editHash) {
|
|
|
|
loadHugoPageMetadata(editHash)
|
|
|
|
} else {
|
|
|
|
let newPage = searchParams.get('new')
|
|
|
|
console.log(newPage)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
onMount(() => {
|
|
|
|
dispatchHash();
|
|
|
|
// loadHugoPageMetadata();
|
|
|
|
console.dir(frontmatter);
|
|
|
|
});
|
|
|
|
|
|
|
|
$: hashChanged = ()=> dispatchHash();
|
2021-03-25 16:02:55 +01:00
|
|
|
</script>
|
|
|
|
|
2021-08-12 01:11:00 +02:00
|
|
|
<svelte:window on:keyup={keyUp} on:hashchange={hashChanged} />
|
2021-03-25 16:02:55 +01:00
|
|
|
<main id="sandpoints">
|
|
|
|
<form>
|
2021-06-08 12:39:07 +02:00
|
|
|
<div class="formgrid">
|
|
|
|
<SpTitle {relpath} {title} />
|
|
|
|
</div>
|
2021-06-18 13:20:54 +02:00
|
|
|
<div id="fmicon" on:click={toggleFold} class="fmCollapse">Frontmatter</div>
|
2021-06-08 12:39:07 +02:00
|
|
|
<span id="frontmatter" class="fmHidden">
|
|
|
|
{#each Object.entries(frontmatter) as fmItems}
|
2021-06-04 01:38:27 +02:00
|
|
|
{#each fmItems[1] as fmItem, i}
|
2021-06-08 12:39:07 +02:00
|
|
|
{#if ["ascriptions", "triad"].includes(fmItems[0])}
|
|
|
|
<SpKeys
|
|
|
|
index={i}
|
|
|
|
fmKeyType={fmItems[0]}
|
|
|
|
{fmItem}
|
|
|
|
{hases}
|
|
|
|
{hasesCandidates}
|
|
|
|
on:hasTiersSelected={newHasTiers}
|
|
|
|
/>
|
|
|
|
<SpTiers
|
|
|
|
on:addToCandidatesRemoveFromTiers={addToCandidatesRemoveFromTiers}
|
|
|
|
index={i}
|
|
|
|
fmKeyType={fmItems[0]}
|
|
|
|
{fmItem}
|
|
|
|
/>
|
|
|
|
<SpCandidates
|
|
|
|
on:addToTiersRemoveFromCandidates={addToTiersRemoveFromCandidates}
|
|
|
|
index={i}
|
|
|
|
fmKeyType={fmItems[0]}
|
|
|
|
{fmItem}
|
|
|
|
/>
|
|
|
|
{:else if fmItems[0] == "journal"}
|
2021-06-18 13:20:54 +02:00
|
|
|
<SpJournal {fmItem} />
|
2021-06-08 12:39:07 +02:00
|
|
|
{/if}
|
2021-06-02 02:02:20 +02:00
|
|
|
{/each}
|
2021-06-08 12:39:07 +02:00
|
|
|
{/each}
|
2021-08-13 00:00:52 +02:00
|
|
|
{#if frontmatterLoaded && checkTriad()}
|
|
|
|
<div on:click="{newTriad}">NEW TRIAD TIER</div>
|
|
|
|
{/if}
|
2021-06-08 12:39:07 +02:00
|
|
|
</span>
|
|
|
|
<div class="formgrid">
|
2021-06-18 13:20:54 +02:00
|
|
|
<label for="pagecontent">Content:</label>
|
2021-06-08 12:39:07 +02:00
|
|
|
<textarea
|
2021-06-18 13:20:54 +02:00
|
|
|
id="pagecontent"
|
2021-06-08 12:39:07 +02:00
|
|
|
bind:value={v}
|
|
|
|
oninput="this.style.height = '';this.style.height = this.scrollHeight + 3 + 'px'"
|
|
|
|
/>
|
|
|
|
{#if document.location.protocol.substring(0, 4) != "file"}
|
|
|
|
<label for="publish">Publish</label>
|
|
|
|
<input type="checkbox" id="publish" name="publish" />
|
2021-06-02 02:02:20 +02:00
|
|
|
{/if}
|
2021-06-08 12:39:07 +02:00
|
|
|
<label for="offline">Offline</label>
|
|
|
|
<input type="checkbox" id="offline" name="offline" />
|
|
|
|
<input type="hidden" name="relpermalink" bind:value={relpermalink} />
|
|
|
|
<input type="hidden" name="relpath" bind:value={relpath} />
|
|
|
|
<input type="hidden" name="protocol" bind:value={protocol} />
|
|
|
|
<button id="sandpointsButton">COMMIT/SAVE</button>
|
|
|
|
</div>
|
2021-03-25 16:02:55 +01:00
|
|
|
</form>
|
|
|
|
</main>
|