This commit is contained in:
parent
48acbf6e00
commit
0e75b24a7a
10
CHANGELOG.md
10
CHANGELOG.md
@ -9,6 +9,13 @@ Follows [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) · versioned wi
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
## [1.45.0] — 2026-09-22
|
||||||
|
|
||||||
|
### Added
|
||||||
|
- **Magazine: Title/Author auto-fill from a Headline or Author region.** A newly drawn Headline or Author region, or one retyped from the picker, now fills the article's Title/Author field automatically instead of requiring "Pick from page" by hand — only when that field is still empty, so it never overwrites something already typed or picked.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## [1.44.0] — 2026-09-22
|
## [1.44.0] — 2026-09-22
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
@ -4328,7 +4335,8 @@ Initial feature-complete release.
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
[Unreleased]: https://github.com/mARTin-B78/tts-voice-creator-clone-and-design-2/compare/v1.44.0...HEAD
|
[Unreleased]: https://github.com/mARTin-B78/tts-voice-creator-clone-and-design-2/compare/v1.45.0...HEAD
|
||||||
|
[1.45.0]: https://github.com/mARTin-B78/tts-voice-creator-clone-and-design-2/compare/v1.44.0...v1.45.0
|
||||||
[1.44.0]: https://github.com/mARTin-B78/tts-voice-creator-clone-and-design-2/compare/v1.43.1...v1.44.0
|
[1.44.0]: https://github.com/mARTin-B78/tts-voice-creator-clone-and-design-2/compare/v1.43.1...v1.44.0
|
||||||
[1.43.1]: https://github.com/mARTin-B78/tts-voice-creator-clone-and-design-2/compare/v1.43.0...v1.43.1
|
[1.43.1]: https://github.com/mARTin-B78/tts-voice-creator-clone-and-design-2/compare/v1.43.0...v1.43.1
|
||||||
[1.26.10]: https://github.com/mARTin-B78/tts-voice-creator-clone-and-design-2/compare/v1.26.9...v1.26.10
|
[1.26.10]: https://github.com/mARTin-B78/tts-voice-creator-clone-and-design-2/compare/v1.26.9...v1.26.10
|
||||||
|
|||||||
@ -10,7 +10,7 @@
|
|||||||
<meta name="format-detection" content="telephone=no">
|
<meta name="format-detection" content="telephone=no">
|
||||||
<meta name="color-scheme" content="light dark">
|
<meta name="color-scheme" content="light dark">
|
||||||
<meta name="theme-color" content="#2563EB">
|
<meta name="theme-color" content="#2563EB">
|
||||||
<meta name="app-version" content="1.44.0">
|
<meta name="app-version" content="1.45.0">
|
||||||
<link rel="manifest" href="/manifest.webmanifest">
|
<link rel="manifest" href="/manifest.webmanifest">
|
||||||
<link rel="icon" href="/static/icon.svg" type="image/svg+xml">
|
<link rel="icon" href="/static/icon.svg" type="image/svg+xml">
|
||||||
<link rel="apple-touch-icon" href="/static/icon.svg">
|
<link rel="apple-touch-icon" href="/static/icon.svg">
|
||||||
@ -27,12 +27,12 @@
|
|||||||
|
|
||||||
<!-- ── Core styles (local — no CDN dependency for first paint) ────────── -->
|
<!-- ── Core styles (local — no CDN dependency for first paint) ────────── -->
|
||||||
<link rel="stylesheet" href="/static/vendor/mdi/materialdesignicons.min.css">
|
<link rel="stylesheet" href="/static/vendor/mdi/materialdesignicons.min.css">
|
||||||
<link rel="stylesheet" href="/static/style.css?v=1.44.0">
|
<link rel="stylesheet" href="/static/style.css?v=1.45.0">
|
||||||
<link rel="stylesheet" href="/static/css/resource-diagnostics.css?v=1.44.0">
|
<link rel="stylesheet" href="/static/css/resource-diagnostics.css?v=1.45.0">
|
||||||
<link rel="stylesheet" href="/static/css/background-jobs.css?v=1.44.0">
|
<link rel="stylesheet" href="/static/css/background-jobs.css?v=1.45.0">
|
||||||
<link rel="stylesheet" href="/static/css/voice-design.css?v=1.44.0">
|
<link rel="stylesheet" href="/static/css/voice-design.css?v=1.45.0">
|
||||||
<link rel="stylesheet" href="/static/css/rehearser.css?v=1.44.0">
|
<link rel="stylesheet" href="/static/css/rehearser.css?v=1.45.0">
|
||||||
<link rel="stylesheet" href="/static/css/audiobook.css?v=1.44.0">
|
<link rel="stylesheet" href="/static/css/audiobook.css?v=1.45.0">
|
||||||
|
|
||||||
|
|
||||||
<!-- ── Flag icons — non-blocking (loaded async, icons appear after JS) ── -->
|
<!-- ── Flag icons — non-blocking (loaded async, icons appear after JS) ── -->
|
||||||
@ -403,7 +403,7 @@ window.toggleNavTree = function(treeId, chevronId) {
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<!-- loader.js: fetches sections → loads JS modules → removes skeleton -->
|
<!-- loader.js: fetches sections → loads JS modules → removes skeleton -->
|
||||||
<script src="/static/loader.js?v=1.44.0"></script>
|
<script src="/static/loader.js?v=1.45.0"></script>
|
||||||
|
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@ -1282,6 +1282,36 @@ function renderReview() {
|
|||||||
if (state.selectMode) magSelectRefresh();
|
if (state.selectMode) magSelectRefresh();
|
||||||
setupMagDrawing();
|
setupMagDrawing();
|
||||||
setupMagBoxEdit();
|
setupMagBoxEdit();
|
||||||
|
magReviewAutofillTitleAuthor();
|
||||||
|
}
|
||||||
|
|
||||||
|
// A Headline or Author region belonging to this article is exactly what its
|
||||||
|
// own Title/Author field should say -- confirmed live, they matched
|
||||||
|
// perfectly for a headline detected at ingestion, but nothing kept them in
|
||||||
|
// sync afterward: retyping a region to Author, or drawing a new Headline
|
||||||
|
// region by hand, left the fields blank until "Pick from page" was used
|
||||||
|
// again by hand. Only fills an EMPTY field, so it never overwrites a
|
||||||
|
// value the reader already typed or picked deliberately.
|
||||||
|
function magReviewAutofillTitleAuthor() {
|
||||||
|
const article = state.article;
|
||||||
|
if (!article) return;
|
||||||
|
const titleInput = $('mag-rev-title');
|
||||||
|
const authorInput = $('mag-rev-author');
|
||||||
|
if ((!titleInput || titleInput.value.trim()) && (!authorInput || authorInput.value.trim())) return;
|
||||||
|
const ownIds = new Set(article.blocks || []);
|
||||||
|
const ownBlocks = (state.layout.blocks || []).filter((b) => ownIds.has(b.id));
|
||||||
|
if (titleInput && !titleInput.value.trim()) {
|
||||||
|
const block = ownBlocks.find((b) => b.type === 'title' && (b.text || '').trim());
|
||||||
|
if (block) { titleInput.value = block.text.trim(); article.title = titleInput.value; }
|
||||||
|
}
|
||||||
|
if (authorInput && !authorInput.value.trim()) {
|
||||||
|
const block = ownBlocks.find((b) => b.type === 'byline' && (b.text || '').trim());
|
||||||
|
// Same "Von "/"by " credit-prefix strip the initial ingestion pass uses
|
||||||
|
// (core/magazine.py's looks_like_byline) — approximated here since this
|
||||||
|
// runs client-side without a round trip.
|
||||||
|
const name = block ? block.text.replace(/^(von|by)\s+/i, '').trim() : '';
|
||||||
|
if (name) { authorInput.value = name; article.author = name; }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Tracks every ticked block across ALL reviewed pages of this article, not
|
// Tracks every ticked block across ALL reviewed pages of this article, not
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user