Skip to content

Releases: Tasete/symbol-stripper

Release 1.0.4

Choose a tag to compare

@Tasete Tasete released this 14 Aug 07:28

v1.0.4

✨ 设置页重构:恢复自定义Tab分页

  • 移除声明式设置API,恢复直接Tab分页UI

    • 移除 getSettingDefinitions() / getControlValue() / setControlValue() 方法
    • 移除 SettingPage / SettingDefinitionItem 导入
    • 移除 MainSettingPage / PresetsSettingPage / ImportExportSettingPage 子类
    • 所有Tab分页UI直接在 SymbolStripperSettingTab.display() 中渲染
    • 点击插件设置直接显示Tab分页界面,无多余跳转层
  • Tab分页结构

    • 常规:右键菜单、跟随栏、位置九宫格、剔除刷、语言切换
    • 预设:使用说明、筛选框、可折叠预设列表、添加按钮
    • 导入/导出:JSON导出/导入

✅ 审核合规修复

  • 修复 Warning: prefer-create-el

    • 导出:document.createElement('a')containerEl.createDiv({cls:'sr-hidden'}).createEl('a', {attr:{...}})
    • 导入:document.createElement('input')containerEl.createDiv({cls:'sr-hidden'}).createEl('input', {type:'file', attr:{...}})
  • 修复 Warning: 不安全的any类型

    • catch(e: any)catch(e: unknown) + instanceof Error 类型守卫

✨ Settings Page Refactor: Restored Custom Tab Navigation

  • Removed declarative settings API, restored direct Tab navigation UI

    • Removed getSettingDefinitions() / getControlValue() / setControlValue() methods
    • Removed SettingPage / SettingDefinitionItem imports
    • Removed MainSettingPage / PresetsSettingPage / ImportExportSettingPage subclasses
    • All Tab navigation UI rendered directly in SymbolStripperSettingTab.display()
    • Clicking plugin settings shows Tab interface directly, no extra navigation layer
  • Tab structure

    • General: context menu, following toolbar, position grid, eraser brush, language
    • Presets: usage guide, filter, collapsible preset list, add button
    • Import/Export: JSON export/import

✅ Review Compliance Fixes

  • Fixed Warning: prefer-create-el

    • Export: document.createElement('a')containerEl.createDiv({cls:'sr-hidden'}).createEl('a', {attr:{...}})
    • Import: document.createElement('input')containerEl.createDiv({cls:'sr-hidden'}).createEl('input', {type:'file', attr:{...}})
  • Fixed Warning: unsafe any types

    • catch(e: any)catch(e: unknown) + instanceof Error type guard

Full Changelog: v1.0.3...v1.0.4

Release 1.0.3

Choose a tag to compare

@Tasete Tasete released this 14 Aug 04:19

v1.0.3

✨ 设置页重构:自定义Tab分页 + 声明式API兼容

  • 恢复自定义Tab分页UI

    • 使用 MainSettingPage(继承 SettingPage)在 display() 中渲染 Tab 栏 + 内容区域切换
    • 三个 Tab 页:常规 / 预设 / 导入导出,点击切换,保留之前的交互体验
    • 合并原 PresetsSettingPageImportExportSettingPageMainSettingPage 的内部方法
  • 兼容 Obsidian 1.13.0+ 声明式设置API

    • getSettingDefinitions() 返回单个 type: 'page' 项,通过 page 工厂函数创建 MainSettingPage
    • 同时保留 getControlValue() / setControlValue() 覆写方法
    • 兼顾自定义 Tab UI 与设置搜索功能

✅ Obsidian 审核合规修复

  • 修复 Warning: prefer-create-el

    • 导出功能:document.createElement('a')containerEl.createDiv({cls:'sr-hidden'}).createEl('a', {attr:{...}})
    • 导入功能:document.createElement('input')containerEl.createDiv({cls:'sr-hidden'}).createEl('input', {type:'file', attr:{...}})
  • 修复 Warning: 不安全的 any 类型

    • catch(e: any)catch(e: unknown) + instanceof Error 类型守卫
    • 错误消息提取:e.message ?? String(e)e instanceof Error ? e.message : String(e)
  • 移除未使用的导入

    • 移除 SettingDefinitionGroup 类型导入(不再使用声明式分组)

