feat: Add kanken completion percentage (kinda wip)

This commit is contained in:
Dendy 2025-09-21 07:03:02 +02:00
parent 1f40c781cd
commit 8f24f23130
3 changed files with 20 additions and 1 deletions

View File

@ -61,7 +61,7 @@ class KanjiController extends AbstractController
if (!$force and file_exists($cacheFile)) return require $cacheFile; if (!$force and file_exists($cacheFile)) return require $cacheFile;
$ret = []; $ret = ['lists' => []];
$lists = [ $lists = [
'sn' => $this->anki->getKnownSnKanjiCounts(), 'sn' => $this->anki->getKnownSnKanjiCounts(),
@ -70,6 +70,8 @@ class KanjiController extends AbstractController
'ignored' => $this->getIgnoredList(), 'ignored' => $this->getIgnoredList(),
]; ];
$ret['lists'] = $lists;
// @formatter:off // @formatter:off
$storedLists = [ $storedLists = [
'taiwan', 'bushu', 'kyoyou', 'kyuujitai', 'kanken', 'hsk', 'zhcn', 'taiwan', 'bushu', 'kyoyou', 'kyuujitai', 'kanken', 'hsk', 'zhcn',
@ -77,13 +79,19 @@ class KanjiController extends AbstractController
]; ];
// @formatter:on // @formatter:on
foreach ($storedLists as $storedName) { foreach ($storedLists as $storedName) {
$ret['lists'][$storedName] = [];
$storedList = $this->charList->getList($storedName); $storedList = $this->charList->getList($storedName);
// Simple list // Simple list
if (key_exists('chars', $storedList)) { if (key_exists('chars', $storedList)) {
$ret['lists'][$storedName] = $storedList['chars'];
$lists[$storedName] = $storedList['chars']; $lists[$storedName] = $storedList['chars'];
} else { } else {
foreach ($storedList['sublists'] as $subname => $sublist) { foreach ($storedList['sublists'] as $subname => $sublist) {
$ret['lists'][$storedName] = array_merge(
$ret['lists'][$storedName],
$sublist['chars'],
);
$lists["$storedName-$subname"] = $sublist['chars']; $lists["$storedName-$subname"] = $sublist['chars'];
} }
} }
@ -134,6 +142,7 @@ class KanjiController extends AbstractController
} }
return $this->render(self::tmpl('grid'), [ return $this->render(self::tmpl('grid'), [
'char_info' => $charInfo,
'characters' => $chars, 'characters' => $chars,
'completed' => $completedRows, 'completed' => $completedRows,
]); ]);

View File

@ -18,6 +18,7 @@ class AppExtension extends AbstractExtension
// Reference: https://twig.symfony.com/doc/3.x/advanced.html#automatic-escaping // Reference: https://twig.symfony.com/doc/3.x/advanced.html#automatic-escaping
new TwigFilter('basename', basename(...)), new TwigFilter('basename', basename(...)),
new TwigFilter('ruby', self::ankiRubyToHtml(...)), new TwigFilter('ruby', self::ankiRubyToHtml(...)),
new TwigFilter('intersect_key', array_intersect_key(...))
]; ];
} }

View File

@ -141,5 +141,14 @@
{% endif %} {% endif %}
{% endfor %} {% endfor %}
</div> </div>
<div class="bg-body border-top p-2 sticky-bottom">
{% set learnt_kanken = char_info.lists.unicode|intersect_key(char_info.lists.kanken)|length %}
{% set total_kanken = char_info.lists.kanken|length %}
Kanken {{ learnt_kanken }}/{{ total_kanken }} ({{ ((learnt_kanken/total_kanken) * 100)|number_format(2) }}%)
|
{% set sn_kanken = char_info.lists.sn|intersect_key(char_info.lists.kanken)|length %}
{{ sn_kanken }}/{{ total_kanken }} ({{ ((sn_kanken/total_kanken) * 100)|number_format(2) }}%)
</div>
</div> </div>
{% endblock %} {% endblock %}