Commit graph

127 commits

Author SHA1 Message Date
Moy
1d1bda8c80 docs: Update README zh 2026-05-28 14:24:37 +08:00
Moy
340122e3b2 build: 1.7.1 - add display name regex replacement, fix #37 2026-05-28 14:21:46 +08:00
Moy
620460fe5a build: 1.7.0
- Code block detection now returns innermost nested block
- Settings tab: async/await -> void in onChange handlers
- Settings tab: SettingGroup updates
- package.json: fix name field to easy-copy
2026-05-26 22:13:30 +08:00
Moy
ea87a27a88 fix: correct fenced code block detection and add unit tests
- Fix false positive when cursor is between two code blocks: the old
  upward search couldn't distinguish closing fences from opening ones
- Fix nested fence support: closing fence must be >= opening fence
  length per CommonMark spec; shorter inner fences are now treated
  as content lines
- Extract detection logic to pure function detectCodeBlockFromLines
  in src/codeBlockDetect.ts for testability
- Add 37 unit tests covering the bug scenario, nested fences,
  unclosed blocks, all CodeBlockBehavior modes, and fence-line edges
2026-05-26 21:17:59 +08:00
Moy
096a74c0c3 bump: reset the version 2026-05-15 17:43:08 +08:00
Moy
27824e9128 fix: update saveSettings calls to use async/await 2026-05-15 17:37:47 +08:00
Moy
c0a275f3e7 build: bump version to 1.6.5 2026-05-15 16:47:32 +08:00
Moy
1087aa2ec6 fix: remove unnecessary void operator from saveSettings calls 2026-05-15 16:30:17 +08:00
Moy
42b41f5df4 build: 1.6.4 2026-05-15 15:11:58 +08:00
Moy
80439dd2c2 chore: Update CHANGELOG 2026-05-15 14:26:58 +08:00
Moy
548a66e701 docs: split 1.6.3 release notes 2026-05-15 14:24:20 +08:00
Moy
7689635390 build: refresh 1.6.3 release notes 2026-05-15 14:20:14 +08:00
Moy
30a8ac63d8 build: 1.6.3 2026-05-15 13:33:22 +08:00
Moy
fd1b5eb752 chore: update CHANGELOG 2026-05-15 12:25:41 +08:00
Moy
25046d860e chore: update pnpm lockfile 2026-05-15 12:17:06 +08:00
Moy
38456ef3af build: 1.6.2 2026-05-15 11:25:16 +08:00
Moy
6b7bca0bc7 chore: update pnpm lockfile 2026-05-13 19:20:50 +08:00
Moy
37a490d777 ci: fix duplicate separators in release notes extraction 2026-05-12 13:01:01 +08:00
Moy
aa73736d9f build: 1.6.1 2026-05-12 12:56:21 +08:00
Moy
f59fd09cd2 docs: restructure CHANGELOG with details blocks and update release workflow for minor-series aggregation 2026-05-12 12:48:52 +08:00
Moy
d693e59061 docs: add emoji to CHANGELOG section headings 2026-05-12 12:46:38 +08:00
Moy
3418e9ae4f feat: add code block copy with configurable behavior setting
- Add CodeBlockBehavior enum: COPY_CONTENT / COPY_WITH_FENCES / GENERATE_BLOCK_LINK / DISABLED
- Add CODEBLOCK ContextType, detectCodeBlock() method in main.ts
- Code block detection runs before block ID generation (conflict resolution)
- Add Code Block settings group in settingTab.ts with dropdown
- Add CHANGELOG.md with full version history
- Update release workflow to extract notes from CHANGELOG.md
2026-05-12 12:42:27 +08:00
Moy
63c636de7b build: 1.6.0 2026-05-09 19:08:04 +08:00
Moy
d13b66a69c
Merge pull request #35 from lightmotive/feat/follow-obsidian-paste-resolution
feat: paste-time link resolution + heading-link polish
2026-05-09 14:05:43 +08:00
Moy
3143de6edf fix: add console warning when paste is preempted, add community-plugins.json hint to tooltip, inline info icon 2026-05-08 14:40:30 +08:00
Moy
a34ce4648a refine: split paste-resolution desc into short text + info tooltip, remove re-enable suggestion 2026-05-08 14:35:25 +08:00
Moy
8e1b6058bd fix: restore defaultPrevented check, always show simplifiedHeadingToNoteLink setting, update i18n with load-order note 2026-05-08 14:18:46 +08:00
Moy
fbd9547bf8 fix: restore simplifiedHeadingToNoteLink in OBSIDIAN mode, remove defaultPrevented check, update i18n descriptions 2026-05-08 13:37:26 +08:00
Andre Light
7c6aa950af chore: translate user-authored comments to Simplified Chinese
The maintainer reviews and writes comments in Chinese. To minimize
review friction and maximize merge likelihood, translate all
user-authored English comments across src/ into Simplified Chinese,
matching the upstream comment style. Test files included; describe/it
strings stay English (functional test names). Pre-existing English
comments authored by upstream contributors are left untouched.

