Quantcast
Channel: 簡睿隨筆
Viewing all 904 articles
Browse latest View live

視覺化鍵盤工具Keyviz v2.0.0-Alpha2更新

$
0
0

視覺化鍵盤工具 Keyviz 在四月份更新了v2.0.0-Alpha2,以下是需要注意之處:

1. 多顯示器設定

如果有多個顯示器時,必須設定正確才能讓鍵盤顯示在需要的顯示器。

2. Mechanical樣式問題

目前預設的Mechanical Preset有個問題,如果背景沒有啟用的話,鍵盤顯示的高度會不正確。

3. 相關鏈接

##

您可能也會有興趣的類似文章


命令行資料庫工具 SQL-Bless 與 CSV文字檔編輯 CSVI

$
0
0

介紹兩個命令行工具:SQL-Bless與CSVI,二者皆使用Go語言撰寫,不須安裝,直接執行執行檔即可。

  • SQL-Bless:SQL客戶端的命令行工具,能操作4種資料庫系統:Oracle、PostgreSQL、SQL Server與MySQL
  • CSVI:讀寫CSV檔案的命令行工具

1. SQL-Bless

[!tip] 連線語法
sqlbless 資料庫類型 "連線字串"
例如:

  • sqlbless sqlserver "sqlserver://@localhost?database=master"
  • sqlbless sqlserver "sqlserver://帳號:密碼@10.1.1.1?database=YOUR_DB&encrypt=disable"

支援的資料庫系統:

  • Oracle
  • PostgreSQL
  • SQL Server
  • MySQL

[!warning] 連線時發生TLS錯誤
連線時若出現"TLS Handshake failed: tls: server selected unsupported protocol version 301"訊息而無法連線時,可在連線最後面加上&encrypt=disable

1.1. SQL命令

  • SELECT / INSERT / UPDATE / DELETE
  • COMMIT / ROLLBACK
  • SPOOL
  • EXIT; / QUIT;
  • START SQL-script-filename
  • REM comments
  • Statement separator: ;

gh|700

1.2. 按鍵

Key Binding
Enter, Ctrl+M Insert a linefeed
Ctrl+Enter/J Execute text as SQL
Ctrl+F/B/N/P Editing like Emacs
Ctrl+C Exit with rollback
Ctr+D Delete character or submit EOF (exit with rollback)
ALT+P, Ctrl+Up, PageUp Insert the previous SQL (history)
ALT+N, Ctrl+Down, PageDown Insert the next SQL (history)
Ctrl+A, 0 Beginning of record
Ctrl+E, $ End of record
Ctrl+K Delete after cursor
Ctrl+U Delete before cursor
< First record
> End of last record
/ Search forward
? Search backward
n Search next
N Search next reverse

1.3. 批次檔快速連接

@echo off
if "%1"=="" goto USAGE
if "%1"=="master" goto MASTER
if "%1"=="msdb" goto MSDB
if "%1"=="temp" goto TEMP
goto END

:MASTER
sqlbless sqlserver "sqlserver://userid:password@10.1.1.1?database=MASTER"
goto END

:MSDB
sqlbless sqlserver "sqlserver://userid:password=1@10.1.1.1?database=MSDB"
goto END

:TEMP
sqlbless sqlserver "sqlserver://userid:password=1@10.1.1.1?database=TEMPDB"
goto END

:USAGE
echo sqli ID
echo ID=master, msdb, temp

:END

2. CSVI

在命令行查看、修改CSV檔案的工具。

g|700

[!info] 操作細節
參考:https://github.com/hymkor/csvi

3. 💡 相關鏈接

💡 解說文章:
✅ GitHub - hymkor/sqlbless: The Command-line Database Client: https://github.com/hymkor/sqlbless
✅ GitHub - hymkor/csvi: Terminal CSV Editor: https://github.com/hymkor/csvi

4. 教學影片

https://youtu.be/_cxBQKpfUds

##

您可能也會有興趣的類似文章

Nyagos開啟控制台檔案的方法

$
0
0

先前在打破Windows與UNIX的藩籬:nyagos-介於UNIX跟DOS之間的混血的CommandLine Shell裡提到解決開啟控制台檔案的方法是使用批次檔,如:

@echo off
if "%1"=="net" ncpa.cpl
if "%1"=="fire" Firewall.cpl
if not "%1"=="" %1.cpl
if "%1"=="" dir /w c:\windows\system32\*.cpl

再額外設定alias以快速開啟:

nyagos.alias["appwiz.cpl"]="cpl appwiz"

但這個方法必須手動設定要使用的檔名,有點麻煩,不如直接修改 nyagos.d/suffix.lua

  • cmd /c來開啟控制台命令
  • open開啟.msc檔案
for key,val in pairs{
    awk={"gawk","-f"},
    js={"cscript","//nologo"},
    lua={"nyagos.exe","--norc","--lua-file"},
    pl={"perl"},
    ps1={"powershell","-ExecutionPolicy","RemoteSigned","-file"},
    rb={"ruby"},
    vbs={"cscript","//nologo"},
    wsf={"cscript","//nologo"},
    py={"python"},
    cpl={"cmd.exe", "/c"},
    msc={"open"},
} do
    share._setsuffix( key , val )
end

##

您可能也會有興趣的類似文章

Obs159|Obsidian術語詞彙整合-definitions外掛

$
0
0

Obsidian-definitions外掛提供了很方便的術語詞彙(Glossary)整合:

  • 術語詞彙建立:將詞彙存入 /definitions 資料夾,詞彙有兩種格式:
    • 一個詞彙一個檔
    • 多個詞彙一個檔:詞彙之間以三個減號分隔。
  • 術語詞彙使用:會自動偵測定義過的詞彙並以點狀底線呈現,游標移入時會彈出預覽視窗,右鍵功能表有移至定義處選項

1. 詞彙定義

詞彙格式固定如下,*詞彙代名*可以省略:

# 詞彙名稱
*詞彙代名*
詞彙說明
  • 詞彙名稱目前必須是一個Word,亦即無法是一個以空白分隔的句子;必須使用多個Word的詞彙可以使用Wiki格式(如WhatIsPUA)或以底線分隔。
  • 同一行多個詞彙間必須有半形英數字元,否則無法辨識
  • 中文的詞彙名稱無法辨識,但仍可用右鍵預覽

範例1: WhatIsPUA 、CCR
範例2: Same_Energy 元宇宙 metaverse SPF SRS

gh

2. 💡 相關鏈接

✅ dominiclet/obsidian-note-definitions
✅ https://github.com/vschroeter/obsidian-glossary

3. 教學影片

##

您可能也會有興趣的類似文章

EmEditor 快速簡轉繁巨集

$
0
0

因為經常有簡體網路小說或文章需要轉換成繁體,使用OpenCC等工具覺得有點麻煩,於是便用EmEditor寫了簡單的巨集腳本,只要執行巨集就能快速的完成轉換。

這種作法的優點是能依轉換的需求自行控制,隨著轉換次數增多,就能逐日增加自己常用的詞彙,轉換也能逐漸準確。

簡轉繁巨集 範例

重點:

  1. 將要轉換的文字放入陣列
  2. 將檔案內容存入變數 _sText,再用字串的.replace()做替換
  3. 直接使用document.selection.Replace()效率很差,直接用變數做快速很多
  4. 我把一般文字和正則運算式拆成兩段來處理,其實寫成一個陣列也是可以的
// ebook
var aWords = [
  ["干", "幹"],
  [ "乾什麼","幹什麼" ],
  [ "乾涉","干涉" ],
  [ "乾嘛","幹嘛" ],
  [ "乾警","幹警" ],
  [ "乾實事","幹實事" ],
  [ "幹戈","干戈" ],
  [ "乾戈","干戈" ],
  [ "干嘛","幹嘛" ],
  [ "干什麼","幹什麼" ],
  [ "干過","幹過" ],
  [ "不相乾","不相干" ],
  [ "乾擾","干擾" ],
  [ "干脆","乾脆" ],
  [ "乾的好","幹的好" ],
  [ "乾得好","幹得好" ],
  [ "好好乾","好好幹" ],
  [ "幹了","乾了" ],
  [ "么","麼" ],
  [ "麼弟","么弟" ],
  [ "麼妹","么妹" ],
  [ "(求訂閱!)","" ],
  // .... 自行維護
];
var x = document.selection.GetActivePointX(eePosLogical);
var y = document.selection.GetActivePointY(eePosLogical);

document.selection.SelectAll();
var _sText = document.selection.Text;

for (let i = 0; i < aWords.length; i++) {
  //alert(aWords[i][0] + "," + aWords[i][1]);
  //document.selection.Replace(aWords[i][0],aWords[i][1],eeFindNext | eeFindSaveHistory | eeReplaceAll);
  _sText = _sText.replaceAll(aWords[i][0], aWords[i][1]);
}