✨ Settings Page Refactor: Custom Tabs + Declarative API Compatibility

  • Restored custom Tab navigation UI

    • Implemented MainSettingPage (extends SettingPage) rendering Tab bar + content area switching in display()
    • Three tabs: General / Presets / Import-Export, click to switch, preserving the previous interaction experience
    • Merged PresetsSettingPage and ImportExportSettingPage into MainSettingPage internal methods
  • Compatible with Obsidian 1.13.0+ declarative settings API

    • getSettingDefinitions() returns a single type: 'page' item, creating MainSettingPage via page factory function
    • Retained getControlValue() / setControlValue() override methods
    • Balances custom Tab UI with settings search functionality

✅ Obsidian Review Compliance Fixes

  • Fixed Warning: prefer-create-el

    • Export: document.createElement('a')containerEl.createDiv({cls:'sr-hidden'}).createEl('a', {attr:{...}})
    • Import: document.createElement('input')containerEl.createDiv({cls:'sr-hidden'}).createEl('input', {type:'file', attr:{...}})
  • Fixed Warning: unsafe any types

    • catch(e: any)catch(e: unknown) + instanceof Error type guard
    • Error message extraction: e.message ?? String(e)e instanceof Error ? e.message : String(e)
  • Removed unused imports

    • Removed SettingDefinitionGroup type import (no longer using declarative groups)

Full Changelog: v1.0.2...v1.0.3

Release 1.0.2

Choose a tag to compare

@Tasete Tasete released this 14 Aug 04:14

v1.0.2

✅ Obsidian 审核合规修复

  • 修复 Error: no-static-styles-assignment

    • scrollContainer.style.overflow 直接赋值改用 classList.add/remove('sr-scroll-locked') CSS 类控制
  • 修复 Error: no-static-style-heading

    • 所有 createEl('h2'/'h3') 创建的 HTML 标题元素改用 new Setting(container).setName(...).setHeading()
  • 修复 Warning: prefer-create-el

    • 导出功能:document.createElement('a')document.body.createEl('a', { attr: {...} })
    • 导入功能:document.createElement('input')document.body.createEl('input', { attr: {...} }) as HTMLInputElement
  • 修复 Warning: 缺少声明式设置 API

    • 新增 getSettingDefinitions() 方法,返回 4 个 SettingDefinitionGroup(右键菜单、跟随栏、剔除刷、语言)
    • 新增 getControlValue() / setControlValue() 覆写方法,支持嵌套 useModes 键映射
    • 兼容 Obsidian 1.13.0+ 设置搜索功能
  • 修复 Warning: 不必要的类型断言

    • 移除 t() 模板字符串参数的冗余 as string 断言
  • 修复 Warning: Promise in void 上下文

    • 删除按钮的 async 事件处理器改为同步回调 + void this.plugin.saveSettings().then(() => doRefresh())
  • 修复 Warning: 不安全的 any 类型

    • catch(e: any)catch(e: unknown) + instanceof Error 类型守卫
    • JSON.parse() 结果标注 as unknown[],属性访问用 as Record<string, unknown>

✅ Obsidian Review Compliance Fixes

  • Fixed Error: no-static-styles-assignment

    • Replaced scrollContainer.style.overflow direct assignment with classList.add/remove('sr-scroll-locked') CSS class control
  • Fixed Error: no-static-style-heading

    • Replaced all createEl('h2'/'h3') HTML heading elements with new Setting(container).setName(...).setHeading()
  • Fixed Warning: prefer-create-el

    • Export: document.createElement('a')document.body.createEl('a', { attr: {...} })
    • Import: document.createElement('input')document.body.createEl('input', { attr: {...} }) as HTMLInputElement
  • Fixed Warning: missing declarative settings API

    • Added getSettingDefinitions() method returning 4 SettingDefinitionGroup items (context menu, following toolbar, eraser brush, language)
    • Added getControlValue() / setControlValue() overrides supporting nested useModes key mapping
    • Compatible with Obsidian 1.13.0+ settings search
  • Fixed Warning: unnecessary type assertion

    • Removed redundant as string assertion on t() template string arguments
  • Fixed Warning: Promise in void context

    • Converted async event handler to sync callback + void this.plugin.saveSettings().then(() => doRefresh())
  • Fixed Warning: unsafe any types

    • catch(e: any)catch(e: unknown) + instanceof Error type guard
    • Annotated JSON.parse() results as as unknown[], property access via as Record<string, unknown>

