WIP
This commit is contained in:
@@ -193,6 +193,21 @@ class Game {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
getFileName(anonymous: boolean) {
|
||||||
|
const header = this.header;
|
||||||
|
const w = anonymous ? "Anonymous" : header.WhitePretty;
|
||||||
|
const b = anonymous ? "Anonymous" : header.BlackPretty;
|
||||||
|
|
||||||
|
return (
|
||||||
|
(header.Date
|
||||||
|
? `${header.Date.replace(/\?/g, "X").replace(/\./g, "-")}_`
|
||||||
|
: "") +
|
||||||
|
`${w}_${b}` +
|
||||||
|
(header.Event ? `_${header.Event}` : "") +
|
||||||
|
(header.Round ? `_R${header.Round}` : "")
|
||||||
|
).replace(/\s+/g, "-");
|
||||||
|
}
|
||||||
|
|
||||||
get pgn() {
|
get pgn() {
|
||||||
return this.game.pgn();
|
return this.game.pgn();
|
||||||
}
|
}
|
||||||
|
|||||||
13
src/main.tsx
13
src/main.tsx
@@ -84,7 +84,7 @@ const main = async () => {
|
|||||||
const pgn = state.boardConfig.anonymous
|
const pgn = state.boardConfig.anonymous
|
||||||
? state.game.anonymousPGN
|
? state.game.anonymousPGN
|
||||||
: state.game.pgn;
|
: state.game.pgn;
|
||||||
window.location.hash = `v1/pgn/${compressPGN(pgn)}`;
|
window.location.hash = `pgn/${compressPGN(pgn)}`;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
toggleTitleScreen() {
|
toggleTitleScreen() {
|
||||||
@@ -115,7 +115,7 @@ const main = async () => {
|
|||||||
ply: 0,
|
ply: 0,
|
||||||
game,
|
game,
|
||||||
});
|
});
|
||||||
window.location.hash = `v1/pgn/${compressPGN(game.pgn)}`;
|
window.location.hash = `pgn/${compressPGN(game.pgn)}`;
|
||||||
|
|
||||||
await player.load(game);
|
await player.load(game);
|
||||||
setState("activeTab", "game");
|
setState("activeTab", "game");
|
||||||
@@ -143,7 +143,7 @@ const main = async () => {
|
|||||||
await player.load(game);
|
await player.load(game);
|
||||||
|
|
||||||
if (hash) {
|
if (hash) {
|
||||||
window.location.hash = `v1/fen/${state.fen}`;
|
window.location.hash = `fen/${state.fen}`;
|
||||||
setState("activeTab", "game");
|
setState("activeTab", "game");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -177,7 +177,7 @@ const main = async () => {
|
|||||||
state.boardConfig,
|
state.boardConfig,
|
||||||
state.gameConfig.picSize
|
state.gameConfig.picSize
|
||||||
);
|
);
|
||||||
download(data, "fen", "png");
|
download(data, `fen_${Date.now()}`, "png");
|
||||||
},
|
},
|
||||||
async downloadAnimation() {
|
async downloadAnimation() {
|
||||||
await new Promise((resolve) => setTimeout(resolve, 0));
|
await new Promise((resolve) => setTimeout(resolve, 0));
|
||||||
@@ -188,7 +188,10 @@ const main = async () => {
|
|||||||
state.gameConfig.animationSize,
|
state.gameConfig.animationSize,
|
||||||
state.gameConfig.titleScreen
|
state.gameConfig.titleScreen
|
||||||
);
|
);
|
||||||
download(data, "game", state.gameConfig.format.toLowerCase());
|
|
||||||
|
const name = state.game.getFileName(state.boardConfig.anonymous);
|
||||||
|
|
||||||
|
download(data, name, state.gameConfig.format.toLowerCase());
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import { decompressPGN } from "../game/PGNHelpers";
|
import { decompressPGN } from "../game/PGNHelpers";
|
||||||
|
|
||||||
const HEADER_REGEX = /^#v\d+\/(pgn|fen)\//;
|
const HEADER_REGEX = /^#(pgn|fen)\//;
|
||||||
|
|
||||||
const extractUrlData = () => {
|
const extractUrlData = () => {
|
||||||
const hash = window.location.hash;
|
const hash = window.location.hash;
|
||||||
@@ -12,13 +12,11 @@ const extractUrlData = () => {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
const [rawVersion, format, ...chunks] = hash.split("/");
|
const [format, ...chunks] = hash.slice(1).split("/");
|
||||||
|
|
||||||
const version = Number((rawVersion.match(/\d+/g) ?? [])[0]);
|
|
||||||
const data = chunks.join("/");
|
const data = chunks.join("/");
|
||||||
|
|
||||||
return {
|
return {
|
||||||
version,
|
|
||||||
pgn: format === "pgn" ? decompressPGN(data) : "",
|
pgn: format === "pgn" ? decompressPGN(data) : "",
|
||||||
fen: format === "fen" ? decodeURI(data) : "",
|
fen: format === "fen" ? decodeURI(data) : "",
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -115,7 +115,7 @@ const Share: Component<{ handlers: Handlers }> = (props) => {
|
|||||||
<button
|
<button
|
||||||
class="share__btn share__btn--right"
|
class="share__btn share__btn--right"
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
const link = `${location.origin}/#v1/fen/${encodeURI(state.fen)}`;
|
const link = `${location.origin}/#fen/${encodeURI(state.fen)}`;
|
||||||
navigator.clipboard.writeText(link);
|
navigator.clipboard.writeText(link);
|
||||||
blinkCopy("fen-link");
|
blinkCopy("fen-link");
|
||||||
}}
|
}}
|
||||||
@@ -219,7 +219,10 @@ const Share: Component<{ handlers: Handlers }> = (props) => {
|
|||||||
const data = new Blob([state.pgn], {
|
const data = new Blob([state.pgn], {
|
||||||
type: "application/vnd.chess-pgn;charset=utf-8",
|
type: "application/vnd.chess-pgn;charset=utf-8",
|
||||||
});
|
});
|
||||||
download(data, "pgn", "pgn");
|
const name = state.game.getFileName(
|
||||||
|
state.boardConfig.anonymous
|
||||||
|
);
|
||||||
|
download(data, name, "pgn");
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
Export PGN
|
Export PGN
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ const download = (data: string | Blob, name: string, ext: string) => {
|
|||||||
|
|
||||||
const link = document.createElement("a");
|
const link = document.createElement("a");
|
||||||
link.href = url;
|
link.href = url;
|
||||||
link.download = `${name}_${Date.now()}.${ext}`;
|
link.download = `${name}.${ext}`;
|
||||||
link.target = "_blank";
|
link.target = "_blank";
|
||||||
link.click();
|
link.click();
|
||||||
URL.revokeObjectURL(url);
|
URL.revokeObjectURL(url);
|
||||||
|
|||||||
Reference in New Issue
Block a user