Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
168 commits
Select commit Hold shift + click to select a range
147c651
Write the run window's own notices in the IDE language
JE-Chen Sep 24, 2026
e8bfb15
Refactor: return the report mail's reasons from exception_tags
JE-Chen Sep 24, 2026
5607e56
Say why a report mail was not sent in the IDE language
JE-Chen Sep 24, 2026
d895eef
Write the exit-code line and the held-output note in the IDE language
JE-Chen Sep 24, 2026
5945284
Bring the Chinese READMEs back in line with README.md
JE-Chen Sep 24, 2026
2bb95cb
Check a trimmed diff against the plain one only on small texts
JE-Chen Sep 24, 2026
312634e
Test the diagram editor's align and distribute
JE-Chen Sep 24, 2026
8087db7
Test the property panel on a connection and an image
JE-Chen Sep 24, 2026
35aaecd
Give a new diagram node its text in the IDE language
JE-Chen Sep 24, 2026
dc0c1bc
Read no cookie file for curl -b ''
JE-Chen Sep 24, 2026
96f287e
Re-measure the line counts in architecture_explore.md
JE-Chen Sep 24, 2026
ca3f81e
Open no canvas menu at the end of a right-drag pan
JE-Chen Sep 24, 2026
9ce87fc
Bring the coverage figures in architecture_explore.md up to date
JE-Chen Sep 24, 2026
2576d92
Use Taiwan terms in the Traditional Chinese interface
JE-Chen Sep 24, 2026
6ee887b
Send Enter for an empty line on the SSH command line
JE-Chen Sep 24, 2026
f1c4ebe
Interrupt what runs in the SSH shell
JE-Chen Sep 24, 2026
531ea9d
Remember the lines sent from the SSH command line
JE-Chen Sep 24, 2026
322e9e6
Refactor: move the run window's line rewinding to terminal_view
JE-Chen Sep 24, 2026
be8f319
Redraw a progress bar's line in the SSH terminal
JE-Chen Sep 24, 2026
ed451a1
Show terminal output in a fixed-pitch font
JE-Chen Sep 24, 2026
f0858f7
Give the SSH shell the terminal's size as it is resized
JE-Chen Sep 24, 2026
058950f
Show ANSI colours in the SSH terminal
JE-Chen Sep 24, 2026
d261735
Pick terminal colours that read on the theme's background
JE-Chen Sep 24, 2026
8c0ed5f
Keep the terminal font under a theme's style sheet
JE-Chen Sep 24, 2026
567e1a0
Colour automation keywords from the theme
JE-Chen Sep 24, 2026
36aff71
Colour the diff tool's added and removed lines
JE-Chen Sep 24, 2026
800f557
Fix a doubled backslash in the diff tool's map entry
JE-Chen Sep 24, 2026
3d8cbcc
Redo the README screenshots that no longer match the IDE
JE-Chen Sep 24, 2026
8e17ac1
Redo the README screenshots whose arrow labels showed as boxes
JE-Chen Sep 24, 2026
960e5be
Wipe the SSH terminal on clear and reset
JE-Chen Sep 24, 2026
c8741d6
Correct the record on the automation keyword colours
JE-Chen Sep 24, 2026
a89cb68
Build the automation Install menu from a table
JE-Chen Sep 24, 2026
176274c
Install TestPioneer from the Install menu
JE-Chen Sep 24, 2026
0e8ccbe
Make the automation menus' HELP builder public
JE-Chen Sep 24, 2026
94f74fe
Give the TestPioneer menu a HELP submenu
JE-Chen Sep 24, 2026
630f78b
Use Taiwan terms for Help and template in Traditional Chinese
JE-Chen Sep 24, 2026
401adc2
Record the gitpython floor question
JE-Chen Sep 24, 2026
54856a9
Redo the README screenshots of the AI tabs
JE-Chen Sep 24, 2026
abfdb95
Name the chosen target on the cURL import button
JE-Chen Sep 24, 2026
cca9edd
Keep library debug records out of the Code Result panel
JE-Chen Sep 24, 2026
ae7741a
Redo the README's main window and correct its caption
JE-Chen Sep 24, 2026
855e0a9
Remove the images nothing shows
JE-Chen Sep 24, 2026
733d00d
Move the fixed-pitch font helper out of terminal_view
JE-Chen Sep 24, 2026
1956c33
Prefer Consolas to Courier New for terminal output
JE-Chen Sep 24, 2026
e69faec
Show code in the tool tabs in the fixed-pitch font
JE-Chen Sep 24, 2026
8d60e51
Tell apart labels that read the same
JE-Chen Sep 24, 2026
7aae40a
Reword the Traditional Chinese Open in editor tab button
JE-Chen Sep 24, 2026
5a5ec56
Say what the CoT review's step selector is
JE-Chen Sep 24, 2026
c0850aa
Say that the SSH terminal shows output line by line
JE-Chen Sep 24, 2026
c9a1ecd
Drop the unused ReEdgeGPT language entries
JE-Chen Sep 24, 2026
b8cc74d
Title the automation menus' Help submenu in title case
JE-Chen Sep 24, 2026
e90c3f2
Start the 2026-09-c update batch
JE-Chen Sep 24, 2026
61d7274
Use full-width punctuation in the Traditional Chinese strings
JE-Chen Sep 24, 2026
1df7476
Delete the project and SFTP trees' right-click menus once closed
JE-Chen Sep 24, 2026
490e6ef
Open the project tree's menu where it was asked for
JE-Chen Sep 24, 2026
53f8992
Delete the Mermaid import dialog once it closes
JE-Chen Sep 24, 2026
d5c266a
Show the Mermaid paste box in the fixed-pitch font
JE-Chen Sep 24, 2026
a43af33
Read PKCS#8 private keys for SSH and SFTP
JE-Chen Sep 24, 2026
6541336
Tell the user to export a PuTTY key as OpenSSH
JE-Chen Sep 24, 2026
1ff3557
Drop the private address from the SSH host placeholder
JE-Chen Sep 24, 2026
9bc5450
Show the JWT, Query and URL tools' boxes in the fixed-pitch font
JE-Chen Sep 24, 2026
cfe84f6
Stop the AI panels suggesting an endpoint they refuse
JE-Chen Sep 24, 2026
59d1fa1
Start AI Code Review on a method that sends the code
JE-Chen Sep 24, 2026
237d60d
Document what CoT Code Review and Skill Send send
JE-Chen Sep 24, 2026
dfd457d
Send no empty code from the AI review panels, and the code as pasted
JE-Chen Sep 24, 2026
ef5b375
Describe what the AI review panels send in the architecture map
JE-Chen Sep 24, 2026
cf07f9a
Word the JWT and status hand-over buttons alike and plainly
JE-Chen Sep 24, 2026
6513a30
Show HTTP status classes in the IDE's language
JE-Chen Sep 24, 2026
eecbde8
Word the regex and timestamp results in the IDE's language
JE-Chen Sep 24, 2026
1d16e3c
Put one space after the SSH terminal's [Error] label
JE-Chen Sep 24, 2026
becee81
Put the AI docks in JEditor's AI submenu of the Dock menu
JE-Chen Sep 24, 2026
5360e8f
Spell menu names one way and say Tab or Dock on every Tools entry
JE-Chen Sep 24, 2026
d7d5d51
Name the FileAutomation install entry as the menu does
JE-Chen Sep 24, 2026
d9d3c1e
Default the delete and discard questions to No
JE-Chen Sep 24, 2026
bf040e4
Make the diagram image suffix allowlist public
JE-Chen Sep 24, 2026
fa570a6
Translate the diagram editor's file filters and offer every image suffix
JE-Chen Sep 24, 2026
878b5b5
Say 提示詞 throughout and title the CoT review window as its tab
JE-Chen Sep 24, 2026
e013b78
Name the file a run window runs in its title
JE-Chen Sep 24, 2026
a7412e2
Count the dictionary keys in the READMEs and test the count
JE-Chen Sep 24, 2026
79d8382
Re-measure the counts in the architecture map
JE-Chen Sep 24, 2026
f4d7c58
Label the SSH secret field Passphrase under key authentication
JE-Chen Sep 24, 2026
60e8e52
Run a tool with Ctrl+Enter
JE-Chen Sep 24, 2026
b5636f9
Move the Ctrl+Enter helper up to pybreeze_ui
JE-Chen Sep 24, 2026
e862792
Send from the AI panels with Ctrl+Enter
JE-Chen Sep 24, 2026
d96be79
Translate the Regex tab's title
JE-Chen Sep 24, 2026
d14808e
Rename and delete in the project tree with F2 and Delete
JE-Chen Sep 24, 2026
f971f46
Pull the SFTP tree's action runner out of its menu
JE-Chen Sep 24, 2026
731978e
Rename and delete in the SFTP tree with F2 and Delete
JE-Chen Sep 24, 2026
28c71f8
Delete to the trash from the project tree
JE-Chen Sep 24, 2026
5b6331f
Test every branch of the SSRF check
JE-Chen Sep 24, 2026
5de7821
Test every branch of the pinned connections and capped reads
JE-Chen Sep 24, 2026
6cd731c
Record cryptography among the undeclared direct imports
JE-Chen Sep 24, 2026
0e043ad
Record qt_material among the undeclared direct imports
JE-Chen Sep 24, 2026
5c07739
Test the diagram editor's image download checks
JE-Chen Sep 24, 2026
d9a378b
Test that stopping a run stops what it started
JE-Chen Sep 24, 2026
7f14bc0
Test the host-key store's last line and a closed panel's question
JE-Chen Sep 24, 2026
a848db2
Let coverage count what QThread workers run
JE-Chen Sep 24, 2026
e156ed1
Re-measure the coverage the architecture map quotes
JE-Chen Sep 24, 2026
72e3e68
Test a saved diagram's local images
JE-Chen Sep 24, 2026
0e692e9
Let Ctrl+Enter call any action
JE-Chen Sep 24, 2026
0b37f0f
Pick the direction from the input on Ctrl+Enter in the two-way tools
JE-Chen Sep 24, 2026
e3dc209
Stop the READMEs promising keyword highlighting
JE-Chen Sep 24, 2026
cc77077
Record the build configs left under the old name
JE-Chen Sep 24, 2026
7472876
Name the root documents in the README's project tree
JE-Chen Sep 24, 2026
847f4b4
Tell which interpreter a run uses, in the README and a docstring
JE-Chen Sep 24, 2026
95d6b72
Say which Python JupyterLab starts in
JE-Chen Sep 24, 2026
9716c49
Say what the other languages in the menu do
JE-Chen Sep 24, 2026
4b6831d
Say 外掛 in the plugin guide, as the IDE does
JE-Chen Sep 24, 2026
bdae330
Name the menu entries in the Sphinx docs as they now read
JE-Chen Sep 24, 2026
cb22a19
Show today's main window in the Sphinx docs
JE-Chen Sep 24, 2026
ce5d436
Update architecture.md's recipe for a new tool
JE-Chen Sep 24, 2026
b5de667
Render bold and code in the Chinese Sphinx pages
JE-Chen Sep 24, 2026
501e82e
Run JupyterLab in the interpreter a run uses
JE-Chen Sep 24, 2026
0cd6c3e
Correct the Sphinx JupyterLab pages
JE-Chen Sep 24, 2026
5824028
Correct the Sphinx SSH pages
JE-Chen Sep 24, 2026
85b890f
Correct the Sphinx Install pages
JE-Chen Sep 24, 2026
0d908f7
Correct the Sphinx Automation pages
JE-Chen Sep 24, 2026
1cc9c3a
Ask about the diagram's unsaved edits from one method
JE-Chen Sep 24, 2026
5133f0a
Ask before opening a diagram over unsaved changes
JE-Chen Sep 24, 2026
b79d3e0
Correct the Sphinx Tools pages
JE-Chen Sep 24, 2026
d28b627
Label the CoT review's code box as the code to review
JE-Chen Sep 25, 2026
a8e7021
Correct the Sphinx AI Tools pages
JE-Chen Sep 25, 2026
1777197
Offer the Plugin Browser when no plugin is loaded
JE-Chen Sep 25, 2026
33fa0f0
Correct the Sphinx Plugins and extension pages
JE-Chen Sep 25, 2026
979a536
Open the main window from a function of its own
JE-Chen Sep 25, 2026
0a37729
Show the theme start_editor is given
JE-Chen Sep 25, 2026
fd076c6
Correct the Sphinx overview, getting-started and base-menu pages
JE-Chen Sep 25, 2026
c02e5ee
Stop PyBreeze's runs from Stop All Program too
JE-Chen Sep 25, 2026
09b022a
Say what a file tree click does to the tab in front
JE-Chen Sep 25, 2026
f4551c4
Decide why a key did not load in one place
JE-Chen Sep 25, 2026
7a7e167
Stop offering the empty variable inspector as a feature
JE-Chen Sep 25, 2026
47bd9f5
Re-measure the line counts architecture_explore.md quotes
JE-Chen Sep 25, 2026
7e0d4e8
Translate a plugin's About box
JE-Chen Sep 25, 2026
ddced5e
Record that a damaged saved theme stops JEditor's window
JE-Chen Sep 25, 2026
1771299
Test that a closed run window's run can still be stopped
JE-Chen Sep 25, 2026
3579fa5
Build the guide's PDF with xelatex and CJK fonts
JE-Chen Sep 25, 2026
52bee9c
Read an arrow's label in linear time
JE-Chen Sep 25, 2026
c968345
Deal with SonarCloud's open issues in the package
JE-Chen Sep 25, 2026
0b21cee
Write fixture decorators without empty parentheses
JE-Chen Sep 25, 2026
c330be7
Resize a node and an image through one function
JE-Chen Sep 25, 2026
8c10e60
Test the diagram canvas's zoom and grid
JE-Chen Sep 25, 2026
1a0dddd
Test the diagram canvas's clicks and keys
JE-Chen Sep 25, 2026
4fcd3cc
Test the property panel's node edits and colour button
JE-Chen Sep 25, 2026
0bcadce
Test the prthinker menu beyond reviewing a file
JE-Chen Sep 25, 2026
531a51b
Open every Tools tab entry in a test
JE-Chen Sep 25, 2026
03b7a23
Complete architecture.md's custom-tab extension point
JE-Chen Sep 25, 2026
fae296a
Test the SFTP tree's download and upload dialogs
JE-Chen Sep 25, 2026
dc0449b
Test the SSH terminal's key authentication and input checks
JE-Chen Sep 25, 2026
1124bc5
Test installing JupyterLab for the tab
JE-Chen Sep 25, 2026
1dff6f2
Keep the JupyterLab tab test from crashing the test run on exit
JE-Chen Sep 25, 2026
706f21d
Count the tests that start the main window in a child in coverage
JE-Chen Sep 25, 2026
1174449
Import AutoControl when used so Qt can make the IDE per-monitor DPI a…
JE-Chen Sep 25, 2026
98b22d9
Load the automation GUIs and the SSH client when first opened
JE-Chen Sep 25, 2026
599f2f5
Record JEditor's startup imports in progress.md
JE-Chen Sep 25, 2026
c577dfb
Keep the IDE's own locust setting out of the processes it starts
JE-Chen Sep 25, 2026
882b403
Test each entry of the project tree's right-click menu
JE-Chen Sep 25, 2026
06a65a5
Ship the window icon with the package so the IDE shows it wherever it…
JE-Chen Sep 25, 2026
378c078
Test the packaged build's regex worker timeout and errors
JE-Chen Sep 25, 2026
e7cc100
Apply the theme once as the main window opens
JE-Chen Sep 25, 2026
df1098c
Rename the attributes that hid QWidget.actions() and QObject.thread()
JE-Chen Sep 25, 2026
0ecc4ac
Reword a test comment ruff read as a malformed noqa
JE-Chen Sep 25, 2026
d737986
Type the SSH widgets' optional login widget as optional
JE-Chen Sep 25, 2026
2f2b3a4
Test runs from a Chinese folder with Chinese output
JE-Chen Sep 25, 2026
ebf0a7c
Record what Python 3.15 needs from PySide6; badge the supported range
JE-Chen Sep 25, 2026
f79f813
Clear the release PR's static-analysis findings: passphrase labels ar…
JE-Chen Sep 25, 2026
10344e3
Merge pull request #138 from Integration-Automation/ci-fixes-137
JE-Chen Sep 25, 2026
d2bdbea
Merge remote-tracking branch 'origin/dev' into dev
JE-Chen Sep 25, 2026
0156ea8
docs: CLAUDE.md: look up SonarCloud/Codacy findings through their API…
JE-Chen Sep 25, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 9 additions & 3 deletions .coveragerc
Original file line number Diff line number Diff line change
@@ -1,12 +1,18 @@
# Coverage is measured on Windows and consumed by the SonarQube scanner running
# on Linux, so the report must not carry machine-specific paths. relative_files
# makes coverage emit repo-root-relative names (pybreeze/utils/... rather than an
# absolute <source> plus a package-relative filename), which is what the scanner
# resolves against.
# makes the report's <source> the relative "pybreeze" rather than an absolute
# path, and the scanner resolves the package-relative filenames against it.
#
# patch = subprocess starts coverage in every Python child a test starts (it
# needs coverage 7.10+; pytest-cov 7 no longer measures children itself), so
# the tests that build the real main window in a child interpreter
# (test/test_utils/started_window.py) count. Each child writes its own data
# file, which pytest-cov combines before reporting.
[run]
relative_files = True
source = pybreeze
branch = True
patch = subprocess