Full Changelog: v1.0.1...v1.0.2

Release 1.0.1

Choose a tag to compare

@Tasete Tasete released this 11 Aug 18:04

v1.0.1

🐛 Bug 修复

  • 修复设置页分页功能在 Obsidian 1.13.0+ 下不显示的问题
    • 移除了与自定义 Tab 分页冲突的声明式设置 API(getSettingDefinitions()),恢复 display() 作为主渲染方法,确保 General / 预设管理 / 导入导出 三个分页正常显示

🔒 安全修复

  • 替换 innerHTML 为安全的 DOM API
    • 设置页使用说明列表中的 innerHTML 改用 createEl('strong') + appendText() + createEl('code') 组合构建
    • 正则语法表中的 innerHTML 改用 createEl('code', { text }) 构建
    • i18n 翻译键相应拆分为 .label / .desc / .code / .suffix 子键

🎨 样式优化

  • 移除 CSS 中的 !important
    • .sr-guide-subtitle 改用 .sr-guide p.sr-guide-subtitle 提升选择器特异性
    • .sr-hidden / .sr-scroll-locked 改用双重类名选择器提升特异性

🛠️ 代码质量

  • 修复 TypeScript 类型安全问题
    • 消除不必要的类型断言,改用类型守卫模式
    • 修复 Promise 误用(async void 回调改为 fire-and-forget 模式)
    • 消除 no-unsafe-* 相关警告

🐛 Bug Fixes

  • Fixed settings page tabs not displaying on Obsidian 1.13.0+
    • Removed the declarative settings API (getSettingDefinitions()) which conflicted with custom tab navigation, restored display() as the primary render method to ensure General / Presets / Import-Export tabs display correctly

🔒 Security Fixes

  • Replaced innerHTML with safe DOM API
    • Guide list items: replaced innerHTML with createEl('strong') + appendText() + createEl('code') combination
    • Regex syntax table: replaced innerHTML with createEl('code', { text })
    • Split i18n translation keys into .label / .desc / .code / .suffix sub-keys accordingly

🎨 Style Improvements

  • Removed !important from CSS
    • .sr-guide-subtitle: switched to .sr-guide p.sr-guide-subtitle for higher selector specificity
    • .sr-hidden / .sr-scroll-locked: switched to double-class selectors for higher specificity

🛠️ Code Quality

  • Fixed TypeScript type safety issues
    • Eliminated unnecessary type assertions, replaced with type guard patterns
    • Fixed misused Promises (async void callbacks converted to fire-and-forget pattern)
    • Resolved no-unsafe-* related warnings

Full Changelog: v1.0.0...v1.0.1

Release 1.0.0

Choose a tag to compare

@Tasete Tasete released this 11 Aug 08:06

Symbol Stripper v1.0.0

首个正式版本发布。

核心功能

  • 字符模式 / 正则模式剔除
  • 浮动工具栏 + 剔除刷 + 右键菜单 + 命令面板
  • 预设自定义管理(增删改查、导入导出)
  • 中文 / English 双语支持

安装

详见 README

最低要求

Obsidian ≥ 1.0.0


English

Initial release.

Highlights

  • Char mode / Regex mode stripping
  • Floating toolbar, eraser brush, context menu & command palette
  • Preset management (CRUD, import/export)
  • i18n: Chinese & English

Installation

See README

Requirements

Obsidian ≥ 1.0.0

Full Changelog: Initial release

Full Changelog: https://github.com/Tasete/symbol-stripper/commits/v1.0.0