Skip to content

Commit 540d761

Browse files
committed
Release 10.0.0
1 parent a7df886 commit 540d761

35 files changed

Lines changed: 1207 additions & 60 deletions

.github/workflows/ci.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,10 @@ jobs:
3535
shell: cmd
3636
run: gradlew.bat clean check buildPlugin --no-daemon --console=plain --no-build-cache --rerun-tasks
3737

38+
- name: Core performance benchmarks
39+
shell: cmd
40+
run: gradlew.bat corePerformance --no-daemon --console=plain --no-build-cache --rerun-tasks
41+
3842
- name: Upload coverage to Codecov
3943
uses: codecov/codecov-action@v7
4044
with:

.github/workflows/release.yml

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ jobs:
5454

5555
- name: Build, verify, and package
5656
shell: cmd
57-
run: gradlew.bat clean check verifyPlugin buildPlugin "-PpluginVersion=${{ needs.version.outputs.version }}" -PverifyRecommendedIdes=false -PverifyAllJetBrainsIdes=false --no-daemon --console=plain --no-build-cache --rerun-tasks
57+
run: gradlew.bat clean check corePerformance verifyPlugin buildPlugin "-PpluginVersion=${{ needs.version.outputs.version }}" -PverifyRecommendedIdes=false -PverifyAllJetBrainsIdes=false --no-daemon --console=plain --no-build-cache --rerun-tasks
5858

5959
- name: Upload package artifact
6060
uses: actions/upload-artifact@v4
@@ -100,18 +100,18 @@ jobs:
100100
101101
## What's Changed
102102
103-
- Supersedes 8.5.0 as the current stable release.
104-
- Use one non-conflicting default shortcut scheme across JetBrains IDEs and Notepad++: Tab plus Ctrl+Alt+Shift command shortcuts.
103+
- Supersedes 9.0.0 as the current stable release.
104+
- Added localized action names, menu text, dialogs, and user messages for 20 popular locales.
105+
- Improved large-table performance by reducing table parsing, display-width, and formatting overhead.
106+
- Added release-blocking Java/C++ core performance benchmarks to CI.
107+
- Preserved Java/C++ core parity for trimmed pipe rows, escaped pipes, Unicode/CJK width, CSV/TSV conversion, sorting, and row/column edits.
108+
- Kept the non-conflicting Tab plus Ctrl+Alt+Shift shortcut scheme from 9.0.0.
105109
- Built the JetBrains IDE plugin package on GitHub Actions.
106-
- Convert CSV/TSV directly from the current multi-line block when there is no selection.
107-
- Avoid converting adjacent plain text, single comma notes, quoted comma-only cells, and plain multi-line text as CSV.
108-
- Reject pipe-only separator rows while still accepting dash and equals Markdown separator rules.
109-
- Added shared Java/C++ golden fixture coverage for escaped JSON Unicode, multilingual width, and emoji cluster alignment.
110110
- Included SHA-256 sums for release verification.
111111
112112
## Validation
113113
114-
- GitHub Actions release build completed with smoke tests.
114+
- GitHub Actions release build completed with smoke tests, coverage checks, baseline Plugin Verifier, and core performance benchmarks.
115115
EOF
116116
117117
assets=("${files[@]}" SHA256SUMS.txt)

MARKETPLACE_SUBMISSION.md

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,20 @@ Status: release metadata for version `@PLUGIN_VERSION@`; generated from Gradle's
3333

3434
Edit Markdown pipe tables directly in JetBrains IDEs: align with Tab, sort rows, convert CSV/TSV, insert tables by size, and manage rows or columns without leaving the editor.
3535

36+
## Marketplace update text
37+
38+
Use this for the JetBrains Marketplace version notes for `@PLUGIN_VERSION@` if the upload flow asks for release text:
39+
40+
```html
41+
<ul>
42+
<li>Added localized action names, menu text, dialogs, and user messages for 20 popular locales.</li>
43+
<li>Improved large-table performance by reducing table parsing, display-width, and formatting overhead.</li>
44+
<li>Added release-blocking Java/C++ core performance benchmarks to CI.</li>
45+
<li>Preserved Java/C++ core parity for trimmed pipe rows, escaped pipes, Unicode/CJK width, CSV/TSV conversion, sorting, and row/column edits.</li>
46+
<li>Kept the non-conflicting Tab plus Ctrl+Alt+Shift shortcut scheme from 9.0.0.</li>
47+
</ul>
48+
```
49+
3650
## Manual submission
3751

3852
1. Log in to JetBrains Marketplace.

