<title>Writing Pinyin and Chinese</title>
<link href="https://kolmesanaa.link/post/2021-08-10/"/>
<updated>2021-08-10T00:00:00+00:00</updated>
<id>https://kolmesanaa.link/post/2021-08-10/</id>
<content type="html"><h2 id="writing-chinese-with-a-computing-device">Writing Chinese with a Computing Device<a class="tdbc-anchor" href="#writing-chinese-with-a-computing-device">#</a></h2>
<p>Today's post is mostly about how to write <ruby>
拼音<rp>(</rp><rt>pīn yīn</rt><rp>)</rp>
</ruby> with Mac and with Eleventy.</p>
<p>There is a good, comprehensive post with detailed instructions on <a href="https://yoyochinese.com/blog/how-to-type-in-chinese-on-any-device">how to write Chinese charaters in general on computers and phones at Yoyochinese.com</a>. I am specifically interested in adding pinyin and tone markers along with the hanzi characters to help with pronunciation.</p>
<h2 id="ruby-html-element-boring-technical-stuff">Ruby HTML Element (Boring Technical Stuff)<a class="tdbc-anchor" href="#ruby-html-element-boring-technical-stuff">#</a></h2>
<p>I've been vaguely aware of <kbd>ruby</kbd> HTML element (no relation to Ruby programming language) that according to <a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/ruby">MDN article on ruby element</a>:</p>
<blockquote>
<p>The <ruby> HTML element represents small annotations that are rendered above, below, or next to base text, usually used for showing the pronunciation of East Asian characters. It can also be used for annotating other kinds of text, but this usage is less common.</p>
</blockquote>
<p>Excellent, just what we wanted. Now we can easily add <a href="https://www.11ty.dev/docs/shortcodes/">Template Shortcodes on our Eleventy site</a> that generates following ruby HTML element</p>
<pre class="language-html"><code class="language-html"><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>ruby</span><span class="token punctuation">></span></span><br>拼音<span class="token tag"><span class="token tag"><span class="token punctuation"><</span>rp</span><span class="token punctuation">></span></span>(<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>rp</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>rt</span><span class="token punctuation">></span></span>pīn yīn<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>rt</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation"><</span>rp</span><span class="token punctuation">></span></span>)<span class="token tag"><span class="token tag"><span class="token punctuation"></</span>rp</span><span class="token punctuation">></span></span><br><span class="token tag"><span class="token tag"><span class="token punctuation"></</span>ruby</span><span class="token punctuation">></span></span></code></pre>
<p>From a Nunjuck short code <code>pinyin "拼音", "pin1 yin1"</code></p>
<h2 id="version-01">Version 0.1<a class="tdbc-anchor" href="#version-01">#</a></h2>
<p>Code for this first version of this Ruby utility is pretty simple:</p>
<pre class="language-js"><code class="language-js"><span class="token keyword">const</span> pinyinUtils <span class="token operator">=</span> <span class="token function">require</span><span class="token punctuation">(</span><span class="token string">"pinyin-utils"</span><span class="token punctuation">)</span><span class="token punctuation">;</span><br><br><span class="token comment">// omitted stuff</span><br><br>eleventyConfig<span class="token punctuation">.</span><span class="token function">addShortcode</span><span class="token punctuation">(</span><span class="token string">"pinyin"</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token parameter">hanzi<span class="token punctuation">,</span> pinyin<span class="token punctuation">,</span> definition</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span><br> <span class="token keyword">const</span> pinyined <span class="token operator">=</span> pinyin<span class="token punctuation">.</span><span class="token function">split</span><span class="token punctuation">(</span><span class="token string">" "</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">map</span><span class="token punctuation">(</span><span class="token parameter">pi</span> <span class="token operator">=></span> pinyinUtils<span class="token punctuation">.</span><span class="token function">numberToMark</span><span class="token punctuation">(</span>pi<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">join</span><span class="token punctuation">(</span><span class="token string">" "</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token comment">//pinyinUtils.numberToMark(pinyin);</span><br> <span class="token comment">// version 1 uses only tag, and pinyin-utils</span><br> <span class="token keyword">const</span> ruby <span class="token operator">=</span> <span class="token template-string"><span class="token template-punctuation string">`</span><span class="token string"><ruby> </span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span>hanzi<span class="token interpolation-punctuation punctuation">}</span></span><span class="token string"><rp>(</rp><rt></span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span>pinyined<span class="token interpolation-punctuation punctuation">}</span></span><span class="token string"></rt><rp>)</rp> </ruby></span><span class="token template-punctuation string">`</span></span><span class="token punctuation">;</span><br> <span class="token keyword">if</span> <span class="token punctuation">(</span>definition<span class="token punctuation">)</span> <span class="token punctuation">{</span><br> <span class="token keyword">return</span> <span class="token template-string"><span class="token template-punctuation string">`</span><span class="token string"><div></span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span>ruby<span class="token interpolation-punctuation punctuation">}</span></span><span class="token string"></div></span><span class="token template-punctuation string">`</span></span><span class="token punctuation">;</span><br> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span><br> <span class="token keyword">return</span> ruby<span class="token punctuation">;</span><br> <span class="token punctuation">}</span><br><span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span></code></pre>
<p>For the moment, it has following flaws I can live with for now:</p>
<ul>
<li>Dependency to <code>pinyin-utils</code> npm module. This code could prefectly well be self-contained with no dependencies</li>
<li>Pinyin characters need to be separated by space, so <code>pin1 yin1</code> is OK, while <code>pin1yin1</code> is not. No reason for this besides that I want 0.1 version out already today</li>
<li>Not using definition yet, my idea is to have optional definition part that would generate <a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/dl"><dl>: The Description List element (MDN)</dl></a> with an ruby item and a definition something like this:</li>
</ul>
<dl style="display: flex; flex-direction: row;">
<dt><ruby>
拼音<rp>(</rp><rt>pīn yīn</rt><rp>)</rp>
</ruby></dt>
<dd style="margin-left: 1em;">pinyin is the official romanization system for Standard Mandarin Chinese in mainland China </dd>
</dl>
<ul>
<li>No proper styling yet (classes for elements etc.)</li>
</ul>
<h2 id="additional-links">Additional links<a class="tdbc-anchor" href="#additional-links">#</a></h2>
<p>For future reference:</p>
<ul>
<li><a href="http://www.ichineselearning.com/learn/pinyin-tones.html">Pinyin Pronunciation-Learn Rules of Using Pinyin Tone Marks</a> that includes rules for placing the tonal marker</li>
<li><a href="http://pinyin.info/unicode/unicode_test.html">test page for displaying pinyin tone marks with Unicode</a></li>
</ul>
</content>