

<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Shell &#8211; MaxCodeReview</title>
	<atom:link href="https://codereview.max-everyday.com/tag/shell/feed/" rel="self" type="application/rss+xml" />
	<link>https://codereview.max-everyday.com</link>
	<description>分享Max收集的小程式</description>
	<lastBuildDate>Fri, 26 Dec 2025 13:29:18 +0000</lastBuildDate>
	<language>zh-TW</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.1</generator>

<image>
	<url>https://codereview.max-everyday.com/wp-content/uploads/2020/07/cropped-logo1_x512-32x32.jpg</url>
	<title>Shell &#8211; MaxCodeReview</title>
	<link>https://codereview.max-everyday.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>取得字體的包含文字</title>
		<link>https://codereview.max-everyday.com/get-font-chars/</link>
		
		<dc:creator><![CDATA[max-code-review-usr1]]></dc:creator>
		<pubDate>Thu, 20 Aug 2020 15:25:00 +0000</pubDate>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[字體]]></category>
		<category><![CDATA[Command]]></category>
		<category><![CDATA[Font]]></category>
		<category><![CDATA[FontForge]]></category>
		<category><![CDATA[Shell]]></category>
		<category><![CDATA[String]]></category>
		<guid isPermaLink="false">https://codereview.max-everyday.com/?p=1381</guid>

					<description><![CDATA[為什麼要學這個？ 可以知道某個字體檔定義了那 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image size-large is-style-default"><img fetchpriority="high" decoding="async" width="1024" height="1024" src="https://codereview.max-everyday.com/wp-content/uploads/2020/08/get_ttf_chars-1024x1024.jpg?v=1597937059" alt="" class="wp-image-1384" srcset="https://codereview.max-everyday.com/wp-content/uploads/2020/08/get_ttf_chars-1024x1024.jpg?v=1597937059 1024w, https://codereview.max-everyday.com/wp-content/uploads/2020/08/get_ttf_chars-300x300.jpg?v=1597937059 300w, https://codereview.max-everyday.com/wp-content/uploads/2020/08/get_ttf_chars-150x150.jpg?v=1597937059 150w, https://codereview.max-everyday.com/wp-content/uploads/2020/08/get_ttf_chars-768x768.jpg?v=1597937059 768w, https://codereview.max-everyday.com/wp-content/uploads/2020/08/get_ttf_chars-640x640.jpg?v=1597937059 640w, https://codereview.max-everyday.com/wp-content/uploads/2020/08/get_ttf_chars-50x50.jpg?v=1597937059 50w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<h2 class="wp-block-heading">為什麼要學這個？</h2>



<p>可以知道某個字體檔定義了那些文字，進行知道缺字是否有缺字，及之後要先補那些字進去。</p>



<p>下面提供2個範例:</p>



<ul class="wp-block-list">
<li>範例1: 取得 fontforge 專案下的文字清單.</li>



<li>範例2: 取得某一個目錄下, 以 unicode 為命名的文字清單.</li>
</ul>



<hr class="wp-block-separator has-css-opacity"/>



<h2 class="wp-block-heading">前置作業</h2>



<p>使用方式有2種:</p>



<ul class="wp-block-list">
<li>用法1: fontforge + python. (比較簡單)</li>



<li>用法2, 需要先安裝FontForge，把要處理的字體先存成.sfdir 的資料夾格式, 執行時單純地執行 python。</li>
</ul>



<p>FontForge執行檔下載：<br><a href="https://fontforge.org/en-US/">https://fontforge.org/en-US/</a></p>



<p>Max腳本檔案下載：<br><a href="https://github.com/max32002/MaxFontScripts/blob/master/get_ttf_chars.py">https://github.com/max32002/MaxFontScripts/blob/master/get_ttf_chars.py</a></p>



<hr class="wp-block-separator has-css-opacity"/>



<h2 class="wp-block-heading">使用方法</h2>



<p>同一個 python script, 有二種使用方法, 建議使用第一種, 在 fontforge 模式下.</p>



<p><strong>有</strong> fontforget 指令模式: <strong>(建議使用, 較有效率)</strong></p>



<pre class="wp-block-code"><code>fontforge get_ttf_chars.py font_forge.sfdir --output charset.txt</code></pre>



<p><strong>無</strong> fontforget 指令模式:</p>



<pre class="wp-block-code"><code>get_ttf_chars.py font_forge.sfdir --output charset.txt</code></pre>



<p></p>



<p><strong>參數說明：</strong></p>



<ul class="wp-block-list">
<li><code>&lt;輸入目錄&gt;</code> 參數，Font Forge 的 .sfdir 資料夾路徑。.sfdir 可以省略, 程式會自動增加, 輪入必需是一個已存在的 font forget project 目錄.</li>



<li><code>--output</code> 參數，用於輸出的文字檔.</li>



<li><code>--mode</code> 參數，預設值是 &#8220;fontforge&#8221;, 針對 fontforge 的專案檔做處理, 使用參數 &#8211;mode=unicode_image 可以取得使用 unicode 編碼的數字的圖片.</li>
</ul>



<p></p>



<p><strong>操作範例1：取得字型檔案(.ttf)的文字清單.</strong> (建議使用)</p>



<pre class="wp-block-code"><code>fontforget get_ttf_chars.py source.sfdir</code></pre>



<p></p>



<p><strong>操作範例2：取得 fontforge 專案(.sfdir)下的文字清單.</strong></p>



<pre class="wp-block-code"><code>get_ttf_chars.py source.sfdir</code></pre>



<p>使用範例：由於沒有指定輸出的文字檔, 預設會產生 source.txt 文字檔，裡面記錄 source.sfdir 有定義的文字。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p><strong>操作範例3：取得某一個目錄下, 以 unicode 為命名的文字清單.</strong></p>



<pre class="wp-block-code"><code>get_ttf_chars.py sp --mode=unicode_image</code></pre>



<p>執行結果:</p>



<pre class="wp-block-preformatted">input: sp<br>output: charset_sp.txt<br>charset length: 73</pre>



<p>結果說明: 輸入資料夾名稱: sp, 輸出檔名 charset_sp.txt, 內容長度: 73個字.</p>



<p>指定 &#8211;mode, 不是很直覺, 請改用下面的 script:</p>



<ul class="wp-block-list">
<li>取得字體的包含文字<br><a href="https://codereview.max-everyday.com/get-font-chars/">https://codereview.max-everyday.com/get-font-chars/</a></li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">字型與圖像字符集提取工具使用教學</h2>



<p>這個小工具可以幫你從字型檔案（.otf、.ttf、.woff、.woff2、.sfdir）或是圖像資料夾中，提取出裡面包含的字符集，並輸出成一個文字檔。對於想要了解字型包含哪些字，或是從圖像建立字符集的人來說，非常方便！</p>



<h3 class="wp-block-heading">使用前準備</h3>



<ol class="wp-block-list">
<li><strong>安裝 Python：</strong>如果你的電腦還沒有安裝 Python，請先到 <a href="https://www.python.org/downloads/">Python 官網</a> 下載並安裝。</li>



<li><strong>安裝 fontforge（如果需要處理字型檔案）：</strong>如果你需要處理字型檔案，你需要安裝 fontforge 這個工具。安裝方式會根據你的作業系統有所不同，請參考 <a href="https://fontforge.org/en-US/downloads/">fontforge 官網</a> 的說明。</li>



<li><strong>安裝 LibGlyph（如果需要處理 .sfdir 檔案）：</strong>如果你需要處理 .sfdir 檔案，你需要安裝 LibGlyph 這個函式庫。你可以使用 pip 來安裝： <code>pip install LibGlyph</code></li>



<li><strong>準備字型檔案或圖像資料夾：</strong>把你想要處理的字型檔案或圖像資料夾放在一個方便存取的位置。</li>
</ol>



<h3 class="wp-block-heading">使用方式</h3>



<ol class="wp-block-list">
<li><strong>下載腳本：</strong>把上面的 Python 腳本複製下來，儲存成一個 .py 檔案，例如 <code>get_ttf_chars.py</code>。</li>



<li><strong>開啟終端機或命令提示字元：</strong>在你的作業系統中開啟終端機（macOS/Linux）或命令提示字元（Windows）。</li>



<li><strong>執行腳本：</strong>使用以下指令來執行腳本，並替換成你自己的檔案路徑和選項： <br><code>python get_ttf_chars.py &lt;輸入檔案或資料夾路徑&gt; --output [輸出文字檔路徑] --mode [模式]</code>
<ul class="wp-block-list">
<li><code><code>&lt;輸入檔案或資料夾路徑&gt;</code></code>：指定輸入的字型檔案或圖像資料夾路徑。</li>



<li><code>--output</code>：指定輸出的文字檔路徑，預設是 <code>output.txt</code>。</li>



<li><code>--mode</code>：指定模式，有兩種模式可以選擇：
<ul class="wp-block-list">
<li><code>fontforge</code>：處理字型檔案（.otf、.ttf、.woff、.woff2、.sfdir）。</li>



<li><code>unicode_image</code>：處理圖像資料夾，圖像檔名必須是 Unicode 編碼的數字。</li>
</ul>
</li>
</ul>
</li>



<li><strong>範例：</strong>
<ul class="wp-block-list">
<li>處理字型檔案： <br><code>python get_ttf_chars.py myfont.ttf --output mycharset.txt --mode fontforge</code></li>



<li>處理圖像資料夾： <br><code>python get_ttf_chars.py images --output image_charset.txt --mode unicode_image</code></li>
</ul>
</li>



<li><strong>查看輸出結果：</strong>執行完成後，會在指定的路徑產生一個文字檔，裡面包含了提取出來的字符集。</li>
</ol>



<h3 class="wp-block-heading">注意事項</h3>



<ul class="wp-block-list">
<li>圖像資料夾中的圖像檔名必須是 Unicode 編碼的數字，例如 <code>65</code>.png 代表字元 &#8216;A&#8217;。</li>



<li>如果處理字型檔案時遇到問題，請確認 fontforge 是否正確安裝。</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">進階應用</h2>



<p>字型A (例如: zen maru) 使用的異體字清單如下:</p>



<pre class="wp-block-preformatted">不串丹什來例便僚兀兩凉列利刺力勉勒勤卑句吏呂喇墨壘尿年弄律懶拓易暈暴更林櫓沈洛洞淋濫烈珞理略異碑磊行裏見豈賂賈路車輻郞里量閭阮隆隷駱魯鷺</pre>



<p>字型B (例如: noto sans)  也使用了相同形狀但編碼不同的異體字:</p>



<pre class="wp-block-preformatted">兀勉勤卑墨碑隆豈更車賈串句喇懶洛珞駱濫來櫓路魯鷺弄磊賂壘勒丹異便不沈略兩量呂閭力年列烈例僚尿暈阮律利吏易理裏里林淋什刺拓洞暴輻行見</pre>



<p>要如何在2個字型, 分別完成對映? 解法是在呼叫 get_ttf_chars.py 增加參數 &#8211;altuni 與 &#8211;find_alt_text=text</p>



<p>範例: </p>



<pre class="wp-block-code"><code>fontforge get_ttf_chars.py notosans.ttf --output alt_root.txt --altuni --find_alt_text=不串丹什來例便僚兀兩凉列利刺力勉勒勤卑句吏呂喇墨壘尿年弄律懶拓易暈暴更林櫓沈洛洞淋濫烈珞理略異碑磊行裏見豈賂賈路車輻郞里量閭阮隆隷駱魯鷺</code></pre>



<p>這樣就可以取得 notosans 的真正 glyph 本體.</p>



<p>同時附上 mapping 表:</p>



<p>redirect_dict = {19981: 63847, 20018: 63749, 20025: 63838, 20160: 63997, 20358: 63789, 20363: 63925, 20415: 63845, 20698: 63931, 20800: 20800, 20841: 63864, 21015: 63900, 21033: 63965, 21050: 63999, 21147: 63882, 21193: 21193, 21202: 63826, 21220: 21220, 21329: 21329, 21477: 63750, 21519: 63966, 21570: 63872, 21895: 63755, 22696: 22696, 22744: 63818, 23615: 63933, 24180: 63886, 24324: 63811, 24459: 63960, 25078: 63757, 25299: 64002, 26131: 63968, 26248: 63941, 26292: 64006, 26356: 63745, 26519: 63988, 27347: 63793, 27784: 63858, 27931: 63765, 27934: 64005, 28107: 63989, 28651: 63778, 28872: 63903, 29662: 63767, 29702: 63972, 30053: 63862, 30064: 63842, 30865: 30865, 30922: 63815, 34892: 64008, 35023: 63975, 35211: 64010, 35912: 63744, 36034: 63816, 36040: 63747, 36335: 63799, 36554: 63746, 36667: 64007, 37324: 63977, 37327: 63870, 38317: 63878, 38446: 63942, 38534: 38534, 39409: 63770, 39791: 63801, 40442: 63802}</p>



<p>把 mapping 表放在 export_ttf_to_svg.py 內, 就可以讓 zen maru 所匯出的 .svg 可以讓 notosan 直接做匯入.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">接續應用</h2>



<p>有了清單之後, 就是需要去清單做交集或刪除的過濾.</p>



<ul class="wp-block-list">
<li>從文字檔移除特定文字集合<br><a href="https://codereview.max-everyday.com/remove-selected-char/">https://codereview.max-everyday.com/remove-selected-char/</a></li>
</ul>



<hr class="wp-block-separator has-css-opacity"/>



<h2 class="wp-block-heading">相關文章：</h2>



<ul class="wp-block-list">
<li>從字體專案裡取得特定文字glyph<br><a href="https://codereview.max-everyday.com/get-selected-glyph-from-font/">https://codereview.max-everyday.com/get-selected-glyph-from-font/</a></li>



<li>從文字檔移除特定文字集合<br><a href="https://codereview.max-everyday.com/remove-selected-char/">https://codereview.max-everyday.com/remove-selected-char/</a></li>
</ul>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>搬移檔案到子資料夾：解決檔案數量太多問題</title>
		<link>https://codereview.max-everyday.com/batch-make-dir/</link>
		
		<dc:creator><![CDATA[max-code-review-usr1]]></dc:creator>
		<pubDate>Tue, 18 Aug 2020 10:31:26 +0000</pubDate>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[字串處理]]></category>
		<category><![CDATA[Command]]></category>
		<category><![CDATA[Shell]]></category>
		<category><![CDATA[String]]></category>
		<guid isPermaLink="false">https://codereview.max-everyday.com/?p=1351</guid>

					<description><![CDATA[為什麼要學這個？ 如果遇到某一個資料夾裡的檔 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image size-large is-style-default"><img decoding="async" width="1024" height="1024" src="https://codereview.max-everyday.com/wp-content/uploads/2020/08/batch_mkdir-1024x1024.png?v=1597746659" alt="" class="wp-image-1364" srcset="https://codereview.max-everyday.com/wp-content/uploads/2020/08/batch_mkdir.png?v=1597746659 1024w, https://codereview.max-everyday.com/wp-content/uploads/2020/08/batch_mkdir-300x300.png?v=1597746659 300w, https://codereview.max-everyday.com/wp-content/uploads/2020/08/batch_mkdir-150x150.png?v=1597746659 150w, https://codereview.max-everyday.com/wp-content/uploads/2020/08/batch_mkdir-768x768.png?v=1597746659 768w, https://codereview.max-everyday.com/wp-content/uploads/2020/08/batch_mkdir-640x640.png?v=1597746659 640w, https://codereview.max-everyday.com/wp-content/uploads/2020/08/batch_mkdir-830x830.png?v=1597746659 830w, https://codereview.max-everyday.com/wp-content/uploads/2020/08/batch_mkdir-230x230.png?v=1597746659 230w, https://codereview.max-everyday.com/wp-content/uploads/2020/08/batch_mkdir-350x350.png?v=1597746659 350w, https://codereview.max-everyday.com/wp-content/uploads/2020/08/batch_mkdir-480x480.png?v=1597746659 480w, https://codereview.max-everyday.com/wp-content/uploads/2020/08/batch_mkdir-50x50.png?v=1597746659 50w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<h2 class="wp-block-heading">為什麼要學這個？</h2>



<p>如果遇到某一個資料夾裡的檔案數量太多，造成處理的效能不佳，幫資料夾的檔案數量瘦身，以增加處理的效率。</p>



<p>這個使用批次檔（或shell script）腳本程式來處理，一定比使用人工去選取和搬移快很多。</p>



<p>類似的應用像是自動<a href="https://github.com/max32002/MaxFontScripts/blob/master/batch_sync_git_readme.py">幫特定的資料夾自動更新部份內容</a>後，再<a href="https://github.com/max32002/MaxFontScripts/blob/master/batch_git_push.py">幫資料夾上傳內容到github 上</a>。 很多人工手動的操作，應該都可以換成使用自動化的腳本來完成，減少人工重覆去操作的這個行為。當然，要處理的事情的數量少，而重覆機率低，使用純手工去做，可能會方便點。</p>



<p>類似且重覆性質的工作，交給程式來做，人類比較不會覺得無聊。</p>



<hr class="wp-block-separator"/>



<h2 class="wp-block-heading">前置作業</h2>



<p>範例程式碼下載：<br><a href="https://github.com/max32002/MaxFontScripts/blob/master/batch_make_dirs.py">https://github.com/max32002/MaxFontScripts/blob/master/batch_make_dirs.py</a></p>



<hr class="wp-block-separator"/>



<h2 class="wp-block-heading">使用方法</h2>



<p><strong>Step 1：</strong>先使用 grep 或  ls 指令，取得要處理的目錄清單。</p>



<p><strong>Step 2：</strong>組合要進去每一個目錄後，要執行的指令有那些。</p>



<p><strong>Step 3：</strong>執行 python script 並轉向輸出到 run.sh (或Windows 平台的批次檔)</p>



<p><strong>Step 4：</strong>執行產生出來的 run.sh。</p>



<hr class="wp-block-separator"/>



<p>因應瘦身，所以原本直接產生到該目錄下的匯出程式也要跟著調整，針對第1個字元，多往下產生到子資料夾：<br><a href="https://github.com/max32002/MaxFontScripts/blob/master/bmp.py">https://github.com/max32002/MaxFontScripts/blob/master/bmp.py</a></p>



<p>因應瘦身，所以原本要讀取的程式，也要跟著調整多往下一個子資料夾來取得檔案。</p>



<hr class="wp-block-separator"/>



<h2 class="wp-block-heading">Code Review 影片</h2>



<p>搬移檔案到子資料夾：解決檔案的數量太多問題<br></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>從其他檔案置換區塊內容</title>
		<link>https://codereview.max-everyday.com/update-block-from-file/</link>
		
		<dc:creator><![CDATA[max-code-review-usr1]]></dc:creator>
		<pubDate>Mon, 10 Aug 2020 15:09:38 +0000</pubDate>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[字串處理]]></category>
		<category><![CDATA[字體]]></category>
		<category><![CDATA[Command]]></category>
		<category><![CDATA[Font]]></category>
		<category><![CDATA[Shell]]></category>
		<category><![CDATA[String]]></category>
		<guid isPermaLink="false">https://codereview.max-everyday.com/?p=1265</guid>

					<description><![CDATA[為什麼要學這個？ 如果透過指令或程式來做會更 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image size-large is-style-default"><img decoding="async" width="1024" height="1024" src="https://codereview.max-everyday.com/wp-content/uploads/2020/08/merge_text-1024x1024.png?v=1597670288" alt="" class="wp-image-1336" srcset="https://codereview.max-everyday.com/wp-content/uploads/2020/08/merge_text.png?v=1597670288 1024w, https://codereview.max-everyday.com/wp-content/uploads/2020/08/merge_text-300x300.png?v=1597670288 300w, https://codereview.max-everyday.com/wp-content/uploads/2020/08/merge_text-150x150.png?v=1597670288 150w, https://codereview.max-everyday.com/wp-content/uploads/2020/08/merge_text-768x768.png?v=1597670288 768w, https://codereview.max-everyday.com/wp-content/uploads/2020/08/merge_text-640x640.png?v=1597670288 640w, https://codereview.max-everyday.com/wp-content/uploads/2020/08/merge_text-830x830.png?v=1597670288 830w, https://codereview.max-everyday.com/wp-content/uploads/2020/08/merge_text-230x230.png?v=1597670288 230w, https://codereview.max-everyday.com/wp-content/uploads/2020/08/merge_text-350x350.png?v=1597670288 350w, https://codereview.max-everyday.com/wp-content/uploads/2020/08/merge_text-480x480.png?v=1597670288 480w, https://codereview.max-everyday.com/wp-content/uploads/2020/08/merge_text-50x50.png?v=1597670288 50w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<h2 class="wp-block-heading">為什麼要學這個？</h2>



<p>如果透過指令或程式來做會更有效率的話，當然要使用指令來做。這篇文章主要在講文字檔裡的字串處理。</p>



<p>如果有想透過程式來合併文字檔的內容，可以試看看文章裡附的小程式。</p>



<hr class="wp-block-separator has-css-opacity"/>



<h2 class="wp-block-heading">前置作業</h2>



<p>程式碼下載：<br><a href="https://github.com/max32002/MaxFontScripts/blob/master/update_block_from_file.py">https://github.com/max32002/MaxFontScripts/blob/master/update_block_from_file.py</a></p>



<hr class="wp-block-separator has-css-opacity"/>



<h2 class="wp-block-heading">使用方法</h2>



<pre class="wp-block-code"><code>update_block_from_file.py --first FIRST --second SECOND --begin BEGIN --resume RESUME</code></pre>



<p><strong>參數說明：</strong></p>



<ul class="wp-block-list">
<li>&#8211;first 第一個檔案路徑，內容會被修改。</li>



<li>&#8211;second 第二個檔案路徑，內容會被複製。</li>



<li>&#8211;begin 第一個檔案跳脫不處理，第二個檔案開始複製的字串。</li>



<li>&#8211;resume 第二個檔案跳脫不處理，並且第一個檔案接續輸出的字串。</li>
</ul>



<p>改良前的前身：<br><a href="https://github.com/max32002/MaxFontScripts/blob/master/update_lang_props.py">https://github.com/max32002/MaxFontScripts/blob/master/update_lang_props.py</a></p>



<p>前身的前世：<br><a href="https://github.com/max32002/MaxFontScripts/blob/master/copy_kerning_props.py">https://github.com/max32002/MaxFontScripts/blob/master/copy_kerning_props.py</a></p>



<hr class="wp-block-separator has-css-opacity"/>



<h2 class="wp-block-heading">使用範例2號</h2>



<p>遇到的問題是，想要同步 github 的多個 project 裡的  README.md 檔案裡的「相關網址」的區塊。</p>



<h3 class="wp-block-heading">使用步驟：</h3>



<p><strong>Step 1：</strong>先修改出一個標準版，要讓其他專案做「共用」，修改後放到一個指定路徑。例如：~/Documents/sh/fix_font_readme_urls/README.md</p>



<p><strong>Step 2：</strong>使用 find . 指令，列出有 README.md 的專案，或使用 ls 手動整理目錄的清單。</p>



<p><strong>Step 3：</strong>使用 Step 2 的 List ，產生一個 python 檔案。例如：batch_sync_git_readme.py，檔案下載：<br><a href="https://github.com/max32002/MaxFontScripts/blob/master/batch_sync_git_readme.py">https://github.com/max32002/MaxFontScripts/blob/master/batch_sync_git_readme.py</a></p>



<p>這個程式的主程式，是去使用上面寫的 python, 主程式如下：</p>



<pre class="wp-block-code"><code>begin_string = "## 相關網頁"
resume_string = "https://max-everyday.com/about/#donate"
cmd = "~/Documents/sh/update_block_from_file.py --first \"%sREADME.md\"" % (item.replace("\"","\\""))
cmd += " --second \"%s\"" % (reuse_file.replace("\"","\\""))
cmd += " --begin \"%s\"" % (begin_string.replace("\"","\\""))
cmd += " --resume \"%s\"" % (resume_string.replace("\"","\\""))
print(cmd)</code></pre>



<p><strong>Step 4：</strong>執行 batch_sync_git_readme.py &gt; run.sh 取得批次置換的指令在 run.sh 裡。</p>



<p><strong>Step 5：</strong>先手動執行 run.sh 裡的某一行，並檢查置換結果是否如預期。如果結果是對的，就執行 run.sh 讓其他的資料夾都置換成「共用區塊」後的版本。</p>



<p><strong>Step 6：</strong>執行批次git add/commit/push 指令。例如：batch_git_push.py，檔案下載：<br><a href="https://github.com/max32002/MaxFontScripts/blob/master/batch_git_push.py">https://github.com/max32002/MaxFontScripts/blob/master/batch_git_push.py</a></p>



<hr class="wp-block-separator has-css-opacity"/>



<h2 class="wp-block-heading">使用範例3號</h2>



<p><strong>情境：</strong></p>



<p>有多個目錄 ex: /convert/, /convert_b2/ , /convert_xd/ 每個目錄下都有 TtfConfig.py, 每個 python 的檔案，在某一行以下，希望與 /convert/ 目錄下的 TtfConfig.py 相同。</p>



<p><strong>使用方法：</strong></p>



<pre class="wp-block-code"><code>~/Documents/sh/update_block_from_file.py --first convert_xd/TtfConfig.py --second convert/TtfConfig.py --begin " STYLE_INDEX = 5"</code></pre>



<p><strong>範例說明：</strong></p>



<p>在 &#8221; STYLE_INDEX = 5&#8243; 這行文字以下，都會使用 second 的，會修改掉 first 指定的檔案。</p>



<hr class="wp-block-separator has-css-opacity"/>



<h2 class="wp-block-heading">Code Review 影片</h2>



<p>程式架構優化 &#8211; 從其他檔案置換區塊內容<br><a href="https://youtu.be/q2b1MYMpvUI">https://youtu.be/q2b1MYMpvUI</a></p>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-4-3 wp-has-aspect-ratio wp-embed-aspect-16-9"><div class="wp-block-embed__wrapper">
<iframe title="程式架構優化 - 從其他檔案置換區塊內容" width="1170" height="658" src="https://www.youtube.com/embed/q2b1MYMpvUI?feature=oembed" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
</div></figure>



<p>Max優化程式的方法是減少程式碼中寫死的常數，提升程式的彈性來增加使程式更容易重覆利用。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>從字體專案裡取得特定文字glyph</title>
		<link>https://codereview.max-everyday.com/get-selected-glyph-from-font/</link>
		
		<dc:creator><![CDATA[max-code-review-usr1]]></dc:creator>
		<pubDate>Tue, 04 Aug 2020 15:00:26 +0000</pubDate>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[字體]]></category>
		<category><![CDATA[Command]]></category>
		<category><![CDATA[Font]]></category>
		<category><![CDATA[FontForge]]></category>
		<category><![CDATA[Shell]]></category>
		<guid isPermaLink="false">https://codereview.max-everyday.com/?p=1276</guid>

					<description><![CDATA[為什麼要學這個？ 比使用人工去取出想更新的文 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1920" height="1280" src="https://codereview.max-everyday.com/wp-content/uploads/2020/08/copy_selected_out2.jpg?v=1597076344" alt="" class="wp-image-1316" srcset="https://codereview.max-everyday.com/wp-content/uploads/2020/08/copy_selected_out2.jpg?v=1597076344 1920w, https://codereview.max-everyday.com/wp-content/uploads/2020/08/copy_selected_out2-1536x1024.jpg?v=1597076344 1536w, https://codereview.max-everyday.com/wp-content/uploads/2020/08/copy_selected_out2-830x553.jpg?v=1597076344 830w, https://codereview.max-everyday.com/wp-content/uploads/2020/08/copy_selected_out2-230x153.jpg?v=1597076344 230w, https://codereview.max-everyday.com/wp-content/uploads/2020/08/copy_selected_out2-350x233.jpg?v=1597076344 350w, https://codereview.max-everyday.com/wp-content/uploads/2020/08/copy_selected_out2-480x320.jpg?v=1597076344 480w" sizes="(max-width: 1920px) 100vw, 1920px" /></figure>



<h2 class="wp-block-heading">為什麼要學這個？</h2>



<p>比使用人工去取出想更新的文字有效率。</p>



<p><meta charset="utf-8">與使用「人工」手動去處理相比，用程式去<meta charset="utf-8">取出想更新的文字有效率。</p>



<p>程式的目的是要去取出font forge 專案檔的特定 glyph.</p>



<hr class="wp-block-separator has-css-opacity"/>



<h2 class="wp-block-heading">前置作業</h2>



<p>使用前，需要先安裝FontForge，把要處理的字體先存成.sfdir 的資料夾格式。</p>



<p><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-red-color">重要：這個小程式目前無法直接輸入字型檔, 只能處理 <strong>.sfdir</strong> 資料夾。</mark></p>



<p>FontForge執行檔下載：<br><a href="https://fontforge.org/en-US/">https://fontforge.org/en-US/</a></p>



<p>Max腳本檔案下載：<br><a href="https://github.com/max32002/MaxFontScripts/blob/master/copy_selected_out.py">https://github.com/max32002/MaxFontScripts/blob/master/copy_selected_out.py</a></p>



<hr class="wp-block-separator has-css-opacity"/>



<h2 class="wp-block-heading">使用方法</h2>



<pre class="wp-block-code"><code>copy_selected_out.py --input INPUT --string STRING --output OUTPUT</code></pre>



<p><strong>參數說明：</strong></p>



<ul class="wp-block-list">
<li><code>--input</code> 要處理的字體專案目錄。</li>



<li><code>--string</code> 要取出的字串。</li>



<li><code>--output</code> 要輸出的路徑，預設是執行指令的現行目錄下。</li>
</ul>



<p><strong>操作範例：</strong></p>



<pre class="wp-block-code"><code>copy_selected_out.py --input source.sfdir --output target.sfdir --string 每一天</code></pre>



<p>使用範例：從 source.sfdir 取出 「每一天」3個字，存到轉換為 target.sfdir 目錄。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">進階參數說明</h2>



<ul class="wp-block-list">
<li><code>--file</code>&nbsp;目的字串的文字檔。</li>



<li><code>--range</code>&nbsp;目的字元的範圍, 使用16進制, 例如: –range AC00,D7AF</li>



<li><code>--range_int</code>&nbsp;目的字元的範圍, 使用10進制.</li>
</ul>



<p>常見的 range</p>



<ul class="wp-block-list">
<li>2E80 – 2EFF: CJK Radicals Supplement</li>



<li>3400 – 4DBF: 中日韓統一表意文字擴充區A,</li>



<li>4E00 – 9FFF: CJK Unified Ideographs,</li>



<li>AC00 — D7AF: 諺文音節 (Hangul Syllables), Hangul音節是一個Unicode塊，其中包含用於現代韓語的預先編寫的Hangul音節塊。音節可以通過算法直接映射到韓文字母Unicode塊中的兩個或三個字符的序列： U + 1100–U + 1112之一：19個現代韓文字母領先的輔音字母； U + 1161–U + 1175之一：21種現代韓文元音字母；</li>



<li>F900 – FAFF: CJK Compatibility Ideographs</li>



<li>20000 – 2A6DF: 中日韓統一表意文字擴充區B</li>



<li>30000 – 3134F: 中日韓統一表意文字擴展區G</li>
</ul>



<hr class="wp-block-separator has-css-opacity"/>



<h2 class="wp-block-heading">相關文章：</h2>



<ul class="wp-block-list">
<li>透過指令「字體」與「FontForge專案」互轉<br><a href="https://codereview.max-everyday.com/font-to-fontforge/">https://codereview.max-everyday.com/font-to-fontforge/</a></li>



<li>從圖片目錄裡取得特定文字檔案<br><a href="https://codereview.max-everyday.com/copy_selected_image_out/">https://codereview.max-everyday.com/copy_selected_image_out/</a></li>
</ul>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>字型(.ttf) / Web Font (.woff2) / FontForge專案(.sfdir) 互轉</title>
		<link>https://codereview.max-everyday.com/font-to-fontforge/</link>
		
		<dc:creator><![CDATA[max-code-review-usr1]]></dc:creator>
		<pubDate>Sun, 02 Aug 2020 16:25:07 +0000</pubDate>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[字體]]></category>
		<category><![CDATA[Command]]></category>
		<category><![CDATA[Font]]></category>
		<category><![CDATA[FontForge]]></category>
		<category><![CDATA[Script]]></category>
		<category><![CDATA[Shell]]></category>
		<guid isPermaLink="false">https://codereview.max-everyday.com/?p=1241</guid>

					<description><![CDATA[為什麼要學這個？ 透過 FontForge  [&#8230;]]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">為什麼要學這個？</h2>



<p>透過 FontForge 開啟，並另存專案為資料夾格式(.sfdir)，除了手動去操作之外，也可以使用腳本來做。如果透過指令來做會更有效率的話，當然要使用指令來做。</p>



<hr class="wp-block-separator has-css-opacity"/>



<h2 class="wp-block-heading">實作步驟</h2>



<p>使用前，需要先安裝FontForge，透過執行FontForge的腳本(Script)可以在指令行的模式下，合併2個字體檔案。</p>



<p>FontForge執行檔下載：<br><a href="https://fontforge.org/en-US/">https://fontforge.org/en-US/</a></p>



<p>Max腳本檔案，轉成FontForge (all font format to .sfdir)下載：<br><a href="https://github.com/max32002/MaxFontScripts/blob/master/save_as.py">https://github.com/max32002/MaxFontScripts/blob/master/save_as.py</a></p>



<p>Max腳本檔案，轉成字體檔 (all font format to .ttf/.otf/.svg/.woff/.woff2)下載：<br><a href="https://github.com/max32002/MaxFontScripts/blob/master/generate.py">https://github.com/max32002/MaxFontScripts/blob/master/generate.py</a></p>



<hr class="wp-block-separator has-css-opacity"/>



<h2 class="wp-block-heading">使用範例</h2>



<p>把 source.ttf 轉換為 target.sfdir</p>



<pre class="wp-block-code"><code>fontforge save_as.py -i source.ttf -o target.sfdir</code></pre>



<p>把 source.ttf 轉換為 target.woff2</p>



<pre class="wp-block-code"><code>fontforge generate.py -i source.ttf -o target.woff2</code></pre>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">檔案說明</h2>



<ul class="wp-block-list">
<li><strong>generate.py</strong><br>讀取字體並匯出為 .ttf / .woff2</li>



<li><strong>save_as.py</strong><br>讀取字體並產成為 fontforge 專案資料夾 .sfdir<br></li>
</ul>



<p></p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="1024" src="https://codereview.max-everyday.com/wp-content/uploads/2020/08/Screen-Shot-2020-08-03-at-00.23.53-1024x1024.png?v=1596385479" alt="" class="wp-image-1246" srcset="https://codereview.max-everyday.com/wp-content/uploads/2020/08/Screen-Shot-2020-08-03-at-00.23.53-1024x1024.png?v=1596385479 1024w, https://codereview.max-everyday.com/wp-content/uploads/2020/08/Screen-Shot-2020-08-03-at-00.23.53-300x300.png?v=1596385479 300w, https://codereview.max-everyday.com/wp-content/uploads/2020/08/Screen-Shot-2020-08-03-at-00.23.53-150x150.png?v=1596385479 150w, https://codereview.max-everyday.com/wp-content/uploads/2020/08/Screen-Shot-2020-08-03-at-00.23.53-768x768.png?v=1596385479 768w, https://codereview.max-everyday.com/wp-content/uploads/2020/08/Screen-Shot-2020-08-03-at-00.23.53-640x640.png?v=1596385479 640w, https://codereview.max-everyday.com/wp-content/uploads/2020/08/Screen-Shot-2020-08-03-at-00.23.53-50x50.png?v=1596385479 50w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<hr class="wp-block-separator has-css-opacity"/>



<h2 class="wp-block-heading">MaxCodeReview 影片</h2>



<p>Youtube：<a href="https://youtu.be/9-0WHjjfOgU">https://youtu.be/9-0WHjjfOgU</a></p>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe title="「字體」與「FontForge專案」互轉" width="1170" height="658" src="https://www.youtube.com/embed/9-0WHjjfOgU?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>



<hr class="wp-block-separator has-css-opacity"/>



<h2 class="wp-block-heading">相關文章：</h2>



<ul class="wp-block-list">
<li>轉換字型為webfont<br><a href="https://stackoverflow.max-everyday.com/2020/08/convert-ttf-to-webfont/">https://stackoverflow.max-everyday.com/2020/08/convert-ttf-to-webfont/</a></li>



<li>如何製作「字體預覽」的網頁功能<br><a href="https://codereview.max-everyday.com/webfont-preview-textarea/">https://codereview.max-everyday.com/webfont-preview-textarea/</a></li>
</ul>



<p></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>透過指令合併2個字體檔案</title>
		<link>https://codereview.max-everyday.com/merge-font/</link>
		
		<dc:creator><![CDATA[max-code-review-usr1]]></dc:creator>
		<pubDate>Wed, 29 Jul 2020 00:20:11 +0000</pubDate>
				<category><![CDATA[字體]]></category>
		<category><![CDATA[Command]]></category>
		<category><![CDATA[Font]]></category>
		<category><![CDATA[FontForge]]></category>
		<category><![CDATA[Script]]></category>
		<category><![CDATA[Shell]]></category>
		<guid isPermaLink="false">http://codereview.max-everyday.com/?p=1</guid>

					<description><![CDATA[為什麼要學這個？ 如果透過指令來做會更有效率 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="1024" src="https://codereview.max-everyday.com/wp-content/uploads/2020/08/merge_font-1024x1024.jpg?v=1597073599" alt="" class="wp-image-1312" srcset="https://codereview.max-everyday.com/wp-content/uploads/2020/08/merge_font.jpg?v=1597073599 1024w, https://codereview.max-everyday.com/wp-content/uploads/2020/08/merge_font-300x300.jpg?v=1597073599 300w, https://codereview.max-everyday.com/wp-content/uploads/2020/08/merge_font-150x150.jpg?v=1597073599 150w, https://codereview.max-everyday.com/wp-content/uploads/2020/08/merge_font-768x768.jpg?v=1597073599 768w, https://codereview.max-everyday.com/wp-content/uploads/2020/08/merge_font-640x640.jpg?v=1597073599 640w, https://codereview.max-everyday.com/wp-content/uploads/2020/08/merge_font-830x830.jpg?v=1597073599 830w, https://codereview.max-everyday.com/wp-content/uploads/2020/08/merge_font-230x230.jpg?v=1597073599 230w, https://codereview.max-everyday.com/wp-content/uploads/2020/08/merge_font-350x350.jpg?v=1597073599 350w, https://codereview.max-everyday.com/wp-content/uploads/2020/08/merge_font-480x480.jpg?v=1597073599 480w, https://codereview.max-everyday.com/wp-content/uploads/2020/08/merge_font-50x50.jpg?v=1597073599 50w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<h2 class="wp-block-heading">為什麼要學這個？</h2>



<p>如果透過指令來做會更有效率的話，當然要使用指令來做。這個指令還滿常使用到的，因為字體常常在補字，一定會用到合併的功能。</p>



<p>GUI 的操作參考使用下面的這篇分享：合併字型較安全的方法<br><a href="https://codereview.max-everyday.com/a-safer-way-to-merge-fonts/">https://codereview.max-everyday.com/a-safer-way-to-merge-fonts/</a></p>



<p>這篇教學示範2個解法: </p>



<ul class="wp-block-list">
<li>解法1: 透過 fontforge + .pe 檔.</li>



<li>解法2: python + fonttool</li>
</ul>



<hr class="wp-block-separator has-css-opacity"/>



<h2 class="wp-block-heading">解法1: 透過 fontforge + .pe 檔.</h2>



<p>使用前，需要先安裝FontForge，透過執行FontForge的腳本(Script)可以在指令行的模式下，合併2個字體檔案。</p>



<p>FontForge執行檔下載：<br><a href="https://fontforge.org/en-US/">https://fontforge.org/en-US/</a></p>



<p>Max腳本檔案下載：<br><a href="https://github.com/max32002/MaxFontScripts/blob/master/merge_font.pe">https://github.com/max32002/MaxFontScripts/blob/master/merge_font.pe</a></p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="797" src="https://codereview.max-everyday.com/wp-content/uploads/2020/08/Screen-Shot-2020-08-01-at-15.56.37b-1024x797.png" alt="" class="wp-image-28"/></figure>



<p>MaxCodeReview 影片：<br><a href="https://youtu.be/SFCf50iiQbs">https://youtu.be/SFCf50iiQbs</a></p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">解法1使用範例</h2>



<pre class="wp-block-code"><code>merge_font.pe main.ttf added.ttf outout.sfdir</code></pre>



<p>說明：前二個參數，由於是使用 FontForge 去開啟，不限於 .ttf 或 .sfdir 格式，都可以被順利開啟。</p>



<p>第三個參數，目前的腳本固定要使用  .sfdir 格式，因為是使用 Save() 指令，如果是要產生成 .ttf 要改用 Generate().</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">解法2: python + fonttool</h2>



<p>Max腳本檔案下載：<br><a href="https://github.com/max32002/MaxFontScripts/blob/master/merge_font.py">https://github.com/max32002/MaxFontScripts/blob/master/merge_font.py</a></p>



<p>使用範例:</p>



<pre class="wp-block-code"><code>python merge_font.py --font1 font1.ttf --font2 font2.ttf --output font3.ttf</code></pre>



<p>執行畫面:</p>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1254" height="205" src="https://codereview.max-everyday.com/wp-content/uploads/2020/07/2025-01-24_14-05_5l.jpg?v=1737698768" alt="" class="wp-image-1705" srcset="https://codereview.max-everyday.com/wp-content/uploads/2020/07/2025-01-24_14-05_5l.jpg?v=1737698768 1254w, https://codereview.max-everyday.com/wp-content/uploads/2020/07/2025-01-24_14-05_5l-1000x163.jpg?v=1737698768 1000w, https://codereview.max-everyday.com/wp-content/uploads/2020/07/2025-01-24_14-05_5l-230x38.jpg?v=1737698768 230w, https://codereview.max-everyday.com/wp-content/uploads/2020/07/2025-01-24_14-05_5l-350x57.jpg?v=1737698768 350w, https://codereview.max-everyday.com/wp-content/uploads/2020/07/2025-01-24_14-05_5l-480x78.jpg?v=1737698768 480w" sizes="(max-width: 1254px) 100vw, 1254px" /></figure>



<p>使用這個解法, 比較方便與安全, 缺點就是合併完的檔案, 在作業系統雖然可以使用, 但無法被 fontforge 開啟.</p>



<p>當 font1 與 font2 同時都有的字元, 會以 font2 被保留下來, 理論上應該是, 但實際上, 有時候會以 font2 為主, 有時候並不會被取代.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">相關網頁</h2>



<p>FontForge Scripting Tutorial<br><a href="https://fontforge.org/docs/tutorial/scripting-tutorial.html">https://fontforge.org/docs/tutorial/scripting-tutorial.html</a></p>



<p></p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
