Commit 8643734

HPCesia <me@hpcesia.com>
2026-03-13 08:58:24
Add ruby component in Typst
1 parent 9c62298
Changed files (3)
src
contents
_lib
src/contents/_lib/components/ruby.typ
@@ -0,0 +1,54 @@
+#import "@preview/bullseye:0.1.0": target
+#import "@preview/rubby:0.10.2": get-ruby
+#import "../utils/to-string.typ": to-string
+
+#let ruby-html(rt, rb) = {
+  let rt-str = to-string(rt)
+  let rb-str = to-string(rb)
+  if type(rt-str) != str or type(rb-str) != str {
+    return [#rt (#rb)]
+  }
+  let rt-arr = rt-str.split("|")
+  let rb-arr = rb-str.split("|")
+  if rt-arr.len() != rb-arr.len() {
+    return [#rt (#rb)]
+  }
+  let rt-rb-pairs = rt-arr.zip(rb-arr)
+  return {
+    html.ruby(
+      rt-rb-pairs
+        .map(pair => {
+          let rt = pair.first()
+          let rb = pair.last()
+          rb
+          html.rp("(")
+          html.rt(rt)
+          html.rp(")")
+        })
+        .join(),
+    )
+  }
+}
+
+#let ruby-paged(rt, rb) = {
+  let _ruby = get-ruby(
+    size: 0.5em,
+    dy: 0pt,
+    pos: top,
+    alignment: "center",
+    delimiter: "|",
+    auto-spacing: true,
+  )
+  _ruby(rt, rb)
+}
+
+/// - rt (content,str):
+/// - rb (content,str):
+/// -> content
+#let ruby(rt, rb) = context {
+  if target() == "html" {
+    ruby-html(rt, rb)
+  } else {
+    ruby-paged(rt, rb)
+  }
+}
src/contents/_lib/utils/to-string.typ
@@ -1,3 +1,5 @@
+/// - content (content):
+/// -> str
 #let to-string(content) = {
   if (int, float, str, bytes, label, decimal, version, type).contains(
     type(content),
src/contents/_lib/tybios.typ
@@ -2,6 +2,7 @@
 #import "components/frame.typ": frame
 #import "components/fullwidth.typ": fullwidth
 #import "components/marginnote.typ": marginnote
+#import "components/ruby.typ": ruby
 
 #let post-template(body, lang: "en", region: none) = {
   set text(lang: lang, region: region)