[report]
exclude_also =
Expand Down
13 changes: 12 additions & 1 deletion CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,11 @@ pybreeze/
│ ├── gui_thread_gc.py # Garbage collected on a GUI-thread timer, never on a worker
│ ├── plain_text.py # as_text: server/file text shown in message boxes as text, not markup
│ ├── exact_text.py # exact_text: a text box read as typed (toPlainText changes U+00A0, U+2028)
│ ├── terminal_view.py # Terminal output in a text view: colours, the pty size, a lone \r rewinding the line
│ ├── fixed_pitch.py # use_fixed_pitch_font: the system's fixed-pitch font, whatever the theme names
│ ├── run_shortcut.py # press_on_ctrl_enter: Ctrl+Enter in a panel presses its main button
│ ├── error_text.py # error_text: a tool's English error (exception_tags) in the IDE language
│ ├── code_result_logs.py # Only warnings and errors from loggers reach the editor's Code Result panel
│ ├── closing.py # may_close / AskingDock: tabs and docks with unsaved work are asked first
│ ├── dialog/ # prthinker settings dialog
│ └── syntax/ # Automation keyword highlighting definitions
Expand All @@ -34,6 +38,7 @@ pybreeze/
│ │ ├── process_executor_utils.py # build_process / start_process / run_dir_files_*
│ │ ├── file_runner_process.py # FileRunnerProcess — plugin run configs (any language)
│ │ ├── queue_pump.py # Shared pipe reader + per-tick queue drain
│ │ ├── run_notice.py # run_notice: a run window's own [Error]/[Run]/… lines, translated
│ │ ├── api_testka/ auto_control/ web_runner/ load_density/
│ │ ├── file_automation/ mail_thunder/ # Each delegates to build_process with its package name
│ │ ├── test_pioneer/ # python -m test_pioneer -e <yaml> via start_module_process
Expand All @@ -50,6 +55,7 @@ pybreeze/
├── exception/ # ITEException hierarchy
├── logging/ file_process/ app_dirs.py / subprocess_util.py
├── terminal_text.py # Escape sequences and controls stripped from terminal output (SSH, run window)
├── terminal_style.py # SGR colours and emphasis read into a TextStyle (SSH terminal)
└── manager/package_manager/ # PackageManager — holds syntax_check_list
```

Expand All @@ -73,7 +79,7 @@ pybreeze/
- `unit-tests` job: GitHub Actions on Windows, Python 3.10–3.14 — install deps → pytest `test/test_utils/` → `start_automation_test` → `extend_automation_test`
- `sonarcloud` job: CI-based SonarQube Cloud analysis (`sonar-project.properties`), `needs: unit-tests` so it can consume the `coverage-xml` artifact that leg uploads. Automatic Analysis is off and must stay off — the two modes are mutually exclusive and the scanner refuses to run alongside it
- SonarCloud's plan for this organization exposes results for `main` and for pull requests only. An analysis pushed for another branch succeeds but its results read back 403, so `dev.yml` scans on pull requests only; `stable.yml` also scans pushes to `main`. Do not "fix" this by scanning every `dev` push — the numbers are not readable
- Coverage comes from the 3.12 matrix leg (`pytest --cov`), configured by `.coveragerc`. `relative_files = True` is required: the report is produced on Windows and consumed by a Linux scanner, so it must not carry machine-specific paths
- Coverage comes from the 3.12 matrix leg (`pytest --cov`), configured by `.coveragerc`. `relative_files = True` is required: the report is produced on Windows and consumed by a Linux scanner, so it must not carry machine-specific paths. `patch = subprocess` is required too: pytest-cov 7 no longer measures child processes, and without it nothing the tests run in a child interpreter (the real main window, `started_window.py`) counts. coverage traces only the threads Python starts, so `test/test_utils/conftest.py` gives every `QThread` subclass a `run` that installs its tracer on Qt's thread; without it no `QThread.run` counts as covered

## Development

Expand All @@ -96,6 +102,10 @@ ruff check pybreeze/ # before committing non-trivia
- Custom exceptions inherit from `ITEException`; log via `pybreeze_logger` (lazy `%s` formatting, never `print()`)
- Plugin API: `register_programming_language()` / `register_natural_language()` from `je_editor.plugins`
- A QAction built for a menu must be kept alive: store it on the main window or give it the menu as its parent. A menu does not own the actions added to it, so one held only by a local variable is deleted when the builder returns and its entry disappears
- A context menu or dialog built on each use with a parent (`QMenu(self)`, `SomeDialog(self)`) is deleted once `exec()` returns (`deleteLater()`, or `WA_DeleteOnClose` for a message box): its parent keeps it otherwise, one more per use
- A process the IDE starts gets `child_environment()` or `utf8_subprocess_env()` (`utils/subprocess_util.py`) as its `env`, never `os.environ` as it is: a variable the IDE sets for itself alone has the value `IDE_ONLY` and stays out (`LOCUST_SKIP_MONKEY_PATCH`, which a load test must not inherit)
- Import `je_auto_control` only where it is used, never at the top of a module the IDE loads as it starts: it makes the process system DPI aware as it imports, which keeps Qt from making the IDE per-monitor aware. The automation packages' GUIs and the SSH client (paramiko) are likewise imported by the entry that opens them, which keeps almost two seconds off the start; `test_startup_imports.py` fails when one of them is imported as the IDE starts
- An instance attribute of a Qt class never takes the name of a member of its Qt base (`self.actions`, `self.thread`, `self.layout`, …): it hides the method from everything that calls it on the widget. `test_no_qt_member_shadowing.py` fails on one
- Delete unused code immediately — no dead imports, unreachable branches, commented-out blocks, or `_old_` prefixes
- Follow PEP 8 and standard Pythonic practice; `ruff` is the arbiter

Expand Down Expand Up @@ -167,3 +177,4 @@ Workspace rule shared by every repository under `D:\Codes` (full text: `D:\Codes
- Commit messages: short imperative sentence ("Update stable version", "Fix github actions")
- **No AI attribution (mandatory)** — never mention any AI tool, assistant, agent, model or vendor in commit messages, trailers, branch names, PR titles or bodies, issues, code comments or documentation. No `Co-Authored-By` referencing an AI, no "Generated with …" footers. PR text describes *what changed and why*, never how it was authored.
- PR target: `dev` for development work, `main` for stable releases
- **SonarCloud / Codacy findings.** When a PR or commit fails a SonarCloud or Codacy check, look the findings up through their APIs instead of guessing. The keys are in environment variables: `SonarCloudToken` (SonarCloud, e.g. `curl -s -u "$SonarCloudToken:" "https://sonarcloud.io/api/issues/search?componentKeys=<key>&pullRequest=<n>&resolved=false"`) and `CODACY_PROJECT_TOKEN` (a Codacy project token, valid only for its own project: any other repository answers "Bad credentials", so for a public repository query `https://app.codacy.com/api/v3/analysis/organizations/gh/<org>/repositories/<repo>/pull-requests/<n>/issues?status=new` without a key). **Never reveal a key or any personal credential while doing so**: refer to the variables by name only, never echo or print their values, and never put them in files, commit messages, PR or issue text, logs, or any output that leaves the machine.
12 changes: 8 additions & 4 deletions PLUGIN_GUIDE.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# PyBreeze Plugin Guide / 插件開發指南
# PyBreeze Plugin Guide / 外掛開發指南

