///|
/// Templates for composition (`plan`) and rhyme-book queries (`rhyme`).
pub struct Plan {
title : String
lines : Array[String]
}
///|
fn mark_pattern(pattern : String, rhyme : Bool) -> String {
let sb = StringBuilder()
let chars = pattern.to_array()
for i in 0.. '平'
'z' => '仄'
_ => '中'
},
)
}
if rhyme {
sb.write_string("(韵)")
}
sb.to_string()
}
///|
pub fn plan_shi(form : ShiForm, variant : Int32) -> Plan {
let variants = patterns_for(form)
let v = if variant < 0 || variant > 3 { 0 } else { variant }
let pattern = variants[v]
let lines : Array[String] = []
for p in pattern {
let rhyme = p.to_array()[p.length() - 1] == 'p'
lines.push(mark_pattern(p, rhyme))
}
{ title: shi_form_label(form) + "·" + variant_label(v), lines, }
}
///|
pub fn plan_ci(lex : Lexicon, name : String) -> Array[Plan] {
let out : Array[Plan] = []
for t in lex.tunes {
if t.name == name {
let marked = StringBuilder()
let chars = t.pattern.to_array()
for i in 0.. '平'
'z' => '仄'
_ => '中'
},
)
let mut is_rhyme = false
for r in t.rhymes {
if r == i {
is_rhyme = true
}
}
if is_rhyme {
marked.write_char('韵')
}
if i % 10 == 9 {
marked.write_char(' ')
}
}
out.push({
title: t.name + "·" + t.sketch + "(" + t.author + ")",
lines: [marked.to_string()],
})
}
}
out
}
///|
pub fn form_names() -> Array[String] {
["五绝", "七绝", "五律", "七律"]
}
///|
pub fn builtin_tune_names(lex : Lexicon) -> Array[String] {
let out : Array[String] = []
for t in lex.tunes {
let mut seen = false
for n in out {
if n == t.name {
seen = true
}
}
if !seen {
out.push(t.name)
}
}
out
}