README.en.md

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
[![CI](https://github.com/krotname/IdeaMarkdownTableEditor/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/krotname/IdeaMarkdownTableEditor/actions/workflows/ci.yml)
44
[![Release](https://img.shields.io/github/v/release/krotname/IdeaMarkdownTableEditor?label=release)](https://github.com/krotname/IdeaMarkdownTableEditor/releases/latest)
5-
[![Core coverage](https://img.shields.io/badge/core%20coverage-91.93%25-brightgreen)](build.gradle.kts)
5+
[![Core coverage](https://img.shields.io/badge/core%20coverage-91.60%25-brightgreen)](build.gradle.kts)
66
[![JetBrains Marketplace](https://img.shields.io/jetbrains/plugin/v/32159?label=JetBrains%20Marketplace)](https://plugins.jetbrains.com/plugin/32159-markdown-table-editor)
77
[![JetBrains downloads](https://img.shields.io/jetbrains/plugin/d/32159?label=JetBrains%20downloads)](https://plugins.jetbrains.com/plugin/32159-markdown-table-editor)
88
[![Website](https://img.shields.io/badge/website-markdowntableeditor.krot.name-0f766e)](https://markdowntableeditor.krot.name/)
@@ -29,6 +29,7 @@ The GIF is built from real JetBrains IDE screenshots on Windows: a regular `.md`
2929
- `Tab`, sorting, and row or column operations save manual spacing work.
3030
- CSV/TSV text can be converted into a clean Markdown table quickly.
3131
- Commands are available from the `Tools` menu, the editor context menu, and IDE action search.
32+
- Action names, dialogs, and messages are localized for popular IDE locales.
3233

3334
## Features
3435

@@ -44,6 +45,7 @@ The GIF is built from real JetBrains IDE screenshots on Windows: a regular `.md`
4445
- Insert a new table with a selected number of columns and rows.
4546
- Preserve Markdown alignment markers: `---`, `:---`, `---:`, `:---:`.
4647
- Correctly handle escaped pipes: `\|`.
48+
- Large-table operations are optimized and guarded by dedicated CI performance benchmarks.
4749

4850
## Installation
4951

@@ -165,6 +167,12 @@ For JaCoCo coverage:
165167

166168
The HTML report is written to `build/reports/coverage/html`.
167169

170+
Core performance benchmarks:
171+
172+
```cmd
173+
.\gradlew.bat corePerformance
174+
```
175+
168176
Full release build:
169177

170178
```cmd

README.md

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
[![CI](https://github.com/krotname/IdeaMarkdownTableEditor/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/krotname/IdeaMarkdownTableEditor/actions/workflows/ci.yml)
44
[![Release](https://img.shields.io/github/v/release/krotname/IdeaMarkdownTableEditor?label=release)](https://github.com/krotname/IdeaMarkdownTableEditor/releases/latest)
5-
[![Core coverage](https://img.shields.io/badge/core%20coverage-91.93%25-brightgreen)](build.gradle.kts)
5+
[![Core coverage](https://img.shields.io/badge/core%20coverage-91.60%25-brightgreen)](build.gradle.kts)
66
[![JetBrains Marketplace](https://img.shields.io/jetbrains/plugin/v/32159?label=JetBrains%20Marketplace)](https://plugins.jetbrains.com/plugin/32159-markdown-table-editor)
77
[![JetBrains downloads](https://img.shields.io/jetbrains/plugin/d/32159?label=JetBrains%20downloads)](https://plugins.jetbrains.com/plugin/32159-markdown-table-editor)
88
[![Website](https://img.shields.io/badge/website-markdowntableeditor.krot.name-0f766e)](https://markdowntableeditor.krot.name/)
@@ -29,6 +29,7 @@ GIF собран из реальных скриншотов IDE JetBrains под
2929
- `Tab`, сортировка и операции со строками/колонками экономят ручное выравнивание.
3030
- CSV/TSV можно быстро превратить в аккуратную Markdown-таблицу.
3131
- Команды доступны из меню `Tools`, контекстного меню редактора и поиска действий IDE.
32+
- Названия команд, диалоги и сообщения локализованы для популярных языков IDE.
3233

3334
## Возможности
3435

@@ -44,6 +45,7 @@ GIF собран из реальных скриншотов IDE JetBrains под
4445
- Вставка новой таблицы с выбранным числом колонок и строк.
4546
- Сохранение Markdown-маркеров выравнивания: `---`, `:---`, `---:`, `:---:`.
4647
- Корректная обработка escaped pipes: `\|`.
48+
- Оптимизирована работа с большими таблицами; отдельные performance benchmarks входят в CI.
4749

4850
## Установка
4951

@@ -165,6 +167,12 @@ Marketplace вычисляет конкретные версии продукт
165167

166168
HTML-отчет появится в `build/reports/coverage/html`.
167169

170+
Performance benchmarks ядра:
171+
172+
```cmd
173+
.\gradlew.bat corePerformance
174+
```
175+
168176
Полный релизный build:
169177

170178
```cmd

VERSION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
9.0.0
1+
10.0.0

build.gradle.kts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,9 @@ val processedPluginXmlPath = layout.buildDirectory.file("resources/main/META-INF
237237
val marketplaceSubmissionTemplate = layout.projectDirectory.file("MARKETPLACE_SUBMISSION.md")
238238
val generatedMarketplaceSubmission = layout.buildDirectory.file("release/MARKETPLACE_SUBMISSION.md")
239239
val goldenFixtureFile = layout.projectDirectory.file("test-fixtures/markdown-table-core-golden.json")
240+
val corePerformanceThresholdScale = providers.gradleProperty("corePerformanceThresholdScale")
241+
.orElse(providers.environmentVariable("CORE_PERFORMANCE_THRESHOLD_SCALE"))
242+
.orElse("1.0")
240243
val coreCoverageClassDirectories = layout.buildDirectory.dir("instrumented/instrumentCode").map {
241244
fileTree(it) {
242245
include("name/krot/markdowntableidea/core/MarkdownTableCore*.class")
@@ -280,6 +283,24 @@ tasks.named<Test>("test") {
280283
}
281284
}
282285

286+
val corePerformance by tasks.registering(Test::class) {
287+
group = LifecycleBasePlugin.VERIFICATION_GROUP
288+
description = "Runs core performance benchmarks with time thresholds."
289+
useJUnitPlatform()
290+
include("**/*Performance.class")
291+
failOnNoDiscoveredTests = true
292+
testClassesDirs = sourceSets["test"].output.classesDirs
293+
classpath = sourceSets["test"].runtimeClasspath
294+
workingDir = projectDir
295+
shouldRunAfter(tasks.named("test"))
296+
systemProperty("corePerformanceThresholdScale", corePerformanceThresholdScale.get())
297+
outputs.upToDateWhen { false }
298+
testLogging {
299+
events("passed", "failed", "skipped")
300+
showStandardStreams = true
301+
}
302+
}
303+
283304
val jarTask = tasks.named<Jar>("jar") {
284305
from(layout.projectDirectory.file("LICENSE")) {
285306
into("META-INF")

src/main/java/name/krot/markdowntableidea/MarkdownTableActions.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,8 @@ private static final class IdeDialogService implements DialogService {
3636
public String askTableSize(com.intellij.openapi.project.Project project) {
3737
return Messages.showInputDialog(
3838
project,
39-
"Введите размер: столбцы x строки данных, например 3x4.",
40-
"Новая Markdown-таблица",
39+
MarkdownTableEditorBundle.message("dialog.insertTable.prompt"),
40+
MarkdownTableEditorBundle.message("dialog.insertTable.title"),
4141
Messages.getQuestionIcon(),
4242
"3x3",
4343
null
@@ -46,7 +46,7 @@ public String askTableSize(com.intellij.openapi.project.Project project) {
4646

4747
@Override
4848
public void showError(com.intellij.openapi.project.Project project, String message) {
49-
Messages.showErrorDialog(project, message, "Markdown Table Editor");
49+
Messages.showErrorDialog(project, message, MarkdownTableEditorBundle.message("plugin.name"));
5050
}
5151
}
5252

@@ -197,14 +197,14 @@ public void actionPerformed(AnActionEvent event) {
197197

198198
Matcher matcher = TABLE_SIZE.matcher(value);
199199
if (!matcher.matches()) {
200-
dialogService.showError(event.getProject(), "Введите размер в формате 3x4.");
200+
dialogService.showError(event.getProject(), MarkdownTableEditorBundle.message("dialog.insertTable.error.format"));
201201
return;
202202
}
203203

204204
int columns = Integer.parseInt(matcher.group(1));
205205
int dataRows = Integer.parseInt(matcher.group(2));
206206
if (columns < 1 || columns > 50 || dataRows < 0 || dataRows > 200) {
207-
dialogService.showError(event.getProject(), "Допустимо: 1-50 столбцов и 0-200 строк данных.");
207+
dialogService.showError(event.getProject(), MarkdownTableEditorBundle.message("dialog.insertTable.error.range"));
208208
return;
209209
}
210210

src/main/java/name/krot/markdowntableidea/MarkdownTableEditor.java

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
import java.util.List;
1919

2020
public final class MarkdownTableEditor {
21-
private static final String COMMAND_NAME = "Markdown Table Editor";
2221
private static CommandRunner commandRunner = MarkdownTableEditor::runWriteCommand;
2322

2423
private MarkdownTableEditor() {
@@ -56,15 +55,15 @@ public static boolean run(Editor editor, Project project, MarkdownTableCore.Acti
5655
String currentLineText = getLineText(document, currentLine);
5756
if (!MarkdownTableCore.isPotentialTableLine(currentLineText)) {
5857
if (!quiet) {
59-
Messages.showInfoMessage(project, "Put the caret inside a Markdown pipe table first.", COMMAND_NAME);
58+
Messages.showInfoMessage(project, MarkdownTableEditorBundle.message("message.putCaretInsideTable"), commandName());
6059
}
6160
return false;
6261
}
6362

6463
LineRange tableRange = findTableLineRange(document, currentLine);
6564
if (tableRange == null) {
6665
if (!quiet) {
67-
Messages.showInfoMessage(project, "Could not edit the Markdown table.", COMMAND_NAME);
66+
Messages.showInfoMessage(project, MarkdownTableEditorBundle.message("message.couldNotEditTable"), commandName());
6867
}
6968
return false;
7069
}
@@ -80,7 +79,7 @@ public static boolean run(Editor editor, Project project, MarkdownTableCore.Acti
8079
MarkdownTableCore.EditResult edit = MarkdownTableCore.apply(tableLines, row, column, action);
8180
if (!edit.ok) {
8281
if (!quiet) {
83-
Messages.showInfoMessage(project, "Could not edit the Markdown table.", COMMAND_NAME);
82+
Messages.showInfoMessage(project, MarkdownTableEditorBundle.message("message.couldNotEditTable"), commandName());
8483
}
8584
return false;
8685
}
@@ -98,7 +97,7 @@ public static boolean run(Editor editor, Project project, MarkdownTableCore.Acti
9897
editor.getScrollingModel().scrollToCaret(ScrollType.MAKE_VISIBLE);
9998
};
10099

101-
commandRunner.run(project, COMMAND_NAME, change);
100+
commandRunner.run(project, commandName(), change);
102101

103102
return true;
104103
}
@@ -135,7 +134,7 @@ public static boolean convertDelimited(Editor editor, Project project, boolean q
135134
Range range = selectedOrCurrentDelimitedBlock(editor);
136135
if (range.start >= range.end) {
137136
if (!quiet) {
138-
Messages.showInfoMessage(project, "Select CSV/TSV text or put the caret inside a CSV/TSV block first.", COMMAND_NAME);
137+
Messages.showInfoMessage(project, MarkdownTableEditorBundle.message("message.selectCsvTsv"), commandName());
139138
}
140139
return false;
141140
}
@@ -144,7 +143,7 @@ public static boolean convertDelimited(Editor editor, Project project, boolean q
144143
MarkdownTableCore.EditResult edit = MarkdownTableCore.fromDelimited(source);
145144
if (!edit.ok) {
146145
if (!quiet) {
147-
Messages.showInfoMessage(project, "Could not convert the selected CSV/TSV text.", COMMAND_NAME);
146+
Messages.showInfoMessage(project, MarkdownTableEditorBundle.message("message.couldNotConvertCsvTsv"), commandName());
148147
}
149148
return false;
150149
}
@@ -168,7 +167,7 @@ public static boolean insertTable(Editor editor, Project project, int columns, i
168167

169168
MarkdownTableCore.EditResult edit = MarkdownTableCore.newTable(columns, dataRows);
170169
if (!edit.ok) {
171-
Messages.showInfoMessage(project, "Could not create a Markdown table.", COMMAND_NAME);
170+
Messages.showInfoMessage(project, MarkdownTableEditorBundle.message("message.couldNotCreateTable"), commandName());
172171
return false;
173172
}
174173

@@ -363,7 +362,7 @@ private static void replaceRange(Editor editor, Project project, int start, int
363362
editor.getScrollingModel().scrollToCaret(ScrollType.MAKE_VISIBLE);
364363
};
365364

366-
commandRunner.run(project, COMMAND_NAME, change);
365+
commandRunner.run(project, commandName(), change);
367366
}
368367

369368
private static void runWriteCommand(Project project, String name, Runnable change) {
@@ -374,6 +373,10 @@ private static void runWriteCommand(Project project, String name, Runnable chang
374373
}
375374
}
376375

376+
private static String commandName() {
377+
return MarkdownTableEditorBundle.message("plugin.name");
378+
}
379+
377380
private static InsertText tableInsertText(Document document, int start, int end, String table, String eol) {
378381
StringBuilder text = new StringBuilder();
379382
int caretDelta = 0;
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
// SPDX-License-Identifier: MIT
2+
// Copyright (c) 2026 krotname
3+
4+
package name.krot.markdowntableidea;
5+
6+
import com.intellij.DynamicBundle;
7+
8+
public final class MarkdownTableEditorBundle extends DynamicBundle {
9+
private static final String BUNDLE = "messages.MarkdownTableEditorBundle";
10+
private static final MarkdownTableEditorBundle INSTANCE = new MarkdownTableEditorBundle();
11+
12+
private MarkdownTableEditorBundle() {
13+
super(BUNDLE);
14+
}
15+
16+
public static String message(String key, Object... params) {
17+
return INSTANCE.getMessage(key, params);
18+
}
19+
}

0 commit comments

Comments
 (0)