Skip to content

Commit d1b91ef

Browse files
LittleBitUAclaude
andcommitted
v1.1.0 — Monaco Editor, модульна архітектура, підтримка збірки Linux/macOS
- Інтегровано Monaco Editor з підсвіткою синтаксису та спелчекером - Розбито renderer.js/styles.css на модулі (src/, styles/) - Додано build.js для збірки з чанків - Оновлено іконки, покращено UI (панелі, теми, знаходження) - Додано GitHub Actions workflow для збірки Windows/Linux/macOS - Поповнено глосарій (Heaven's Golf → «Гевенс Ґольф») Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent 92b645a commit d1b91ef

41 files changed

Lines changed: 14922 additions & 241 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/release.yml

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
name: Build & Release
2+
3+
on:
4+
push:
5+
tags:
6+
- 'v*'
7+
8+
permissions:
9+
contents: write
10+
11+
jobs:
12+
build-windows:
13+
runs-on: windows-latest
14+
steps:
15+
- uses: actions/checkout@v4
16+
- uses: actions/setup-node@v4
17+
with:
18+
node-version: '20'
19+
- run: npm ci
20+
- run: node build.js
21+
- run: npx electron-builder --win --publish never
22+
- uses: actions/upload-artifact@v4
23+
with:
24+
name: dist-win
25+
path: |
26+
dist/LB.exe
27+
dist/LB-Setup.exe
28+
29+
build-linux:
30+
runs-on: ubuntu-latest
31+
steps:
32+
- uses: actions/checkout@v4
33+
- uses: actions/setup-node@v4
34+
with:
35+
node-version: '20'
36+
- run: npm ci
37+
- run: node build.js
38+
- run: npx electron-builder --linux --publish never
39+
- uses: actions/upload-artifact@v4
40+
with:
41+
name: dist-linux
42+
path: dist/LB-linux.AppImage
43+
44+
build-macos:
45+
runs-on: macos-latest
46+
steps:
47+
- uses: actions/checkout@v4
48+
- uses: actions/setup-node@v4
49+
with:
50+
node-version: '20'
51+
- name: Generate macOS icon
52+
run: |
53+
mkdir -p build/icon.iconset
54+
sips -z 16 16 build/icon.png --out build/icon.iconset/icon_16x16.png
55+
sips -z 32 32 build/icon.png --out build/icon.iconset/icon_32x32.png
56+
sips -z 64 64 build/icon.png --out build/icon.iconset/icon_32x32@2x.png
57+
sips -z 128 128 build/icon.png --out build/icon.iconset/icon_128x128.png
58+
sips -z 256 256 build/icon.png --out build/icon.iconset/icon_256x256.png
59+
sips -z 512 512 build/icon.png --out build/icon.iconset/icon_512x512.png
60+
sips -z 1024 1024 build/icon.png --out build/icon.iconset/icon_512x512@2x.png
61+
iconutil -c icns build/icon.iconset -o build/icon.icns
62+
- run: npm ci
63+
- run: node build.js
64+
- run: npx electron-builder --mac --publish never
65+
env:
66+
CSC_IDENTITY_AUTO_DISCOVERY: false
67+
- uses: actions/upload-artifact@v4
68+
with:
69+
name: dist-mac
70+
path: dist/LB-mac.dmg
71+
72+
release:
73+
needs: [build-windows, build-linux, build-macos]
74+
runs-on: ubuntu-latest
75+
steps:
76+
- uses: actions/download-artifact@v4
77+
with:
78+
path: artifacts
79+
merge-multiple: true
80+
- uses: softprops/action-gh-release@v2
81+
with:
82+
files: artifacts/*
83+
draft: false
84+
prerelease: false

build.js

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
// Build script: concatenates chunks back into monolith files.
2+
// src/01-head.js … src/18-init.js → renderer.js
3+
// styles/01-themes.css … styles/11-effects.css → styles.css
4+
const fs = require('fs');
5+
const path = require('path');
6+
7+
function concat(dir, pattern, outFile) {
8+
const files = fs.readdirSync(path.join(__dirname, dir))
9+
.filter(f => pattern.test(f))
10+
.sort();
11+
if (files.length === 0) {
12+
console.error(`No ${dir}/ chunks found!`);
13+
process.exit(1);
14+
}
15+
const parts = files.map(f =>
16+
fs.readFileSync(path.join(__dirname, dir, f), 'utf-8')
17+
);
18+
const combined = parts.join('\n') + '\n';
19+
fs.writeFileSync(path.join(__dirname, outFile), combined);
20+
const lineCount = combined.split('\n').length;
21+
console.log(`${outFile}: ${files.length} chunks → ${lineCount} lines`);
22+
}
23+
24+
concat('src', /^\d{2}-.*\.js$/, 'renderer.js');
25+
concat('styles', /^\d{2}-.*\.css$/, 'styles.css');

build/icon.ico

269 KB
Binary file not shown.

build/icon.png

16.5 KB
Loading

editor_glossary.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -936,5 +936,7 @@
936936
"Judge Creep 'n Peep": "суддя Підглядайло-Знімайло",
937937
"Edison": "«Едісон»",
938938
"Cloudy Skies Publishing": "видавництво «Cloudy Skies»",
939-
"Shackled Hearts": "Закуті серця"
939+
"Shackled Hearts": "Закуті серця",
940+
"Dragon Boost": "«Підсилення Дракона»",
941+
"Heaven's Golf": "«Гевенс Ґольф»"
940942
}

index.html

Lines changed: 76 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -123,19 +123,34 @@ <h2 class="welcome-section-title">Останні файли</h2>
123123
<span class="tb-sep"></span>
124124
<button class="tb-btn tb-icon-undo" id="tb-undo" title="Скасувати (Ctrl+Z)"></button>
125125
<button class="tb-btn tb-icon-redo" id="tb-redo" title="Повторити (Ctrl+Y)"></button>
126+
<span class="tb-sep"></span>
127+
<button class="tb-btn tb-icon-side-panel" id="tb-side-panel" title="Відкрити збоку"></button>
126128
</div>
127129

128130
<div id="tab-bar"></div>
129131

130-
<div id="flat-editor-container">
131-
<div id="flat-monaco" class="monaco-container"></div>
132-
</div>
132+
<div id="editor-area">
133+
<div id="editor-main">
134+
<div id="flat-editor-container">
135+
<div id="flat-monaco" class="monaco-container"></div>
136+
</div>
137+
138+
<div id="split-editor-container" style="display:none;">
139+
<label class="editor-label">Text</label>
140+
<div id="text-monaco" class="monaco-container" style="flex:3;"></div>
141+
<label class="editor-label">Speakers</label>
142+
<div id="sp-monaco" class="monaco-container" style="flex:1;"></div>
143+
</div>
144+
</div>
133145

134-
<div id="split-editor-container" style="display:none;">
135-
<label class="editor-label">Text</label>
136-
<div id="text-monaco" class="monaco-container" style="flex:3;"></div>
137-
<label class="editor-label">Speakers</label>
138-
<div id="sp-monaco" class="monaco-container" style="flex:1;"></div>
146+
<div id="side-panel-handle" class="hidden"></div>
147+
<div id="side-panel" class="hidden">
148+
<div class="side-panel-header">
149+
<span class="side-panel-title" id="side-panel-title"></span>
150+
<button class="side-panel-close" id="side-panel-close" title="Закрити">&times;</button>
151+
</div>
152+
<div id="side-panel-monaco" class="monaco-container"></div>
153+
</div>
139154
</div>
140155
</div>
141156
</div>
@@ -287,10 +302,6 @@ <h3>Налаштування</h3>
287302
<label>Інтервал (сек):</label>
288303
<input type="number" id="set-interval" min="10" value="30">
289304
</div>
290-
<div class="form-row">
291-
<label>Бекап:</label>
292-
<label><input type="checkbox" id="set-backup" checked> .bak перед збереженням</label>
293-
</div>
294305
<div class="form-row">
295306
<label>Періодичний бекап:</label>
296307
<label><input type="checkbox" id="set-periodic-backup"> Увімкнено</label>
@@ -716,9 +727,43 @@ <h3>Схема підрахунку</h3>
716727
<option value="json">JSON</option>
717728
<option value="xml">XML</option>
718729
<option value="keyvalue">Key=Value</option>
730+
<option value="csv">CSV</option>
719731
</select>
720732
<button id="schema-reparse-btn" class="schema-reparse-btn" title="Перечитати з обраним типом">&#x21bb;</button>
721733
</div>
734+
<div class="schema-custom-section" id="schema-custom-section">
735+
<div class="schema-custom-header">
736+
<span class="schema-custom-title">Власні схеми (regex):</span>
737+
<button id="schema-custom-add" class="btn-sm" title="Додати regex-схему">+</button>
738+
</div>
739+
<div id="schema-custom-list"></div>
740+
<div id="schema-custom-editor" class="schema-custom-editor hidden">
741+
<div class="schema-custom-row">
742+
<label>Назва:</label>
743+
<input type="text" id="schema-custom-name" placeholder="Напр. Key=Value" maxlength="40">
744+
</div>
745+
<div class="schema-custom-row">
746+
<label>Regex:</label>
747+
<input type="text" id="schema-custom-regex" placeholder="^[^=]+=(.*)$" style="font-family:monospace">
748+
</div>
749+
<div class="schema-custom-row">
750+
<label>Capture group:</label>
751+
<input type="number" id="schema-custom-group" value="1" min="0" max="9" style="width:60px">
752+
</div>
753+
<div id="schema-custom-preview" class="schema-custom-preview hidden"></div>
754+
<div class="schema-custom-actions">
755+
<button class="btn-primary btn-sm" id="schema-custom-save-btn">Зберегти схему</button>
756+
<button class="btn-sm" id="schema-custom-cancel-btn">Скасувати</button>
757+
</div>
758+
</div>
759+
<div id="schema-custom-apply-row" class="schema-custom-apply hidden">
760+
<label>Застосувати до файлу:</label>
761+
<select id="schema-custom-select">
762+
<option value="">— не обрано —</option>
763+
</select>
764+
<button class="btn-sm btn-primary" id="schema-custom-apply-btn">Застосувати</button>
765+
</div>
766+
</div>
722767
<div class="schema-hint">Оберіть поля, які містять текст для перекладу:</div>
723768
<input type="text" id="schema-search" class="schema-search" placeholder="Пошук ключа...">
724769
<div class="schema-tree" id="schema-tree"></div>
@@ -776,11 +821,24 @@ <h4 style="margin:0 0 6px;">Одиниці вимірювання (без кра
776821
</div>
777822

778823
<h4 style="margin:0 0 6px;">Дефіс і скісна риска</h4>
779-
<ul style="margin:0; padding-left:20px;">
824+
<ul style="margin:0 0 12px; padding-left:20px;">
780825
<li>Пропущена середина — дефіс без крапки: гр-н, вид-во, ін-т, ун-т, р-н</li>
781826
<li>Складні слова — букви частин з крапкою: с.-д., с.-г., ст.-сл., півн.-сх.</li>
782827
<li>Скісна риска без крапок: п/в, а/с, р/р, км/год, м/хв</li>
783828
</ul>
829+
830+
<h4 style="margin:0 0 6px;">Збіг розділових знаків</h4>
831+
<ul style="margin:0; padding-left:20px;">
832+
<li><b>, —</b> (кома й тире) ставимо:
833+
<ul style="padding-left:18px;">
834+
<li>у реченнях з прямою мовою та мовою автора;</li>
835+
<li>у межах речень з випущеними членами та з відокремленими і вставленими конструкціями, у складних реченнях, коли — за наявності тире — кома має закривати попередню конструкцію (<i>З одного боку, це ніби й не так, а з другого, — факти частково підтвердилися</i>);</li>
836+
<li>для увиразнення протиставлення: перед указівними словами <i>це, так, такий</i> і под. на початку другої частини речення.</li>
837+
</ul>
838+
</li>
839+
<li>Збіг різних знаків у реченнях з конструкціями у дужках.</li>
840+
<li>Збіг різних знаків у реченнях з прямою мовою та мовою автора.</li>
841+
</ul>
784842
</div>
785843
<div class="modal-footer">
786844
<button id="ref-close-btn">Закрити</button>
@@ -948,6 +1006,11 @@ <h3>Закладки</h3>
9481006
<div class="ctx-sep"></div>
9491007
<div class="ctx-item" id="ctx-bookmark"><span class="ctx-dot ctx-dot-bookmark"></span> Закладка</div>
9501008
<div class="ctx-item" id="ctx-entry-history">Історія змін&#x2026;</div>
1009+
<div class="ctx-sep hidden" id="ctx-discard-sep"></div>
1010+
<div class="ctx-item ctx-danger hidden" id="ctx-discard">Відкинути зміни</div>
1011+
<div class="ctx-item ctx-muted hidden" id="ctx-restore">Повернути зміни</div>
1012+
<div class="ctx-sep" id="ctx-side-sep"></div>
1013+
<div class="ctx-item" id="ctx-open-side">Відкрити збоку</div>
9511014
<div class="ctx-sep" id="ctx-compare-sep"></div>
9521015
<div class="ctx-item" id="ctx-compare">Порівняти&#x2026;</div>
9531016
<div class="ctx-item hidden" id="ctx-compare-cancel">Скасувати порівняння</div>

0 commit comments

Comments
 (0)