Adds CONTRIBUTING-zh.md as a sibling translation of CONTRIBUTING.md
(matching the README.md / README-zh.md cross-linked convention).

Also corrects one Chinese comment in type.ts that became stale after
extending paste-time path resolution to all three Link format options.

No behavior change. 184 tests pass; typecheck and lint clean (the
pre-existing unrelated lint error in detectBlockId remains as before).

Designed, carefully reviewed, and edited by @lightmotive in collaboration with Claude Code.
2026-04-28 22:27:48 -06:00
Andre Light
1e06fa7229 refactor: extract helpers from buildHeadingLink
Pull out computeDisplayText, shouldSimplifyHeading,
formatWikiHeadingLink, formatMarkdownHeadingLink as private helpers.
buildHeadingLink becomes a thin orchestrator: stripWikiBrackets →
computeDisplayText → shouldSimplifyHeading → wikiExactMatch policy →
formatX. Formatters are pure string-producers; the orchestrator owns
the WIKI [[filename]] exact-match policy (the A1.5 exception).

Pure refactor — no behavior change, all 184 existing tests pass without
modification.

Also extract stripWikiBrackets to its own export and reuse in
buildHeadingCopyMetadata (removes duplicated [[…]] stripping).

Designed, carefully reviewed, and edited by @lightmotive in collaboration with Claude Code.
2026-04-28 20:55:48 -06:00
Andre Light
adef562ef6 feat: extend paste-time path resolution to explicit Wiki/Markdown
Previously the paste handler only fired when linkFormat was "Follow
Obsidian settings". Users on explicit Wiki or Markdown got no
paste-time cleanup — pasting a heading into the same file produced the
verbose [[Filename#Heading|Heading]] instead of [[#Heading]].

Drop the OBSIDIAN-only gate in shouldRegisterPasteHandler and
decidePasteResolution. handlePaste branches by linkFormat: OBSIDIAN
keeps using app.fileManager.generateMarkdownLink (full newLinkFormat
support); explicit Wiki/Markdown uses app.metadataCache.fileToLinktext
(shortest-unique paths only). The same-file alias-redundancy fix from
the previous commit applies to both branches.

Add buildExplicitPasteLink in linkBuilder.ts as a pure string-producer
for the explicit-format branch — caller decides omitAlias via
shouldOmitAliasForSameFile, formatter consumes the boolean. Toggle now
shown for all three linkFormat options; description updated to reflect
format-aware behavior across en/zh/zh-tw.

Tests: new buildExplicitPasteLink suite covering wiki/md, same-file
vs cross-file, block links, and encoding behavior. pasteResolution
tests updated for the broadened gate (linkFormat field removed from
PasteResolutionInput; OBSIDIAN-only assertions dropped).

Trade-off: explicit Wiki/Markdown get shortest-path-only resolution;
users wanting relative/absolute path styles keep using "Follow
Obsidian settings" (which honors the vault's newLinkFormat config).

Designed, carefully reviewed, and edited by @lightmotive in collaboration with Claude Code.
2026-04-28 20:53:07 -06:00
Andre Light
7e467f389c feat: drop redundant alias on same-file OBSIDIAN paste
When pasting a heading link into the same file it was copied from, the
paste handler now produces [[#Heading]] instead of [[#Heading|Heading]].
The alias was redundant — Obsidian's natural rendering of [[#Heading]]
already shows just "Heading" since there's no file portion to
disambiguate.

Cross-file pastes keep the alias (without it, Obsidian renders
"Filename > Heading" instead of just "Heading"). Markdown-format pastes
also keep the alias (it IS the visible link text in markdown). The
omission is wiki-only, same-file-only, useHeadingAsDisplayText-only.

Adds shouldOmitAliasForSameFile pure helper in pasteResolution.ts with
truth-table tests; handlePaste consults it before calling
generateMarkdownLink.

Designed, carefully reviewed, and edited by @lightmotive in collaboration with Claude Code.
2026-04-28 20:48:15 -06:00
Andre Light
eca6c94ae9 feat: gate simplifiedHeadingToNoteLink to non-OBSIDIAN formats
Under "Follow Obsidian settings", defer link format/path choice to
Obsidian's vault config — but Obsidian's own generateMarkdownLink would
never auto-collapse a heading link to a file link when the filename
matches the heading. Keeping simplifiedHeadingToNoteLink active under
OBSIDIAN injects an Easy Copy opinion that conflicts with that intent.

Hide the toggle (and its strict-match child) from settings UI when
linkFormat is OBSIDIAN, and gate simplification inert at the call site
in copyHeadingLink. Stored values persist across format changes,
matching the precedent set by resolveLinkPathOnPaste.

Designed, carefully reviewed, and edited by @lightmotive in collaboration with Claude Code.
2026-04-28 20:46:55 -06:00
Andre Light
b29a70084b feat: gate simplifiedHeadingToNoteLink on useHeadingAsDisplayText (A1.5)
When useHeadingAsDisplayText is false, the user has chosen to see
"filename#heading" in the link display. Auto-simplifying the link
target to just the filename in that case produces a misleading
[filename#heading](filename) — display promises a heading link the
target doesn't deliver.

Add useHeadingAsDisplayText to the simplification gate. The WIKI
exact-match special case [[filename]] is intentionally exempt —
Obsidian renders it cleanly as just the filename, no alias, no
mismatch.

4 new MD A1.5 tests + 5 WIKI A1.5 tests covering the gate and the
exact-match exception. One existing test (frontmatterTitle +
note-link simplification, wiki) renamed to reflect gated behavior.

161 tests pass; typecheck clean.

Designed, carefully reviewed, and edited by @lightmotive in
collaboration with Claude Code.
2026-04-28 02:06:48 -06:00
Andre Light
8f0f26a535 feat: apply simplifiedHeadingToNoteLink to markdown links
The MDLINK branch in buildHeadingLink now uses linkContent (which the
early simplification block already computes), so a matching filename
and heading collapses [foo](foo#foo) → [foo](foo) just like the wiki
form already did. Was effectively a no-op for MD before — the toggle
existed but didn't affect markdown output.

10 new tests covering exact / case-insens / space-removed / substring /
strict-mode simplification cases. The MDLINK + matching-filename test
and the noSimplify MD sanity test are renamed to reflect their actual
intent now that simplification works for both formats.

107 tests pass; typecheck clean.

Designed, carefully reviewed, and edited by @lightmotive in
collaboration with Claude Code.
2026-04-28 02:04:56 -06:00
Andre Light
4ac623b1bd feat: opt-in toggle, editor-paste cooperation, and orphaned-setting fix
Addresses #35 maintainer feedback: gate paste-time resolution behind a
default-off toggle with 5-min TTL on lastCopyMeta. Switch from DOM
paste (capture phase) to editor-paste workspace event with documented
defaultPrevented yield protocol; register only when active.

Also fixes a pre-existing bug where simplifiedHeadingToNoteLink was
never read — the simplification fired unconditionally when filename
matched heading.

Designed, carefully reviewed, and edited by @lightmotive in collaboration with Claude Code.
2026-04-27 20:46:42 -06:00
Andre Light
3c3c20800f test: extract copy-metadata builders and add unit tests
Move the inline metadata-construction logic from the three copy paths
(block/heading/file) into pure helpers in src/copyMetadata.ts, matching
the project's pure-function test style. Adds 25 unit tests covering
alias, subpath, and embed computation for each copy type.
2026-04-22 04:06:58 -06:00
Andre Light
2c51e4e52d feat: paste-time path resolution using Obsidian's link format settings
Intercept paste (DOM capture phase) to regenerate Easy Copy links via
generateMarkdownLink(), resolving shortest/relative/absolute paths based
on the destination file. Metadata is cleared on manual copy to prevent
false interception of non-Easy-Copy content.
2026-04-22 03:23:24 -06:00
Moy
f93ad24367 build: 1.5.3 2026-04-22 14:32:47 +08:00
Moy
d327b5013a build: 1.5.3 2026-04-22 13:22:01 +08:00
Moy
46723f1cd0 build: 1.5.3 2026-04-22 13:03:37 +08:00
Moy
f646ba8196 ci: fix release workflow for vitest compatibility 2026-04-22 13:00:28 +08:00
Moy
a07b499f4a build: 1.5.3 2026-04-22 12:58:16 +08:00
Andre Light
60e451db9f fix: sanitize heading link targets and fix substring matching
Strip # | ^ : %% [[ ]] from heading link targets to match Obsidian's
autocomplete behavior. Fix compareIgnoreCase to use strict equality
instead of includes(), preventing false-positive note-link simplification.
2026-04-22 12:55:29 +08:00
Andre Light
d6f6678b38 docs: add CONTRIBUTING.md with development and testing instructions 2026-04-22 12:38:52 +08:00
Andre Light
87692e012f test: add vitest harness with pure function extraction for link builders 2026-04-22 12:38:52 +08:00
Andre Light
7be3eee3b3 Fix: encode spaces as %20 in generated Markdown link URLs
Obsidian doesn't parse Markdown links with literal spaces in the URL
portion (e.g. `[text](file#My Heading)`). This encodes spaces as `%20`
in the URL part of all Markdown-format links — heading links, block
links, and file links — so they render correctly.

Closes #29

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 17:04:29 +08:00
Moy
f8c341c51b build: 1.5.2 2026-04-02 20:18:08 +08:00
Moy
14a98fa8e1 build: 1.5.2 2026-04-02 20:11:11 +08:00
Moy
68f239900b build: 1.5.1 2025-12-12 00:21:09 +08:00