PyBreeze is built on JEditor and uses its plugin system unchanged: the `je_editor.plugins` API
(`register_programming_language`, `register_natural_language`, `PLUGIN_RUN_CONFIG`), the
Expand All @@ -9,6 +9,9 @@ for both editors, kept in the JEditor repository:

Ready-made plugins (C, C++, Go, Java and Rust highlighting with run support, a French UI
translation) live in [IDE_Plugins](https://github.com/Jeffrey-Plugin-Repos/IDE_Plugins).
JEditor now colours those five languages itself, and a registered language's keywords are used
only for a suffix it does not colour, so from these plugins their run configurations are what
takes effect.

PyBreeze reads one run-config key JEditor does not: `"encoding"`, the encoding the program writes
its output in (`"cp950"`, `"utf-8"`, or `"locale"` for the machine's own). Without it the output is
Expand All @@ -17,14 +20,15 @@ page, so a Java run config on a non-English Windows wants `"encoding": "locale"`

---

PyBreeze 建立在 JEditor 之上,原封不動地使用它的插件系統:`je_editor.plugins` API
PyBreeze 建立在 JEditor 之上,原封不動地使用它的外掛系統:`je_editor.plugins` API
(`register_programming_language`、`register_natural_language`、`PLUGIN_RUN_CONFIG`)、
`jeditor_plugins/` 目錄,以及 *插件 → Plugin Browser* 選單。所以兩個編輯器共用一份指南,放在 JEditor repo:
`jeditor_plugins/` 目錄,以及 *外掛 → 外掛瀏覽器* 選單。所以兩個編輯器共用一份指南,放在 JEditor repo:

**→ [JEditor `PLUGIN_GUIDE.md`](https://github.com/Integration-Automation/JEDITOR/blob/main/PLUGIN_GUIDE.md)**

現成的插件(C、C++、Go、Java、Rust 語法高亮與執行設定,以及法文介面翻譯)放在
現成的外掛(C、C++、Go、Java、Rust 語法高亮與執行設定,以及法文介面翻譯)放在
[IDE_Plugins](https://github.com/Jeffrey-Plugin-Repos/IDE_Plugins)。
JEditor 現在自己就會為這五種語言上色,而註冊的語言關鍵字只用在它不上色的副檔名,所以這些外掛實際生效的是執行設定。

PyBreeze 多讀一個 JEditor 不讀的執行設定欄位:`"encoding"`,程式輸出用的編碼(`"cp950"`、`"utf-8"`,
或 `"locale"` 表示這台電腦自己的)。沒寫就用 IDE 的編碼讀,預設 UTF-8。Java 與中文化的編譯器輸出的是
Expand Down
Loading
Loading