aWords = [
      [ "干(.*)活","幹$1活" ],
      [ "(.*)月票(.*)","" ],
      [ "斗(.*)贏","鬥$1贏" ],
      [ "^愛下電子書(.*)","" ],
  [ "^『狀態:已完結』","" ],
  [ "^(\\d+)\\.第(.*)","第$2" ],
  [ "^『(.*)/作者:(.*)』","$1-$2" ],
  [ "^(.*)謝謝(.*)打賞(.*)\n$","" ],
  [ "^(.*)求票(.*)拜票(.*)\n$","" ],
  [ "^(.*)拜票(.*)求票(.*)\n$","" ],
  [ "^(.*)求(.*)推薦票(.*)\n$","" ],
];
for (let i = 0; i < aWords.length; i++) {
  //document.selection.Replace(aWords[i][0],aWords[i][1],eeFindNext | eeReplaceAll | eeFindReplaceRegExp);
  _sText = _sText.replaceAll(aWords[i][0],aWords[i][1]);
}

document.selection.Text = _sText;
editor.ExecuteCommandByID(4099);  // Ctrl+S
document.selection.SetActivePoint(1, x, y, false);
//alert("Done!");

相關鏈接

##

您可能也會有興趣的類似文章

Obs160|Obsidian試算表外掛2024年新選擇:Univer、Sheet Plus

$
0
0

Obsidian有多個試算表的外掛:

  • Spreadsheets:使用FortuneSheet
  • Workbooks:以程式碼區塊控制
  • Excel:使用 x-spreadsheet
  • DataLoom:提供類型Notoin表格的功能,可惜不再維護了
  • Obsidian Univer:提供Google Doc、Google試算表、Excel讀寫功能
  • Sheet Plus:使用Univer框架

前三者最後的更新日都在去年,請有興趣的朋友自行試用,本次只介紹今年(2024)推出的Univer兩個外掛。

1. Obsidian Univer

在左側邊欄點擊功能圖示即會彈出選單:
gh|700

  • Univer Doc:副檔名 .udoc;目前功能太過陽春
  • Univer Sheet:副檔名 .usheet
  • 可在Obsidian裡直接編輯 .xlsx 的Excel檔案
  • 固定為可編輯模式,無法切換

1.1. Univer Sheet

  • 核心功能:Univer 支持電子表格的核心功能,包括單元格、行、列、工作表和工作簿。
  • 公式:支持各種公式,包括數學、統計、邏輯、文本、日期和時間、查找和引用、工程、金融和信息公式。
  • 權限:允許限制對特定元素的訪問。
  • 數字格式化:支持根據特定條件格式化數字。
  • 超鏈接:支持在電子表格中鏈接到外部網站、電子郵件地址和其他位置。
  • 浮動圖片:允許將圖片插入到電子表格中,并將其放置在表格的任何位置。
  • 查找和替換:提供在電子表格中搜索特定文本并將其替換為其他文本的功能。
  • 篩選:允許根據特定條件篩選數據。
  • 排序:允許根據特定條件對數據進行排序。
  • 數據驗證:支持限制可以輸入單元格的數據類型。
  • 條件格式:支持根據特定條件對單元格應用格式。
  • 評論:允許向單元格添加評論以提供額外信息。
  • 協同編輯:支持多個用戶同時編輯電子表格。
  • 打印:允許打印電子表格或將其導出為 PDF。
  • 導入和導出:支持在 XLSX 中導入和導出數據。
  • 圖表:由 VChart 支持第三方圖表。

2. Sheet Plus

建立的是Excel 日期時間.md的檔案,能被嵌入到筆記裡。

[!warning] 相容性問題
如果有使用Filename Heading Sync外掛的話,必須在Ignore Regex Rule欄位輸入下列正則運算式排除Excel開頭的檔案。

範例(排除010-Templates資料夾與Excel*.md):
010-Templates/.*|Excel.*\.md

2.1. 嵌入語法

![[file-folder/file-name#sheet-name|sri-sci:eri-eci<sheet-height>{html}]]

![[Excel 2024-06-25 10.52.51.univer]]

gh

3. 相關鏈接

3.1. 其他相關外掛

4. 教學影片

##

您可能也會有興趣的類似文章

Obs161|Obsidian 2024高亮文字新選擇:Painter與Fast Text Color

$
0
0

我在Obs097 | Highlightr外掛-豐富Obsidian筆記的外觀介紹了插入HTML Mark標準以形成顯著樣式的Highlightr外掛,今天要介紹的是提供了更多設定功能的Painter,想要換個新外掛(Painter與Fast Text Color)的朋友們可以試用看看。

1. Painter:使用<mark>標籤

1.1. 設定要點

  1. Menu mode: minimal、normal
    
    minimal
    ![gh](https://raw.githubusercontent.com/emisjerry/upgit/master/2024/1719749226000utxqsp.png)

normal
gh


2. Choose highlight method: css-classes、inline-style
插入的<mark>標籤是使用CSS樣式類別或style屬性

3. Choose highlight style:6個樣式供選擇
![gh](https://raw.githubusercontent.com/emisjerry/upgit/master/2024/1719749665000bvu23i.png)

4. Choose highlight colors:選擇顏色和透明度
![gh|700](https://raw.githubusercontent.com/emisjerry/upgit/master/2024/1719749858000yra33x.png)

每個顏色都會被設定成命令,可以透過命令面板或設置快捷鍵以快速插入。

## 2. Fast Text Color:使用~= =~標記
以自訂的Markdown標記來指定顯示的文字前景顏色。

>[!tip] 語法
> ~={顏色代碼}要顯示的文字=~

### 2.1. 使用範例

~={red}RED text=~ ~={blue}BLUE text=~ ~={orange}Yellow=~

游標進入代碼區時會彈出選單。

![gh|200](https://raw.githubusercontent.com/emisjerry/upgit/master/2024/1720191190000uzjc6x.png)

執行Change Text Color命令時會彈出顏色選單,選好後會插入標記。

![gh|300](https://raw.githubusercontent.com/emisjerry/upgit/master/2024/1720191316000x2xybe.png)

### 2.2. 設定
![gh|700](https://raw.githubusercontent.com/emisjerry/upgit/master/2024/1720190768000erxm0w.png)

## 3. 💡 相關鏈接
💡 解說文章:
  ✅[GitHub - KraXen72/obsidian-painter: paint text different colors](https://github.com/KraXen72/obsidian-painter)
  ✅ [GitHub - Superschnizel/obisdian-fast-text-color: Obsidian plugin to enable colored text with a custom syntax.](https://github.com/Superschnizel/obisdian-fast-text-color)
- Obs097 | Highlightr外掛-豐富Obsidian筆記的外觀: https://yiutu.be/-kr9t-iw1MM

## 4. 教學影片
##

您可能也會有興趣的類似文章

啟用MultiCommander雙面板工具腳本 MultiScript Debugger的方法

$
0
0

我平常使用的雙面板工具是MultiCommander,主要原因除了是免費工具、方便好用外,它的腳本(Multi-Scripts)提供了擴充彈性,更是我不可或缺的功能(參考:擴充彈性十足的檔案管理工具:Multi Commander – 簡睿隨筆
)。

以前撰寫MultiScript時只能用MessageBox("INFO", 訊息); 來除錯,效能很差,最近終於找到啟用內建Debugger的操作方法,透過Debugger應該能提供開發速度。

本文介紹使用功能按鈕,也可使用自訂功能表來達成,步驟相彷。

啟用Debugger: 功能按鈕

把F1功能按鈕改成Debugger。

  1. 功能表 【組態】→【按鈕編輯器】
    gh|500

  2. 點擊【OK】後,再點擊第一個功能按鈕【說明】
    gh|500

  3. 把說明的內容變更為Debugger。命令類型選用Internal Commands,模組選用Multicommander (Base),命令選擇MultiScript Debugger。最後點擊【更新變更】。
    gh|500

  4. 點擊變更後的Debugger按鍵即會出現Debugger。

    • 由下拉選單選用要除錯的腳本檔
    • 點擊三角形圖示即可開始除錯

gh|500

##

您可能也會有興趣的類似文章


Obs162|Obsidian簡單且容易操控的Anki新外掛:Yanki

$
0
0

本次介紹Yanki外掛,用Markdown語法來產生Anki卡片,一個Obsidian筆記產生出一個Anki筆記,依筆記類型再產生出一或二個Anki卡片。

Yanki的優點是簡單,很容易的透過資料夾+筆記檔就能形成需要的牌組(學習範圍)。例如現有英文第一單元、英文第二單元、...英文第六單元等牌組,每個單元都可獨自學習,當第一次期中考到臨前,我們可以另外建立「英文第一~第三單元」資料夾,將英文第一單元、英文第二單元、英文第三單元資料夾內的筆記複製到「英文第一~第三單元」資料夾再同步到Anki,就能建立含有三個單元的學習卡片,考完試後即可刪除「英文第一~第三單元」。

先介紹Yanki的使用重點,最後再以七年級英文單字展示同步成基本型(含反向卡片)的操作步驟,會使用下列兩個Ank的附加元件:

  • AnkiConnect (代碼:2055492159)
  • AwesomeTTS (代碼:1436550454)

1. Yanki筆記製作重點

  • One Obsidian note = one Anki note
    一個筆記檔產生成一個Anki筆記。

  • 資料夾形成牌組

  • 只支援基本型、基本型(含反向卡片)、基本型(輸入答案)、克漏字等4種筆記類型

1.1. 基本型

  • ---區分成正面與背面
    正面
    ---
    背面

1.2. 基本型(含反向卡片)

    • 兩個---區分成正面與背面
      正面
      ---
      ---
      背面

▼ 範例

# fox

---
---
![](https://upload.wikimedia.org/wikipedia/commons/thumb/3/30/Vulpes_vulpes_ssp_fulvus.jpg/440px-Vulpes_vulpes_ssp_fulvus.jpg)

n. 狐\[C];狐皮\[U] 

KK\[fɑks] 

gh|300

1.3. 基本型(輸入答案)

  • 輸入的答案前後用底線夾住
    黑曜石的英文是 _obsidian_。

1.4. 克漏字

  • 填空的字前後用~~夾住
  • 提示文字用底線夾住
  • 也可以加上---形成反向卡片

2. Yanki外掛設定

  • Yanki掃描特定的資料夾以同步筆記到Anki,因此必須指定存放Anki筆記的資料夾
  • 建議依科目、單元等形成多階層資料夾,屆時可彈性設定以同步特定資料夾的內容
    gh|700

3. Anki操作

[!tip] 建議

  1. 建議使用Anki最新版,以免發生與附加元件不相容的狀況。
  2. 建立新的設定檔,以免與現有資料混雜在一起
  1. 功能表 【檔案】→【切換設定檔】建立新的設定檔,例如「Grade7」表示存放七年級的學習資料。不同的設定檔存放獨立的工作環境。
    gh|400

  2. 安裝 AnkiConnect 附加元件:功能表 工具→附件元件→取得附加元件
    gh|500

▼ 輸入元件代碼:2055492159,按【確定】
gh|400

  1. 依相容步驟再安裝AwesomeTTS元件,元件代碼:1436550454
  2. 元件安裝完成後重新啟動Anki以載入元件
  3. 在Obsidian裡按 Ctrl/Cmd+P輸入yanki,執行【Sync flashcard notes to Anki】
    • Yanki同時時自動在Anki裡建立筆記類型:Yanki - Basic (and reversed card)
    • Obsidian的資料夾名稱即為牌組名稱
  4. 檢視Anki對應的牌組是否已正確產生出卡片,一個筆記會有兩張卡片

3.1. 添加文字轉語音

AwesomeTTS元件可以自動在卡片的正面或背面插入語音檔,Anki顯示卡片時即可自動發音。

  1. 功能表 【工具】→【管理筆記類型】→選用【Yanki - Basic (and reversed card)】→點擊〔卡片〕

  2. 先設定Card 1的正面模板,在模板裡插入AwesomeTTS的欄位值:{{tts en_US voices=AwesomeTTS:Front}}
    gh|700

  3. 切換卡片類型為Card 2,在背面模板裡插入 {{tts en_US voices=AwesomeTTS:Front}}
    gh|700

  4. 第一次點擊卡片類型下方的Add TTS時,須先按左側的Save以建立語音引擎來源(Microsoft Speech API JScript (Microsoft David Desktop));語音引擎來源等可自行更換
    gh|700

4. 💡 相關鏈接

💡 解說文章:
✅Yanki: https://github.com/kitschpatrol/yanki-obsidian

5. 教學影片

https://youtu.be/CE6iNxBGBTc

##

您可能也會有興趣的類似文章

Obs163|Yanki外掛製作Anki 克漏字(Cloze)閃卡技巧,同場加映翏央填空模板

$
0
0

gh

除了介紹使用Yanki外掛形成克漏字筆記外,也介紹共享牌組「可输入答案的填空模板」達成美觀、方便的克漏字筆記作法,最後再透過Templater Hotkey腳本以快捷鍵快速組成克漏字的填空欄位。

◎ 範例
中華民國憲法 第1條
中華民國基於三民主義,為民有民治民享之民主共和國。
中華民國基於{{三民主義}},為{{c1::民有}} {{c2::民治}} {{c3::民享}} 之民主共和國。

1. Yanki Cloze

  • 用兩個波浪號夾住填空資料
  • 依序將波浪號匯出成 {{c序號::資料}} 格式,序號由 1 遞增
    中華民國憲法 第1條
    中華民國基於~~三民主義~~,為~~民有~~ ~~民治~~ ~~民享~~ 之民主共和國。
  • 同步後Anki的正面:
    中華民國憲法 第1條
    中華民國基於{{c1::三民主義}},為{{c2::民有}} {{c3::民治}} {{c4::民享}} 之民主共和國。
  • 幾個填空就產生幾張卡片

1.1. 筆記類型樣式修改

  • 功能表 【工具】→【管理筆記類型】,選用 【Yanki - Cloze】→【卡片】
  • 【模板】→【樣式】
    • .card: 用text-aligh: left 將內容靠左
    • .cloze: 將填空資料改為粗體藍字
.card {
    font-family: arial;
    font-size: 20px;
    text-align: left;
    color: black;
    background-color: white;
}

.cloze {
 font-weight: bold;
 color: blue;
}

1.2. 同組Cloze

  • 目前Yanki無法設置同一組的克漏字,即{{c2::{{c4::皆以{{c1::設置為同一組:
    中華民國基於~~三民主義~~,為{{c1::民有}} {{c1::民治}} {{c1::民享}}之民主共和國。

gh|500

2. 共享牌組:可输入答案的填空模板

  • 瀏覽共享牌組:可输入答案的填空模板 - 翏央 / chehil - AnkiWeb

  • 將下載的 .apkg 檔案存入本地

  • Anki 【牌組】→【匯入檔案】,選用下載的 .apkg 檔→【匯入】,完成後關閉匯入檔案視窗
    gh|500

  • 匯入的牌組名稱:*可输入答案的填空模板,瀏覽匯入的筆記卡片

  • QUESTION欄位內容:

    床前明月光,{{疑是地上霜}}。
    举头望明月,{{低头思故乡}}。
  • 瀏覽卡片正面時,筆記類型裡的JavaScript腳本會特別制兩個大括號內的文字
    gh|500

  • 填空位置可輸入答案於背面比對是否正確。背面:
    gh|500

2.1. 筆記類型:Type Cloze @翏央chehil

  • 正面模板
<div class=slide>
  <div class=qu>—— Question ——</div>
  <p></p>
  <div class=question>{{QUESTION}}</div>
</div>

<script>
  TYPE = '1';
  function toggle(cloze) {
    var key = cloze.getElementsByClassName("key")[0];
    var entry = cloze.getElementsByClassName("entry")[0];
    if (entry.style.display == "none") {
      if (TYPE) {
        key.style.display = "none";
        entry.style.display = "inline";
        if (entry.contentEditable == "true") {
          entry.focus();
          entry.onblur = function() {
            answer = entry.textContent.trim()
            if (answer == key.textContent.trim()) {
              entry.style.color = "green";
              entry.innerHTML = answer + '✔';
            } else {
              entry.style.color = "red";
              entry.innerHTML = answer + '✘';
            }
            key.style.opacity = 1;
            entry.contentEditable = false;
          }
        }
      } else {
        key.style.opacity = 1 - key.style.opacity;
      }
    } else {
      entry.style.display = "none";
      key.style.display = "inline";
    }
  }

  [].forEach.call(document.querySelectorAll('.question'),
    function(V0) {
      V0.innerHTML = V0.innerHTML.replace(/\{\{((?:.|\r?\n)+?)\}\}/g, 
        '<span class="cloze" onclick="toggle(this)">' + 
        '  <span class="key" style="opacity:0">$1</span>' + 
        '  <span class="entry" style="display:none;" contenteditable="true"></span>' +
        '</span>')
    });
</script>
  • 背面模板
    • &emsp;: 全形空白
<div class=qu>—— Question ——</div>
<p></p>
<div class=question>{{QUESTION}}</div>
<hr color=#ebedec>
<div class=slide>
  <div class=an>—— Answers ——</div>
  <div class=hr3></div>
  <div class=hr4></div>
  <p></p>
  <div class=answer>{{ANSWER}}</div>
  <p></p>
{{#TIPS}}
  <div class=Tips><ti>TIPS</ti> {{TIPS}}</div>
{{/TIPS}}
</div>

<script>
  TYPE = '1';
  function toggle(cloze) {
    var key = cloze.getElementsByClassName("key")[0];
    var entry = cloze.getElementsByClassName("entry")[0];
    if (entry.style.display == "none") {
      if (TYPE) {
        key.style.display = "none";
        entry.style.display = "inline";
        if (entry.contentEditable == "true") {
          entry.focus();
          entry.onblur = function() {
            answer = entry.textContent.trim()
            if (answer == key.textContent.trim()) {
              entry.style.color = "green";
              entry.innerHTML = answer + '✔';
            } else {
              entry.style.color = "red";
              entry.innerHTML = answer + '✘';
            }
            key.style.opacity = 1;
            entry.contentEditable = false;
          }
        }
      } else {
        key.style.opacity = 1 - key.style.opacity;
      }
    } else {
      entry.style.display = "none";
      key.style.display = "inline";
    }
  }

  [].forEach.call(document.querySelectorAll('.question'),
    function(V0) {
      V0.innerHTML = V0.innerHTML.replace(/\{\{(.+?)\}\}/g, 
        '<span class="cloze" onclick="toggle(this)">' +
        '  <span class="key" style="opacity:0">$1</span>' + 
        '  <span class="entry" style="display:none;" contenteditable="true"></span>' +
        '</span>')
    });
  [].forEach.call(document.querySelectorAll('.key'),
    function(key) {
      key.style.opacity = 1
      key.style.display = "inline";
    });
  [].forEach.call(document.querySelectorAll('.entry'),
    function(entry) {
      entry.style.display = "none";
    });
</script>

  • 樣式
@font-face { font-family: STsong; src: url('_STsong.TTF'); }
@font-face { font-family: STfangsong; src: url('_STfangsong.TTF'); }
@font-face { font-family: kt; src: url('_kt.ttf'); }

.card {
    padding: 15px 20px;
    font-family:STsong, Arial, serif;
    font-size: 25px;
    color: #000;
    background: #ebedec; 
}

.qu {
    font: 30px Times;
    font-style: oblique;
    text-align: center;
}

.an {
    font: 30px Times;
    font-style: oblique;
    text-align: center;
}

.question {
    color: #4c5870;
    font-weight: bolder;
    letter-spacing: 0.016em;
    line-height: 150%;
    text-align: justify
}

.answer {
    color: #4c5870;
    font-weight: bolder;
    letter-spacing: 0.016em;
    line-height: 150%;
    text-align: justify
}

ti{
    border-radius: 9px;
    padding: 4px 3px 2px 8px;
    font: bold 15px Arial;
    text-align: left;
    letter-spacing: 1px;
    color: #ebedec;
    background: #FD7013;
}

.Tips{
    min-height: 24px;
    border-top: 1px solid #FD7013;
    padding: 17px;
    font-size: 20px;
    font-family:仿宋;
    font-weight: bold;
    text-align: left;
    color: #222831;
    background:#FFFFF2;
    box-shadow: 2px 2px 5px #aaaaaa;
}

.slide {
    position:relative;
    -webkit-animation:slide 2s 0s;
    -webkit-animation-fill-mode:forwards; }

@-webkit-keyframes slide {
    0%      { opacity: 0;     top: 40px; }
    100%        { opacity: 1;     top: 0px; }
}

.card.nightMode {
    color: #ebedec;
    background: #121212;
}

.nightMode .question {
    color: #9ba6b2;
}

.nightMode .answer {
    color: #9ba6b2;
}

.nightMode ti {
    color: #121212;
    background: #f9a825;
}

.nightMode .Tips {
    border-top: 1px solid #f9a825;
    color: #ebedec;
    background:#1e1e1e;
    box-shadow: 2px 2px 5px #000000;
}

.cloze {
    color: #008792;
    padding:0 2px;
    border-bottom: solid;
    font-family:kt;
    font-weight:bold;
    letter-spacing:0.002em
}

.nightMode .cloze {
    color: #65bd7b
}

2.2. Yanki - Basic使用翏央填空模板

  • 將模板內的{{QUESTION}}改成{{Front}}
  • 將模板內的{{ANSWER}}改成{{Back}}
  • 移除{{TIPS}}相關內容
  • 插入樣式

3. Anki內建欄位語法

  • {{#欄位A}} 如果名為「欄位A」的欄位內容是空的,則 {{#欄位A}}{{/欄位A}} 之間的資料不會被顯示
    • 上列背面模板中,若TIPS欄位沒有內容,則{{#TIPS}}{{/TIPS}}之間的內容就不會被顯示
  • {{^欄位A}} 如果名為「欄位A」的欄位內容是空的,{{^欄位A}}{{/欄位A}} 之間的內容會被顯示
  • {{type:欄位名}} 在正面與背面都必須放才有用。輸入框功能。輸入框樣式:
    input#typeans {
    text-align: center;
    margin: 6px 0;
    margin-left: -14px;
    font-size: 22px;
    padding: 6px 12px;
    outline-style: none;
    color: #18577F;
    }
  • 克漏字{{cloze:欄位名}}輸入:{{type:cloze:欄位名}}

4. 快速插入克漏字符號:使用Templater Hotkey

  • 選取好要填空的文字後,按下按鍵快速插入需要的符號
按鍵 功能 檔名 prefix
Alt+ | 插入翏央填空的兩個大括號 {{文字}}` Cmd-anki-cloze.md {{
Alt+1 插入Anki第一個填空欄位 {{c1::文字}} Cmd-anki-cloze-c1.md {{c1::
Alt+2 插入Anki第一個填空欄位 {{c2::文字}} Cmd-anki-cloze-c2.md {{c2::
以此類推...

4.1. 步驟

  1. 建立需要的.md檔,貼入Templater腳本內容
  2. Templater選項設定,添加各.md檔
  3. 快速鍵設定設置對應按鍵

▼ Cmd-anki-cloze-c1.md (將小於改成半形小於符號,prefix變數改成對應的文字)

小於%*
let selObj = window.getSelection();
let text = selObj.toString();
let prefix = "{{c1::";  // 變更前綴
let isClozed = false;
if (text.startsWith(prefix)) {
  isClozed = true;
  text = text.substring(prefix.length)
}
if (text.endsWith("}}")) {
  isClozed = true;
  text = text.substring(0, text.length-2)
}
if (!isClozed) {
  text = prefix + text + "}}";
}
return text;
-%>

5. 💡 相關鏈接

💡 解說文章: https://jdev.tw/blog/
✅Yanki: https://github.com/kitschpatrol/yanki-obsidian
✅ 可输入答案的填空模板 - 翏央: https://ankiweb.net/shared/info/356679663

6. 教學影片

##

您可能也會有興趣的類似文章

AHK64|用AutoHotkey V2產生Yanki MD檔,快速建立Anki閃卡

$
0
0

gh|700

本次介紹由文字檔產生出Yanki .md檔的方法,使用AutoHotkey v2腳本達成。

gh

gh

gh

1. 設定文字檔格式

  • 文字檔檔案編碼:UTF-8
  • 以分號(;)或井號(#)開頭是不處理的註解行
  • 非註解的第一行必須是以正斜線(/)開頭的路徑,指定檔案的存放資料夾
    ; ==========
    ; 單字
    ; 第1課
    /j:\JERRY\MOC\060-Anki\English-7\English-7A-1-words
    park
    koala
    ; ==========
    ; 第2課
    /j:\JERRY\MOC\060-Anki\English-7\English-7A-2-words
    postcard
    years old
    famous
    all over the world
    easy
    wait

2. 腳本

#Requires AutoHotkey v2.0
#SingleInstance Force

/*
1. 分號(;)或井號(#)開頭表示是註解行。
2. 斜線(/)開頭表示輸出資料夾
3. 單字
一行一個單字,自動到Yahoo!奇摩網站取回解釋、音標與詞類
park
*/
Global _EXPL_ := 1  ; 解釋
Global _NOTION_ := 2  ; 詞類
Global _PRONOUNCE_ := 3  ; 發音音標

; 輸入文字檔有3種格式
;  1=英文單字
;  2=片語 [Tab] 中文解釋
;  3=克漏字
Global _ACTION_WORD_ := 1
Global _ACTION_PHRASE_ := 2
Global _ACTION_CLOZE_ := 3

Global sInputFile := "j:\AHK2\English-7A.txt"  ; 輸入的設定檔, 檔案編碼:UTF-8
;;Global sOutputFolder := "j:\JERRY\MOC\060-Anki\English-7\English-7-1-words\"
Global sSeparator := A_Tab  ; 輸入檔的分隔字元

Global action_word

; 要產生的模板
; {1}=單字 {2}=詞類+中文解釋 {3}=音標 {4}=空白未用
action_word := "
(
---
tags:
  - english
  - english-word
  - english-7A
---
# {1}

---
---

{2}

{3}
{4}
)"  ; action_word

;f1::
oInputBox := InputBox("輸入設定檔名:", "輸入檔名", "w300 h100", sInputFile)
if (oInputBox.Result = "Cancel") {
  Return
}
sInputFile := oInputBox.Value

if !FileExist(sInputFile) {
  MsgBox(sInputFile . "必須先建立。", "Error!", 0)
  Return
}
_iCount := 0

FileEncoding "UTF-8"

_sTags := ""
_sOutputFolder := ""
_aEnglishWords := []
_aOutputFolders := []
_iWordCount := 0

; 為了顯示進度條,將要處理的單字加入陣列,並找出單字數目
Loop read, sInputFile
{
  iLineNumber := A_Index
  Loop parse, A_LoopReadLine, "`n"
  {
    ;MsgBox line #%A_Index%=%_sLine%.
    _sLine := A_LoopField
    _sFirstChar := SubStr(_sLine, 1, 1)
    if (_sFirstChar == ";" or _sFirstChar == "#") {  ;; 第一個字元分號或井號是註解行
      continue
    }
    if (_sFirstChar == "/") {  ;; 第一個字元 / 指定輸出資料夾
      _sOutputFolder := SubStr(_sLine, 2, 255)
      _sLastChar := SubStr(_sOutputFolder, StrLen(_sOutputFolder) - 1, 1)
      if (_sLastChar != "\") {
        _sOutputFolder := _sOutputFolder . "\"
      }
      if (!FileExist(_sOutputFolder)) {
        DirCreate(_sOutputFolder)
      }
      continue
    }
    _iWordCount++
    _aEnglishWords.Push(_sLine)
    _aOutputFolders.Push(_sOutputFolder)
  }
}  

_fProgressInc := Float(100 / _iWordCount)  ; 進度條每次要增加的數字
MyGui := Gui()
oText := MyGui.Add("Text", "w200", "產生總數: " . "0 / " . _iWordCount)
MyGui.Add("Progress", "w200 h20 cBlue vMyProgress", 0)
MyGui.Show()

_iCount := 0
Loop _iWordCount
{
  _sEnglishWord := _aEnglishWords[A_Index]
  _sOutputFolder := _aOutputFolders[A_Index]
  _iCount++

  oText.Value := "產生總數: " . _iCount . " / " . _iWordCount
  MyGui["MyProgress"].Value := _iCount * _fProgressInc
  output(_ACTION_WORD_, _sOutputFolder, _sEnglishWord, "", "")
}
MyGui.Destroy

MsgBox("處理數: " . _iCount, "Result", 0)
ExitApp(0)
Return

;; 寫出單字 sNotion: 詞性
output(iActionKind, sOutputFolder, sEnglish, sChinese, sNotion) {
  ;MsgBox("Text " . sEnglish . "=" . sChinese, "Title", 0)
  local _sOutput, _aTokens, _sChineseGet, _sNotion

  if (iActionKind == _ACTION_WORD_) {  ; 單字
    action := action_word
    try {
      _aTokens := translate(sEnglish)  ; 取翻譯、音標與詞類
      _sChineseGet := _aTokens[_EXPL_]
      _sNotion := _aTokens[_NOTION_]  ; 詞類
      ;; \r與\t會造成寫入失敗,必須先行轉換
      _sChineseGet := StrReplace(_sChineseGet, "`r", " ")
      _sChineseGet := _sNotion . " " . StrReplace(_sChineseGet, "`t", " ")
      _sEnghishGet := " " . _aTokens[_PRONOUNCE_]
      _sEnghishGet := StrReplace(_sEnghishGet, "`r", " ")

      _sOutputFilename := sEnglish . ".md"
      if (FileExist(sOutputFolder . _sOutputFilename)) {
        FileDelete(sOutputFolder . _sOutputFilename)
      }
      _sOutput := Format(action, sEnglish, _sChineseGet, _sEnghishGet, "")
      FileAppend(_sOutput, sOutputFolder . _sOutputFilename)
      return 1
    } catch (Error as err) {
      MsgBox(sEnglish . " " . err.Message, "Error!", 0)
      return 0
    }
  }
}

;; 傳入要搜尋的文字,傳回查詢到的結果
;; 再將結果以Markdown格式輸出到檔案
translate(sSearch) {
  ;msgbox sSearch=%sSearch%
  url := "https://tw.dictionary.search.yahoo.com/search?p=" . sSearch . "&fr=sfp&iscqry="

  httpClient := ComObject("WinHttp.WinHttpRequest.5.1")
  httpClient.Open("POST", url, false)
  httpClient.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded")
  httpClient.Send()
  httpClient.WaitForResponse()
  Result := httpClient.ResponseText

  html := ComObject("HTMLFile")
  html.write(Result)

  elements := html.getElementsByTagName("div")
  _sPronounce := ""  ; 發音
  _sNotion := ""     ; 詞類
  _sDictionaryExplanation := ""  ; 解釋

  _isFirstNotion := true
  _isFirstExplain := true
  ;MsgBox("length=" . elements.Length, "Length", 0)
  Loop elements.length
  {
    ele := elements(A_Index - 1) ; zero based collection. 不能用 []
    _sClassName := ele.className

    if (InStr(_sClassName, "pos_button") > 0) and (_isFirstNotion) {  ; 詞類
      _sNotion := ele.innerHTML
      _sNotion := StrReplace(_sNotion, "[", "\[")  ; n.[C]改成 n.\[C]
      _isFirstNotion := false
    } else if (InStr(_sClassName, "compList d-ib") > 0) {  ; 音標
      _sPronounce := ele.innerText
      _iPos := InStr(_sPronounce, "DJ[")
      _sPronounce := SubStr(_sPronounce, 1, _iPos - 1)
      _sPronounce := StrReplace(_sPronounce, "[", "\[")  ; KK[改成 KK\[
      ;Msgbox("pronounce="  _sPronounce, "pronounce", 0)
    } else if (InStr(_sClassName, "dictionaryExplanation") > 0 and _isFirstExplain) {
      _sDictionaryExplanation .= ele.innerHTML . "`r"
      _sDictionaryExplanation := StrReplace(_sDictionaryExplanation, "[", "\[")
      _isFirstExplain := false
    }
  }
  ;;MsgBox("expl=" . _sDictionaryExplanation . ", notion=" . _sNotion . ", pron=" . _sPronounce, "title",0)
  _aTokens := []
  _aTokens.Push(_sDictionaryExplanation, _sNotion, _sPronounce)

  return _aTokens
}

3. 💡 相關鏈接

💡 解說文章: https://jdev.tw/blog/8408/
✅ AutoHotkey下載: https://www.autohotkey.com/download/
✅ Google Drive原始碼、執行檔與範例設定檔下載: https://drive.google.com/drive/folders/1hoznn6SMcwkGCvAUPek5ODGMlDSNAYfO?usp=sharing
✅ yanki1.ahk 原始碼: https://gist.github.com/emisjerry/5e460bd0ea47e5a58871ed4fa6077fad

4. 教學影片

https://youtu.be/X4c4MItuBS8

##

您可能也會有興趣的類似文章

Obs164|將一篇英文文章製作成Anki閃卡的步驟,使用Yanki、ChatGPT(Copilot)與Note Splitter

$
0
0

本次展示將一篇英文文章製作出Anki閃卡的步驟,即拆分每一句以建立一張含反向卡片的筆記,再透過Yanki外掛同步到Anki系統。使用到的外掛如下:

  • Copilot: 調用ChatGPT執行英譯中與生成卡片格式
  • Note Splitter: 依指定的分隔文字將一則筆記產生成多則筆記
  • Yanki: 將產生的多則筆記同步到Anki系統

1. 生成需要的筆記內容

我使用下列的Prompt以產生需要的內容:

將%BEGIN%與%END%之間的英文以"."為分隔字元而切割成數句,每句生成為指定格式,格式中有7行:
第1行: 該句原有的英文文字
第2行: 空行
第3行: 三個減號
第4行: 三個減號
第5行: 空行
第6行: 將該句英文轉換為繁體中文
第7行: 三個井號

%BEGIN%
貼入文章
%END%

如果只要產生成無反向卡片的基本型(Yanki - Basic),只要把第3行刪掉再調整數字順序即可。

▼ 範例

將%BEGIN%與%END%之間的英文以"."為分隔字元而切割成數句,每句生成為指定格式,格式中有7行:
第1行: 該句原有的英文文字
第2行: 空行
第3行: 三個減號
第4行: 三個減號
第5行: 空行
第6行: 將該句英文轉換該句為繁體中文
第7行: 三個井號

%BEGIN%
In the small town of Greenfield, there was a popular animal show every year. This year, the main point of attraction was a picture gallery of various animals. There was a picture of a lion chasing a zebra, a monkey trying to catch a bee, and even a goose standing next to a hippo. The children loved it.

Tommy's favorite was the picture of the elephant. He said, "It's so strong and big, yet it has such gentle eyes." His sister, Lucy, liked the picture of the frog. "It's green and looks so clean," she said. But their cousin, Jake, was more interested in the footprint section. He loved studying the different footprints animals left behind.
%END%
  1. 將準備好的Prompt複製到Copilot輸入框再按【Send】,待ChatGPT回應後複製整個輸出
  2. 將複製內容貼入新建筆記內或點擊Copilot的【Save as a Note】

2. 用Note Splitter切分檔案

ChatGPT生成的部份結果如下:

In the small town of Greenfield, there was a popular animal show every year.

---

---

在Greenfield的小鎮上,每年都有一個受歡迎的動物展。

###

This year, the main point of attraction was a picture gallery of various animals.

---

---

今年,主要的吸引點是各種動物的圖片畫廊。

###
  1. 進入設定(Settings)→第三方外掛程式(Community Plugins),找到Note Splitter,將分隔字元(Delimiter)變更成###
  2. 也可考慮將輸出資料夾(Output folder)指定到Anki的資料夾。
  3. Use first line as title可以把每個分隔段落裡的第一句變成檔名和標題,但不建議使用,第一句裡可能會有特殊字元(如冒號、雙引號等)會造成無法建立檔案的錯誤。

gh|700

  1. 在新建筆記裡按Ctrl/Cmd+P於命令面板裡執行【Split by delimiter】
  2. 查看指定的輸出資料夾裡是否正確的產生檔案
  3. 將產生在note-splitter裡的檔案複製到特定的Yanki資料夾裡(例:/060-Anki/English-7/English-7A-1-sentences/)
  4. 刪除新建筆記檔

3. 用Yanki同步到Anki系統

  1. 確認Anki系統已經啟動
  2. Ctrl/Cmd+P於命令面板裡執行【Sync flashcard notes to Anki】
  3. 開啟Anki視窗,查看牌組裡是否已產生對應的卡片。先前在筆記類型裡插入了AwesomeTTS附加元件,因此卡片正面亦能播音

gh|700

4. 💡 相關鏈接

💡 解說文章:
✅Copilot: https://github.com/logancyang/obsidian-copilot
✅Note Splitter plugin: https://github.com/decaf-dev/obsidian-note-splitter
✅Yanki plugin: https://github.com/kitschpatrol/yanki-obsidian

5. 教學影片

##

您可能也會有興趣的類似文章

Obs165|用Copilot (ChatGPT)與Yanki產生Anki的注音閃卡

$
0
0

產生了多個英文的Anki閃卡後,這次來生成國文的注音閃卡,使用到的外掛是:

  1. Copilot: 調用ChatGPT生成卡片格式與注音
  2. Note Splitter: 依指定的分隔文字將一則筆記產生成多則筆記
  3. Yanki: 將產生的多則筆記同步到Anki系統

1. 用Copilot生成筆記

  • 第7~9行指示其下方是Extra欄位的內容
  • Extra欄位供音訊使用,正面的「、」會造成播音錯誤
    將%BEGIN%與%END%之間的每行文字產生為指定的11行格式,格式定義如下:
    第1行: 完整文字,但第一個雙引號轉換為「,第二個雙引號轉換為」(例如"釐"清要轉換成「釐」清)
    第2行: 空行
    第3行: 三個減號
    第4行: 三個減號
    第5行: 空行
    第6行: 生成以雙引號夾位的文字的注音,前後沒有雙引號的文字不生成注音,但原文字要產生(例如 "清"楚 要生成 ㄑㄧㄥ楚),不可省略聲調符號
    第7行: 空行
    第8行: 三個減號
    第9行: 空行
    第10行: 完整文字,但刪除所有的雙引號
    第11行: 3個井號
    %BEGIN%
    "釐"清
    傳"誦"
    "謀"財害命
    浪"費"
    "遲"到
    "逛"
    %END%

生成的結果:

「釐」清

---

---

ㄌㄧˊ清

---

釐清
###

「傳」誦

---

---

ㄔㄨㄢˋ誦

---

傳誦
###

「謀」財害命

---

---

ㄇㄡˊ財害命

---

謀財害命
###

「浪」費

---

---

ㄌㄤˋ費

---

浪費
###

「遲」到

---

---

ㄔˊ到

---

遲到
###

「逛」

---

---

ㄍㄨㄤˋ

---

逛
###

2. 用Note Splitter切分檔案

  • Note Splitter的分隔字元(Delimiter)設定為###
  • Ctrl/Cmd+P執行Split by delimiter命令
  • 將/note-splitter資料夾裡的檔案搬移到Yanki的掃描資料夾對應位置

3. 用Yanki同步至Anki系統

  • Ctrl/Cmd+P執行Sync flashcard notes to Anki命令

4. 調整Anki系統的筆記類型

在Anki系統裡操作:

  • 管理筆記類型→找到Yanki - Basic (and reversed card with extra)→點擊有側的【卡片】
  • 正面模板裡有TTS的播音按鈕,以JavaScript將之隱藏
    • Anki系統的模板可視為網頁,{{Front}}欄位就像是PHP(<?= ?>)、ASP(<%= %>)或JSP<%= %>裡表達式標籤(Expression Tag)
  • 用系統欄位"{{Deck}}"判斷牌組名稱是否以Chinese開頭,若是則隱藏TTS按鈕

▼ 正面模板

{{Front}}
<br>

{{#Extra}}
<div id="EXTRA">
{{tts en_US voices=Microsoft_Mark:Extra}}
</div>
{{/Extra}}

{{^Extra}}
<div id="FRONT">
{{tts en_US voices=Microsoft_Mark:Front}}
</div>
{{/Extra}}

<script>
  var sDeck = "{{Deck}}";

  if (sDeck.indexOf("Chinese") >= 0) {
    elem = document.getElementById("FRONT");
    if (elem) {
      elem.style.display = "none";
    }
    elem = document.getElementById("EXTRA");
    if (elem) {
      elem.style.display = "none";
    }
  }
</script>

[!question] 背面播放中文音訊?
Anki系統的TTS欄位是靜態解析,只要有{{tts}}就無法用JavaScript停用,如果有{{tts}}會造成不需要的英文背面也播音,因此無法在背面模板裡使用{{tts}}

5. 模板直接使用音訊檔

中文閃卡背面播音最後使用AwesomeTTS產生靜態音訊檔來處理。

  1. 瀏覽找到要處理的閃卡資料夾
  2. 全選卡片→功能表 AwesomeTTS→【Add Audio to Selected...】
  3. 用Microsoft Speech API JScript或Google Translate,右方Source Field選擇要播音的Extra欄位,插入音訊到Back面板
  4. 按Generate產生mp3檔。mp3檔會產生在 C:\Users\使用者帳戶\AppData\Roaming\Anki2\設定檔名\collection.media

gh

6. 💡 相關鏈接

💡 解說文章: https://jdev.tw/blog/8488/
✅Copilot: https://github.com/logancyang/obsidian-copilot
✅Note Splitter plugin: https://github.com/decaf-dev/obsidian-note-splitter
✅Yanki plugin: https://github.com/kitschpatrol/yanki-obsidian範例: https://gist.github.com/emisjerry/eaada7ec56f8ceba24f74490049e645f
✅ 模板範例: https://gist.github.com/emisjerry/eaada7ec56f8ceba24f74490049e645f

7. 教學影片

https://youtu.be/Y-CkNWFmGCE

##

您可能也會有興趣的類似文章

Obs166|捲土重來的Obsidian Note From Template終於修正小瑕疪而能正確運行了!推薦使用!

$
0
0

Obsidian Note From Template(簡稱From Template)是我最常用的模板外掛(Templater外掛則只要用來撰寫腳本),最近兩周終於釋出了更新版本,在新版本裡解決了原有的問題,並且提供了更放的動態功能,非常值得朋友們試用。

1. 功能展示

```button
name 建立新筆記
type command
action From Template: from-template-Note
color purple

^button-newNote

name 建立新書籍
type command
action From Template: from-template-Book2
color green

^button-newBook2

name 開啟新筆記模板
type link
action obsidian://advanced-uri?vault=MOC&filepath=011-From-Template/From-Template-Note
color purple

^button-openNewNoteTemplate

name 開啟新書籍模板
type link
action obsidian://advanced-uri?vault=MOC&filepath=011-From-Template/From-Template-Book2
color green

^button-openNewBook2Template

▼ 範例3:建立課程學習Anki筆記

aliases:
grade: "{{年級:choice:7A:7B:8A:8B:9A:9B}}"
subject: "{{科目:choice:國文:英文:數學:地理:歷史}}"
created: '{{建檔日期:currentDate:"yyyy-MM-dd HH\:mm\:ss"}}'
modified: '{{建檔日期:currentDate:"yyyy-MM-dd HH\:mm\:ss"}}'
tags:

  • "{{年級}}"
  • "{{科目}}"
  • "{{年級}}-{{科目}}"
    AutoNoteMover:
  • disable
    disabled rules:
  • all
    template-output: 060-Anki/{{年級}}/{{科目}}
    template-input: title,body
    template-should-replace: sometimes
    template-should-create: open-tab

    {{title}}

{{問題:area}}


{{body}}


## 2. 改進
1. {{title}}已能正常使用中文,能正確產生檔案
2. 能動態產生到特定資料夾
3. YAML內的tags已能正確產生表列式的標籤
4. 時間格式能使用 : 但尚有小Bug
5. 建檔失敗會有更清楚的提示

## 3. 自訂欄位重點
- 自訂欄位格式:{{欄位}}
- 自訂欄位類型
    1. 文字行型態:{{欄位:text}}(可省略:text);指定預設值:{{欄位:text:預設值}}
    2. 文字框型態:{{欄位:area}}{{body}}預設是area
    3. 日期時間型態:{{欄位:currentDate:格式}},如:'{{createdOn:currentDate:"yyyy-MM-dd HH\:mm\:ss"}}'
    4. 單選型態:`{{欄位:choice:選項1:選項2:選項3}}
    5. 複選型態:`{{欄位:multi:選項1:選項2:選項3}}
- 唯讀欄位,編輯中筆記的標題與其路徑:{{currentTitle}}{{currentPath}}
- 自訂欄位後方可加入|提示文字以產生提示文字

## 4. 建檔指引(YAML欄位)
依據模板而建立的檔案產生的方式是透過YAML區裡的下列欄位來設定的;這些欄位是設定在模板裡,不會產生到新筆記:

| Name                    | Value                                                                                                                                                                                                                           | Default                            |     |
| :---------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | :--------------------------------- | --- |
| template-id             | Unique ID for the template                                                                                                                                                                                                      | Lowercase version of the base name |     |
| template-name           | Name for the command                                                                                                                                                                                                            | Base name of the file              |     |
| template-output         | Directory to save the output
**存檔資料夾。能使用自訂欄位以達成動態資料夾之操作,例如:**Projects/{{project_select}} | 建議使用 Inbox | | | template-filename | Filename for the created note. Will have .md appended. Note: if you set a different filename, then make sure to use {{filename}} in the template-replacement strings if you want to link to the file. | {{title}} | | | template-should-replace | Should the template write text back to the document? "always", "sometimes" = only if text is selected, "never"
**是否要把template-replacement格式的資料寫回編輯中的筆記?** | "sometimes" | | | template-replacement | A Mustache template to replace the selected text in the editor with. Can pass a list, which will appear as buttons in creator
**回寫至編輯中筆記的預設格式** | \[\[{{title}}]]1 | | | template-input | If the command is called with some text selected, split it up using the plugin's split pattern, and put the values into those fields
**依外掛選項裡的Selection split設定,分別將資料填入{{title}}與{{body}}** | title,body2 | | | template-should-create | Should the template make and open a note? "none"=no note, "create"= create but don't open, "open"=create and open in current editor, "open-pane" = create and open in new pane, "open-tab" = open in new tab
**檔案產生完畢後如何開啟** | "open-tab" | | >[!warning] 額外說明 > 1. README錯誤:template-replacement的預設值應該是[[{{title}}]]才對,原網頁有錯 > 2. 預設的分隔設定是\s+-\s+表示分隔字串是一或多個空白-一或多個空白分隔成兩段字串,分別填入{{title}}{{body}} >[!tip] 時間格式如何指定? > - 欄位設定以 : 分隔,而時間裡需要:時在前方加上反斜線(\) > - 產生時最後一個 :會多出反斜線,儲存後自動消失。不使用秒數亦可解決 > - 範例:'{{建檔日期:currentDate:"yyyy-MM-dd HH\:mm\:ss"}}' ## 5. 示範

Obs165|用Copilot (ChatGPT)與Yanki產生Anki的注音閃卡 - 產生了多個英文的Anki閃卡後,這次來生成國文的注音閃卡,使用到的外掛是:

  1. Copilot: 調用ChatGPT生成卡片格式與注音
  2. Note Splitter: 依指定的分隔文字將一則筆記產生成多則筆記
  3. Yanki: 將產生的多則筆記同步到Anki系統

6. 💡 相關鏈接

✅ Obsidian Note From Template: https://github.com/mo-seph/obsidian-note-from-template
✅ [Obs#71] 新手適用的多功能模板外掛:From Template: https://youtu.be/pzA66MwozsY
✅ Obs072-Step by Step From Template建立筆記實例操作: https://youtu.be/CdxABcKYdts

💡 From Template模板範例
✅ 新筆記模板: https://gist.github.com/emisjerry/0c0cd687aca93d5dcbab50c86b21db91

✅ 新書籍模板: https://gist.github.com/emisjerry/cf58c316b92a941a9025d31fd19c343b

7. 教學影片

https://youtu.be/Y-CkNWFmGCE

##

您可能也會有興趣的類似文章

使用mpv播放mp3檔案的方法

$
0
0

用mpv播放mp3時,視窗大小與播mp4時不同,不需要開啟到最大,因此使用--config-dir指定專門給mp3用的設定資料夾,以茲區分。

1. mp3-conf 設定資料夾

  • 建立mp3.bat,執行時傳入mp3檔名
    start "mpv" c:\util\mpv\mpv.exe --config-dir=c:\util\mpv\mp3-conf\ %1

c:\util\mpv\mp3-conf\mpv.conf設定下列參數:

  1. 畫面不放成全螢幕,並加視窗邊框以方便拖拉
  2. 持續在畫面內顯示檔名
fullscreen=no
border=yes
script-opts-append=osc-visibility=always
# OSD 顯示檔名
osd-playing-msg=File: ${filename}
# OSD 訊息持續時間(ms)
osd-playing-msg-duration=3600000

##

您可能也會有興趣的類似文章


J_Target:錄製教學影片工具-游標高亮呈現,聚焦內容重點 (Windows適用)

$
0
0

如果經常需要錄教學影片,那麼游標高亮顯示能達到聚焦的功能,今天介紹能免費使用、來自日本的工具:J_Target,有下列幾項功能:

  • 游標高亮顯示
  • 左/右鍵點擊效果:以文字或動畫顯示,可同時設定音效
  • Drag/Drop操作效果:以文字或動畫顯示,可同時設定音效
  • 劃框
  • 局部放大
  • 擷取螢幕

[!tip] 說明文件
安裝資料夾裡有說明文件:J_Target_UserManual.pdf

[!warning] 注意!
Draw的Transparency (透明度)要設定為100%,以免錄影劃線時受影響(畫面會受透明度影響)

1. 💡 相關鏈接

💡 解說文章:
✅J_Target_en: https://sites.google.com/view/vector-juyuyun/%E3%83%9B%E3%83%BC%E3%83%A0/j_target/j_target_en?authuser=0
✅ YouTuber錄製影片利器:滑鼠游標螢光高亮顯示和畫筆、聚光燈等引人注目✅: https://yout.be/uJ45n9uTnzs
✅ ppInk:免費、開源的電子白板畫筆工具,簡報、教學錄影必備!: https://yout.be/WWfCsyoykXo

2. 教學影片

https://youtu.be/FroL7YIYW7s

##

您可能也會有興趣的類似文章

Obs167|複製Dataview表格成為Markdown格式的外掛:Enhanced Copy與Dataview Serializer

$
0
0

gh|500

有時需要將Dataview產生的資料複製出來做第二次利用,此時Dataview Serializer外掛就能發揮方便的功用。

Obs130-用Dataviewjs將Dataview表格產生成Markdown格式並複製到剪貼簿的技巧介紹了使用Dataviewjs以JavaScript在表格下方添加Copy按鈕,將查詢內容的Markdown產生到剪貼簿的作法,雖然也能取得Markdown內容,但要撰寫腳本,還是稍嫌麻煩。

今天介紹兩個取得Dataview表格的外掛:Dataview Serialize與Enhanced Copy。

Dataview Serialize能將Dataview的輸出(表格或列表)產生成Markdown內容,再複製此Markdown內容就能拿來再使用了。

而另一個Enhanced Copy外掛則是可將之替換成Obsidian內建的複製按鍵 Ctrl+C,在設定裡啟用能複製Dataview與Dataviewjs的內容,在執行Copy selected text命令時,就能將Dataview的表格以Markdown的格式複製到剪貼簿。

以操作的便利性來看,Enhanced Copy比較方便。

1. Enhanced Copy外掛

1.1. 範例

用Dataviewjs列出所有Obsidian的命令,再使用Enhanced Copy快速的取得其Markdown內容。

  • 參考:[Obs127-用Templater Hotkeys簡化Obsidian自動化腳本](Obs127-用Templater Hotkeys簡化Obsidian自動化腳本)

2. Dataview Serialize外掛

2.1. 語法

  • 將要序列化的Dataview語言寫在<!-- QueryToSerialize: -->之間
  • 注意:Dataview敘述之間不能有換行符號
    gh

外掛掃描指定的資料夾筆記,找到QueryToSerialize的註解片段時,自動產生下列內容:

gh

2.2. 設定

  • 外掛選項裡可設定要掃描的資料夾,指定的資料夾內的筆記才會解析QueryToSerialize的註解片段
  • 外掛選項裡亦可設定排除掃描的資料夾
  • 可執行Scan and serialize all Dataview queries命令掃描Dataview查詢

2.3. 範例

  • 切換到原始碼模式以查看序列化後的Markdown內容


筆記 type Created Modified
[[AHK64|用AutoHotkey V2產生Yanki MD檔,快速建立Anki閃卡]] 專案筆記 2024-08-09 2024-08-10
[[Anki-05-Autohotkey-generates-flashcards]] 專案筆記 2022-03-26 2023-04-26
[[Anki-06-yomichan]] 專案筆記 2022-03-26 2023-08-15
[[Anki#3 單詞寶:快速新增英文字卡的Addon之一]] 專案筆記 2022-03-26 2023-12-14
[[Saladict 與Anki整合]] 專案筆記 2022-03-26 2023-08-30

▼ Dataview表格

table without ID file.link as 筆記, type, substring(created,0,10) as Created, 
  substring(modified ,0,10) as Modified from #anki where type="專案筆記"
limit 5 sort file.name

3. 💡 相關鏈接

💡 解說文章:
✅ Enhanced Copy: https://github.com/Mara-Li/obsidian-enhanced-copy
✅ Dataview Serializer: https://github.com/dsebastien/obsidian-dataview-serializer
✅ 官方文件 Obsidian Dataview Serializer: https://developassion.gitbook.io/obsidian-dataview-serializer
✅ 列出所有命令 Obs127-用Templater Hotkeys簡化Obsidian自動化腳本: https://youtu.be/U8HDmoQAwts

4. 教學影片

https://youtu.be/HiNdC7Mmnh4

##

您可能也會有興趣的類似文章

Anki07|Anki 文字轉語音服務(TTS)整合攻略

$
0
0

新版的Anki早已經預設整合了TTS (Text to Speech)功能了!支援的最低版本如下:

  • Anki 2.1.20 (2020年3月7日)
  • AnkiMobile 2.0.56
  • AnkiDroid 2.17

使用的方法是在卡片的正面模板與背面模板裡直接插入 {{tts}} 欄位。
因此未安裝AwesomeTTS、HyperTTS與gTTS等附加元件時,Anki仍能做文字轉語音的播放操作。

1. 內建TTS欄位

[!info] {{tts}}格式

  • 欄位格式:{{tts 語言代碼:播音的欄位}}{{tts 語言代碼 voices=語音種類:播音的欄位}}
  • 範例:{{tts en_US:Front}}{{tts zh_TW voices=Microsoft_Yating:Extra}}

使用前可以先用下列欄位列出到使用的語音服務:

{{tts-voices:}} 可列出所有可使用的語音服務

▼ 預設的語音服務選項

TTS voices available:
{{tts en_GB voices=Microsoft_George}}
{{tts en_GB voices=Microsoft_Hazel}}
{{tts en_GB voices=Microsoft_Hazel}}
{{tts en_GB voices=Microsoft_Susan}}
{{tts en_US voices=Microsoft_David}}
{{tts en_US voices=Microsoft_David}}
{{tts en_US voices=Microsoft_Mark}}
{{tts en_US voices=Microsoft_Zira}}
{{tts en_US voices=Microsoft_Zira}}
{{tts zh_CN voices=Microsoft_Huihui}}
{{tts zh_CN voices=Microsoft_Huihui}} (unavailable)
{{tts zh_CN voices=Microsoft_Kangkang}} (unavailable)
{{tts zh_CN voices=Microsoft_Yaoyao}} (unavailable)
{{tts zh_TW voices=Microsoft_Hanhan}}
{{tts zh_TW voices=Microsoft_Hanhan}} (unavailable)
{{tts zh_TW voices=Microsoft_Yating}} (unavailable)
{{tts zh_TW voices=Microsoft_Zhiwei}} (unavailable)
One or more voices are unavailable. Installing a Windows language pack may help.

2. 部份內容播音

  • 使用[anki:tts][/anki:tts]能達到指定內容播音的功能
  • 可省略Anki模板設定插入{{tts}}的操作,且{{tts}}必須使用欄位,[anki:tts]則可靈活指定內容
  • 官方文件裡說明[anki:tts]的內容能使用{{欄位}},但實測無法成功
[anki:tts lang=zh_TW]some text[/anki:tts]

▼ 範例

7A-1
# 「朦朧」的發音和解釋

---

朦ㄇㄥˊ
朧ㄌㄨㄥˊ
📝 模糊不清的樣子,此處形容月色昏暗。

[anki:tts lang=zh_TW voices=Microsoft_Yating]
答案是:
朦朧
模糊不清的樣子,此處形容月色昏暗。
[/anki:tts]

3. 💡 相關鏈接

💡 解說文章:
✅Field Replacements - Anki Manual: https://docs.ankiweb.net/templates/fields.html?highlight=TTS#text-to-speech-for-individual-fields

4. 教學影片

https://youtu.be/a5mgXi6Wvv4

##

您可能也會有興趣的類似文章

Obs168|建立From Template模板命令的功能表,快速選取要使用的筆記模板

$
0
0

From Template操作的幾個重點:

  • 模板檔必須存放在指定的資料夾裡
  • 建立新的模板檔後必須執行【Re-Index Templates】讓From Template系統重新索引
  • 索引後,每個模板檔會自動建立一個命令,因此每個模板皆可賦予不同的快捷鍵使能快速操作

但隨著模板檔的增加,勢必不太可能去記憶每個模板檔的按鍵,本次介紹使用Templater Hotkeys以腳本建立一個From Template的模板功能表,再指派快捷鍵給這個腳本,這樣應該能方便許多。

1. 找出From Template模板的命令

建議使用方法2 DevTools,比較簡單。

1.1. 用Dataviewjs

請參考Obs127-用Templater Hotkeys簡化Obsidian自動化腳本的介紹。

1.2. 用DevTools 👍

  1. 在Obsidian裡按 Ctrl+Shift+I開啟開發工具DevTools
  2. 點擊Console(主控台)分頁
  3. > 提示內輸入命令:app.commands.listCommands(),按 Enter執行
  4. 在出現的內容按右鍵→Copy object
  5. 將系統剪貼簿內容貼入文字編輯器,即可取到所有命令

gh|700

gh|700

2. 撰寫Templater腳本

  • 由步驟1查出模板檔的命令,命令應該是obsidian-notes-from-template:全部小寫的檔名
  • 如果模板檔名無固定格式,程式中自行判斷type再提供對應的命令
<%*
// Run From-Template, Hotkey: Alt+V
let aTypes = ["1. Note", "2. Book2", "3. Anki", "4. Anki-reversed"];
let type = await tp.system.suggester(aTypes, aTypes, false, "選擇From Template模板");
if (!type) return;
type = type.substring(3).toLowerCase();
app.commands.executeCommandById("obsidian-notes-from-template:from-template-" + type);
-%>

3. 在Templater選項裡登記Hotkeys

  • Community Plugins→找到Templater選項→Templater hotkeys→Add new hotkey for template→選用新寫好的腳本檔
    gh

4. 指派快捷鍵

  • 開啟快捷鍵視窗,找到Templater腳本檔後指派快捷鍵。
  • 測試快捷鍵能否正確使用

5. 💡 相關鏈接

💡 解說文章:
✅ Obsidian Note From Template: https://github.com/mo-seph/obsidian-note-from-template
✅ [Obs#71] 新手適用的多功能模板外掛:From Template: https://youtu.be/pzA66MwozsY
✅ Obs072-Step by Step From Template建立筆記實例操作: https://youtu.be/CdxABcKYdts
✅ Obs127-用Templater Hotkeys簡化Obsidian自動化腳本: https://youtu.be/U8HDmoQAwts

6. 教學影片

##

您可能也會有興趣的類似文章

Anki08|製作帶注音符號的國字卡片的步驟

$
0
0

為了製作國中七年級的國文習字Anki卡片,研究了一下添加注音符號的操作方法,彙總在此,希望對於有需要的朋友們會有幫 。

方法1需要比較多的步驟,若你嫌麻煩,也可直接使用方法2。

1. 方法1. 使用帶加注音符號的字型檔

重點是將字型檔加入Anki的牌組集合內,如此才能在不同設備間同步。

[!danger] 注意!
破音字無法正確顯示,必須手動處理(以方法二自行輸入正確的注音)。

  1. ButTaiwan/bpmfvs: 注音IVS字型規格 Bopomofo IVS Font Specification 下載能免費使用的ㄅ注音芫荽字型,並安裝到Windows系統,字型檔路徑:C:\Users\使用者帳號\AppData\Local\Microsoft\Windows\Fonts\BpmfIansui-Regular.ttf

  2. 若有使用Obsidian,則在有改用的CSS片段裡增加下列CSS類別:

    .yin {
    font-size: 2em;
    font-family: "ㄅ注音芫荽";
    }
    ruby {
    font-size: 2em;
    }
  3. 找到牌組的集合媒體資料夾:C:\Users\使用者帳號\AppData\Roaming\Anki2\牌組名\collection.media,將上述BpmfIansui-Regular.ttf複製到牌組的集合媒體資料夾,並改名為_BpmfIansui-Regular.ttf(最開頭加上一個底線)

  4. 啟動Anki系統,【工具】→【管理筆記類型】→找到要修改的筆記類型後按右側的【卡片】→進入模板的【樣式】輸入框

  5. 新增下列內容到樣式,定義了字型yin (檔名是_BpmfIansui-Regular.ttf)與yin CSS類別:

    @font-face { font-family: yin; src: url('_BpmfIansui-Regular.ttf'); }
    /* "ㄅ注音芫荽"; */
    .yin {
    font-size: 2em; /* 字型大小放大兩倍 */
    font-family: "yin";
    }
    ruby {
    font-size: 2em; /* 字型大小放大兩倍 */
    }
  6. 瀏覽牌組並修改測試卡片,點擊Back右側的<>以進入HTML模式,並插入下列HTML內容:

    <div class="yin">
    慫恿
    </div>
  7. 瀏覽此測試卡片,最下方出現了帶有注音的芫荽字型
    gh|300

  8. 點擊Anki應用程式的同步

  9. 用瀏覽器瀏覽 AnkiWeb 並檢查卡片在網頁是否顯示正確
    gh|300

  10. 手機的AnkiDroid App執行同步,檢查手機是否也能顯示注音
    gh|300

2. 方法2. 用HTML ruby標籤

使用HTML的<ruby>系列標籤(參考:Obs040-日文學習利器!擴充為中文注音與拚音標記)。

  • <ruby>style屬性能指定注音顯示位置為上方(ruby-position:over)或下方(ruby-position:under)
  • 無法顯示在右方
<ruby style="ruby-position:over">
慫恿<rt>ㄙㄨㄥˇㄩㄥˇ</rt></ruby>

▼ 第一行是使用<ruby>,第二行是芫荽字型
gh

3. Anki卡片內容

以下是使用Obsidian Yanki外掛組成的正面(---上方)與背面(---下方)內容:

慫恿
# 慫恿
的發音與解釋。

---

[anki:tts lang=zh_TW]慫恿[/anki:tts]

「鼓」動:激發。音ㄙㄨㄥˇㄩㄥˇ,從旁鼓動

<ruby style="ruby-position:over">
慫恿<rt>ㄙㄨㄥˇㄩㄥˇ</rt>
</ruby>

<div class="yin">
慫恿
</div>

4. 💡 相關鏈接

✅ ButTaiwan/bpmfvs: 注音IVS字型規格: https://github.com/ButTaiwan/bpmfvs/
✅ ㄅ注音芫荽字型檔下載: https://github.com/ButTaiwan/bpmfvs/releases

✅ Obs040-日文學習利器!擴充為中文注音與拚音標記 影片: https://youtu.be/KvdKm_KrOSM

5. 教學影片

https://youtu.be/_IbB8Cxk5iE

##

您可能也會有興趣的類似文章

Viewing all 904 articles
Browse latest View live