diff options
Diffstat (limited to 'Master/texmf-dist/tex/latex/dbshow/dbshow.sty')
-rw-r--r-- | Master/texmf-dist/tex/latex/dbshow/dbshow.sty | 1468 |
1 files changed, 699 insertions, 769 deletions
diff --git a/Master/texmf-dist/tex/latex/dbshow/dbshow.sty b/Master/texmf-dist/tex/latex/dbshow/dbshow.sty index d60c993db19..5543a6a09eb 100644 --- a/Master/texmf-dist/tex/latex/dbshow/dbshow.sty +++ b/Master/texmf-dist/tex/latex/dbshow/dbshow.sty @@ -1,906 +1,836 @@ -%% dbshow.sty -%% Copyright 2022 Li Changkai <lichangkai225@qq.com> -% -% This work may be distributed and/or modified under the -% conditions of the LaTeX Project Public License, either version 1.3 -% of this license or (at your option) any later version. -% The latest version of this license is in -% http://www.latex-project.org/lppl.txt -% and version 1.3 or later is part of all distributions of LaTeX -% version 2005/12/01 or later. -% -% This work has the LPPL maintenance status `maintained'. -% -% The Current Maintainer of this work is Li Changkai. -% -% This work consists of the files dbshow.sty, dbshow-doc.tex. -\def\myfileversion{v1.3} -\def\myfiledate{2022/01/10} -\RequirePackage{expl3, xparse} -\ProvidesExplPackage - {dbshow} - {\myfiledate} - {\myfileversion} - {database to store and show data} - +%% +%% This is file `dbshow.sty', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% dbshow.dtx (with options: `package') +%% +%% Copyright (C) 2022- by Changkai Li <lichangkai225@qq.com> +%% -------------------------------------------------------------------------- +%% +%% This work may be distributed and/or modified under the +%% conditions of the LaTeX Project Public License, either +%% version 1.3c of this license or (at your option) any later +%% version. This version of this license is in +%% http://www.latex-project.org/lppl/lppl-1-3c.txt +%% and the latest version of this license is in +%% http://www.latex-project.org/lppl.txt +%% and version 1.3 or later is part of all distributions of +%% LaTeX version 2005/12/01 or later. +%% +%% This work has the LPPL maintenance status "maintained". +%% +%% The Current Maintainer of this work is Changkai Li. +%% +%% This package consists of the file dbshow.dtx, +%% and the derived files dbshow.pdf, +%% dbshow.sty, +%% dbshow.ins and +%% README.md. +%% -------------------------------------------------------------------------- +%% +\NeedsTeXFormat{LaTeX2e} +\GetIdInfo$Id: dbshow.dtx 461d9bb 2022-01-14 02:50:24 +0800 Changkai Li <lichangkai225@qq.com> $ + {Database to store and display data} +\ProvidesExplPackage{\ExplFileName} + {\ExplFileDate}{1.4}{\ExplFileDescription} +\__kernel_dependency_version_check:nn { 2021-11-07 } { l3prop } +\__kernel_dependency_version_check:nn { 2021-05-17 } { l3str } +\__kernel_dependency_version_check:nn { 2021-05-10 } { l3clist } +\cs_generate_variant:Nn \msg_warning:nnnn { nnnx } +\cs_generate_variant:Nn \keys_set:nn { nv } +\cs_generate_variant:Nn \clist_use:nn { xx } +\cs_generate_variant:Nn \clist_use:nnnn { xxxx } +\cs_generate_variant:Nn \clist_map_inline:nn { Vn } +\cs_generate_variant:Nn \prop_get:NnN { cVN } +\cs_generate_variant:Nn \regex_extract_all:nnN { nVN } +\cs_generate_variant:Nn \regex_split:nnN { nVN } +\prg_generate_conditional_variant:Nnn \str_compare:nNn { VNV } { TF } +\prg_generate_conditional_variant:Nnn \int_compare:nNn { VNV } { TF } +\prg_generate_conditional_variant:Nnn \fp_compare:nNn { VNV } { TF } +\prg_generate_conditional_variant:Nnn \regex_match:nn { VV } { TF } +\prg_generate_conditional_variant:Nnn \clist_if_in:Nn { Nx } { TF } +\prop_const_from_keyval:Nn \c__dbshow_default_value_prop { + date = \dbtoday, + str = , + tl = , + clist = , + int = 0, + fp = 0 +} +\clist_const:Nn \__dbshow_type_clist { date, str, tl, clist, int, fp } +\int_gzero_new:N \g__dbshow_raw_filter_int \msg_new:nnn { dbshow } { non-existent-database } { Database~'#1'~does~not~exist~\msg_line_context:. } - -% #1 database -\cs_new:Nn \dbshow_check_database:n { - \prop_if_exist:cF { g__dbshow_type_map_#1 } - { \msg_fatal:nnn { dbshow } { non-existent-database } { #1 } } +\cs_new:Nn \__dbshow_check_database:n { + \prop_if_exist:cF { g__dbshow_attr_type_prop_#1 } + { \msg_fatal:nnn { dbshow } { non-existent-database } {#1} } } - \msg_new:nnn { dbshow } { non-existent-attr } { Attribute~'#2'~of~database~'#1'~does~not~exist~\msg_line_context:. } - -% #1 database #2 attr -\cs_new:Nn \dbshow_check_attr:nn { - \prop_if_in:cnF { g__dbshow_type_map_#1 } { #2 } - { \msg_fatal:nnnn { dbshow } { non-existent-attr } { #1 } { #2 } } +\cs_new:Nn \__dbshow_check_attr:nn { + \prop_if_in:cnF { g__dbshow_attr_type_prop_#1 } {#2} + { \msg_fatal:nnnn { dbshow } { non-existent-attr } {#1} {#2} } } - +\cs_generate_variant:Nn \__dbshow_check_attr:nn { nV } \msg_new:nnn { dbshow } { non-existent-style } { Style~'#1'~of~database~'#2'~does~not~exist~\msg_line_context:. } - -% #1 style #2 database -\cs_new:Nn \dbshow_check_style:nn { - \tl_if_exist:cF { g__dbshow_style_opts_#1_#2 } - { \msg_warning:nnnn { dbshow } { non-existent-style } { #1 } { #2 } } +\cs_new:Nn \__dbshow_check_style:nn { + \tl_if_exist:cF { g__dbshow_style_opts_tl_#1_#2 } + { \msg_warning:nnnn { dbshow } { non-existent-style } {#1} {#2} } } - \msg_new:nnn { dbshow } { non-existent-cond } { Conditional~'#2'~of~database~'#1'~does~not~exist~\msg_line_context:. } - -% #1 database #2 cond -\cs_new:Nn \dbshow_check_cond:nnn { +\cs_new:Nn \__dbshow_check_cond:nnn { \tl_if_exist:cF { g__dbshow_filter_attr_#1_#2 } - { \msg_fatal:nnnn { dbshow } { non-existent-cond } { #1 } { #2 } } + { \msg_fatal:nnnn { dbshow } { non-existent-cond } {#1} {#2} } } - \msg_new:nnn { dbshow } { non-existent-filter } { Filter~'#2'~of~database~'#1'~does~not~exist~and~is~ignored~\msg_line_context:. } - -\cs_generate_variant:Nn \msg_warning:nnnn { nnnx } -% #1 database #2 filter -\cs_new:Nn \dbshow_check_filter:nn { +\cs_new:Nn \__dbshow_check_filter:nn { \seq_if_exist:cF { g__dbshow_filter_run_seq_#1_#2 } { - \str_if_eq:eeF { #2 } { -none- } { - \msg_warning:nnnx { dbshow } { non-existent-filter } { #1 } { #2 } + \str_if_eq:eeF {#2} { -none- } { + \msg_warning:nnnx { dbshow } { non-existent-filter } {#1} {#2} } } } - +\cs_generate_variant:Nn \__dbshow_check_filter:nn { nv } \msg_new:nnn { dbshow } { non-existent-type } { Type~'#1'~does~not~exist,~the~type~of~attribute~should~be~one~of~ \{date,~str,~tl,~clist,~int,~fp\}~\msg_line_context:. } - -% #1 type -\cs_new:Nn \dbshow_check_type:n { - \clist_if_in:NnF \dbshow_type_clist { #1 } - { \msg_fatal:nnn { dbshow } { non-existent-type } { #1 } } +\cs_new:Nn \__dbshow_check_type:n { + \clist_if_in:NnF \__dbshow_type_clist {#1} + { \msg_fatal:nnn { dbshow } { non-existent-type } {#1} } } - -% #1 valid count #2 real count #3 content \msg_new:nnn { dbshow } { wrong-seperator } { option~'sep'~should~contain~#1~items~but~only~#2~items~was~given,~ sep~=~\{#3\}~\msg_line_context:. } - -% #1 valid count #2 real count #3 content -\cs_new:Nn \dbshow_sep_error:nnn { - \msg_error:nnnnn { dbshow } { wrong-seperator } { #1 } { #2 } { #3 } +\cs_new:Nn \__dbshow_sep_error:nnn { + \msg_error:nnnnn { dbshow } { wrong-seperator } {#1} {#2} {#3} } -\cs_generate_variant:Nn \dbshow_sep_error:nnn { xxx } - +\cs_generate_variant:Nn \__dbshow_sep_error:nnn { xxx } \msg_new:nnn { dbshow } { unsupported-sort-type } { unsupported~sort~type:~'#1'~\msg_line_context:.~The~type~should~be~one~of~ \{str,~date,~int,~fp\}. } - -\msg_new:nnn { dbshow } { invalid-relation } { - invalid~relation:~'#1'. -} - -\clist_const:Nn \dbshow_type_clist { date, str, tl, clist, int, fp } - -\prop_const_from_keyval:Nn \dbshow_default_value { - date = \dbtoday, - str = , - tl = , - clist = , - int = 0, - fp = 0 +\cs_new:Npn \__dbshow_process_default_value:w +#1\__dbshow_sep#2\__dbshow_sep#3|#4\__dbshow_stop { + \__dbshow_check_type:n {#3} + \prop_gput:cxx { g__dbshow_attr_type_prop_#1 } {#2} {#3} + \prop_gput:cxx { g__dbshow_default_map_#1 } {#2} {#4} } - -\cs_generate_variant:Nn \clist_use:nn { xx } -\cs_generate_variant:Nn \clist_use:nnnn { xxxx } -\cs_generate_variant:Nn \prop_get:NnN { cVN } -\cs_generate_variant:Nn \regex_extract_all:nnN { nVN } -\cs_generate_variant:Nn \regex_split:nnN { nVN } -\prg_generate_conditional_variant:Nnn \str_compare:nNn { VNV } { TF } -\prg_generate_conditional_variant:Nnn \int_compare:nNn { VNV } { TF } -\prg_generate_conditional_variant:Nnn \fp_compare:nNn { VNV } { TF } -\prg_generate_conditional_variant:Nnn \regex_match:nn { VV } { TF } -\prg_generate_conditional_variant:Nnn \clist_if_in:Nn { Nx } { TF } - -% #1 database #2 attr #3 type #4 default value -\cs_new:Npn \dbshow_process_default_value:w #1|#2=#3|#4\scan_stop { - \dbshow_check_type:n { #3 } - \prop_gput:cxx { g__dbshow_type_map_#1 } { #2 } { #3 } - \prop_gput:cxx { g__dbshow_default_map_#1 } { #2 } { #4 } -} - -\cs_new_protected:Nn \dbshow_process_type_map:n { +\cs_new_protected:Nn \__dbshow_process_attr_type_prop:n { \prop_gclear_new:c { g__dbshow_default_map_#1 } - \prop_map_inline:cn { g__dbshow_type_map_#1 } { - \str_if_in:nnTF { ##2 } { | } - { \dbshow_process_default_value:w #1|##1=##2\scan_stop } - { - \prop_get:NnN \dbshow_default_value { ##2 } \l_tmp_default - \dbshow_process_default_value:w #1|##1=##2|\l_tmp_default\scan_stop - } + \prop_map_inline:cn { g__dbshow_attr_type_prop_#1 } { + \str_if_in:nnTF {##2} { | } { + \__dbshow_process_default_value:w + #1\__dbshow_sep##1\__dbshow_sep##2\__dbshow_stop + } { + \prop_get:NnN \c__dbshow_default_value_prop {##2} \l__dbshow_tmp_default + \__dbshow_process_default_value:w + #1\__dbshow_sep##1\__dbshow_sep##2|\l__dbshow_tmp_default\__dbshow_stop + } } } - -% #1 database_name, #2 clist, attr=type -\cs_new_protected:Nn \dbshow_database_new:nn { +\cs_new_protected:Nn \__dbshow_database_new:nn { \int_gzero_new:c { g__dbshow_counter_#1 } - \prop_gset_from_keyval:cn { g__dbshow_type_map_#1 } { #2 } + \prop_gset_from_keyval:cn { g__dbshow_attr_type_prop_#1 } {#2} } - -% #1 database_name, #2 clist -\cs_new_protected:Nn \dbshow_database_new_append:nn { +\cs_new_protected:Nn \__dbshow_database_new_append:nn { \int_gzero_new:c { g__dbshow_counter_#1 } - \prop_if_exist:cF { g__dbshow_type_map_#1 } - { \prop_new:c { g__dbshow_type_map_#1 } } - \prop_gset_from_keyval:Nn \l_tmpa_prop { #2 } - \prop_concat:ccc { g__dbshow_type_map_#1 } { g__dbshow_type_map_#1 } { l_tmpa_prop } -} - -% #1 database_name, #2 database inherit from #3 clist -\cs_new_protected:Nn \dbshow_database_new_inherit:nnn { - \dbshow_check_database:n { #2 } - \str_if_eq:nnTF { #1 } { #2 } { - \dbshow_database_new_append:nn { #1 } { #3 } + \prop_if_exist:cF { g__dbshow_attr_type_prop_#1 } + { \prop_new:c { g__dbshow_attr_type_prop_#1 } } + \prop_gset_from_keyval:Nn \l_tmpa_prop {#2} + \prop_concat:ccc { g__dbshow_attr_type_prop_#1 } + { g__dbshow_attr_type_prop_#1 } { l_tmpa_prop } +} +\cs_new_protected:Nn \__dbshow_database_new_inherit:nnn { + \__dbshow_check_database:n {#2} + \str_if_eq:nnTF {#1} {#2} { + \__dbshow_database_new_append:nn {#1} {#3} } { \int_gzero_new:c { g__dbshow_counter_#1 } - \prop_gset_from_keyval:cn { g__dbshow_type_map_#1 } { #3 } - \prop_concat:ccc { g__dbshow_type_map_#1 } { g__dbshow_type_map_#2 } { g__dbshow_type_map_#1 } + \prop_gset_from_keyval:cn { g__dbshow_attr_type_prop_#1 } {#3} + \prop_concat:ccc { g__dbshow_attr_type_prop_#1 } + { g__dbshow_attr_type_prop_#2 } { g__dbshow_attr_type_prop_#1 } + } +} +\NewDocumentCommand { \dbNewDatabase } { s o m m } { + \IfNoValueTF {#2} { + \IfBooleanTF {#1} + { \__dbshow_database_new_append:nn {#3} {#4} } + { \__dbshow_database_new:nn {#3} {#4} } + } { \__dbshow_database_new_inherit:nnn {#3} {#2} {#4} } + \__dbshow_database_new_append:nn {#3} { id=int } + \__dbshow_process_attr_type_prop:n {#3} + \__dbshow_set_database_keys:n {#3} + \dbNewStyle{default}{#3}{} +} +\cs_new_protected:Nn \__dbshow_set_database_keys:n { + \prop_map_inline:cn { g__dbshow_attr_type_prop_#1 } { + \keys_define:nn { dbshow/database/#1 } { + ##1 .code:n = \__dbshow_save_data:nnn {#1} {##1} {####1}, + ##1* .code:n = { + \__dbshow_save_data:nnn {#1} {##1} { \exp_not:n {####1} }, + }, + } } } - -% #1 database_name, #2 attr -\cs_new:Nn \dbshow_get_type:nn { - \prop_item:cn { g__dbshow_type_map_#1 } { #2 } +\cs_new:Nn \__dbshow_get_type:nn { + \prop_item:cn { g__dbshow_attr_type_prop_#1 } {#2} } - -% #1 database_name -\cs_new:Nn \dbshow_get_counter:n { +\cs_generate_variant:Nn \__dbshow_get_type:nn { nV } +\cs_new:Nn \__dbshow_get_counter:n { \int_use:c { g__dbshow_counter_#1 } } - -% #1 database_name -\cs_new:Nn \dbshow_step_counter:n { +\cs_new:Nn \__dbshow_step_counter:n { \int_gincr:c { g__dbshow_counter_#1 } } - \NewDocumentCommand { \dbclear } { m } { \int_gzero:c { g__dbshow_counter_#1 } } - -% #1 database #2 attr #3 content -\cs_new:Nn \dbshow_save_data:nnn { - \dbshow_check_attr:nn { #1 } { #2 } - \use:c { - \str_case_e:nn { \prop_item:cn { g__dbshow_type_map_#1 } { #2 } } { - { str } { str_clear_new:c } - { tl } { tl_gclear_new:c } - { clist } { clist_gclear_new:c } - { int } { int_gzero_new:c } - { fp } { fp_gzero_new:c } - { date } { dbshow_date_gclear_new:n } - } - } { g__dbshow_data_#1_#2_\int_use:c { g__dbshow_counter_#1 } } - \use:c { - \str_case_e:nn { \prop_item:cn { g__dbshow_type_map_#1 } { #2 } } { - { str } { str_gset:cn } - { tl } { tl_gset:cn } - { clist } { clist_gset:cn } - { int } { int_gset:cn } - { fp } { fp_gset:cn } - { date } { dbshow_date_gset:nx } - } - } { g__dbshow_data_#1_#2_\int_use:c { g__dbshow_counter_#1 } } { #3 } -} -\cs_generate_variant:Nn \dbshow_save_data:nnn { nnx } - -% #1 before code tl #2 after code tl #3 item -\cs_new:Nn \dbshow_clist_wrapper:NNn { - \exp_not:n { { #1#3#2 }, } -} - -% #1 clist #2 sep #3 before code tl #4 after code tl -\cs_new:Nn \dbshow_clist_use:NNNN { - \int_case:nnF { \clist_count:N #2 } { - { 1 } { - \clist_use:xx - { \clist_map_tokens:Nn #1 { \dbshow_clist_wrapper:NNn #3 #4 } } - { \clist_item:Nn #2 { 1 } } +\cs_new:Nn \__dbshow_save_data:nnn { + \__dbshow_check_attr:nn {#1} {#2} + \str_case_e:nn { \__dbshow_get_type:nn {#1} {#2} } { + { str } { \str_clear_new:c } + { tl } { \tl_gclear_new:c } + { clist } { \clist_gclear_new:c } + { int } { \int_gzero_new:c } + { fp } { \fp_gzero_new:c } + { date } { \__dbdate_gclear_new:x } + } { g__dbshow_data_#1_#2_\__dbshow_get_counter:n {#1} } + \str_case_e:nn { \__dbshow_get_type:nn {#1} {#2} } { + { str } { \str_gset:cn } + { tl } { \tl_gset:cn } + { clist } { \clist_gset:cn } + { int } { \int_gset:cn } + { fp } { \fp_gset:cn } + { date } { \__dbdate_gset:xx } + } { g__dbshow_data_#1_#2_\__dbshow_get_counter:n {#1} } {#3} +} +\cs_generate_variant:Nn \__dbshow_save_data:nnn { nnx } +\NewDocumentEnvironment { dbitem } { m +O{} } { + \__dbshow_check_database:n {#1} + \__dbshow_step_counter:n {#1} + \cs_set:Nn \__dbshow_set_default:nn { + \__dbshow_save_data:nnx {#1} {##1} { + \prop_item:cn { g__dbshow_default_map_#1 } {##1} } - { 3 } { - \clist_use:xxxx - { \clist_map_tokens:Nn #1 { \dbshow_clist_wrapper:NNn #3 #4 } } - { \clist_item:Nn #2 { 1 } } - { \clist_item:Nn #2 { 2 } } - { \clist_item:Nn #2 { 3 } } - } - } { - \dbshow_sep_error:xxx - { 1~or~3 } - { \clist_count:N #2 } - { \clist_use:Nn #2 { ,~ } } } -} -\cs_generate_variant:Nn \dbshow_clist_use:NNNN { cccc } - -% #1 date #2 sep #3 zfill bool -\cs_new:Nn \dbshow_date_use:nNN { - \int_case:nnF { \clist_count:N #2 } { - { 1 } { - \bool_if:NTF { #3 } - { \dbshow_date_use_zfill:nf } - { \dbshow_date_use:nf } - { #1 } - { \clist_item:Nn #2 { 1 } } - } - { 4 } { - \bool_if:NTF { #3 } - { \dbshow_date_use_zfill:nffff } - { \dbshow_date_use:nffff } - { #1 } - { \clist_item:Nn #2 { 1 } } - { \clist_item:Nn #2 { 2 } } - { \clist_item:Nn #2 { 3 } } - { \clist_item:Nn #2 { 4 } } - } - } { - \dbshow_sep_error:xxx - { 1~or~4 } - { \clist_count:N #2 } - { \clist_use:Nn #2 { ,~ } } - } -} -\cs_generate_variant:Nn \dbshow_date_use:nNN { ncc } - -% #1 database #2 attr #3 index #4 style -\cs_new:Nn \dbshow_use_data:nnnn { - \str_case_e:nn { \prop_item:cn { g__dbshow_type_map_#1 } { #2 } } { - { str } { \str_use:c { g__dbshow_data_#1_#2_#3 } } - { tl } { \tl_use:c { g__dbshow_data_#1_#2_#3 } } - { int } { \int_use:c { g__dbshow_data_#1_#2_#3 } } - { fp } { \fp_use:c { g__dbshow_data_#1_#2_#3 } } - { clist } { - \dbshow_clist_use:cccc { g__dbshow_data_#1_#2_#3 } - { g__dbshow_style_attr_sep_#4_#1_#2 } - { g__dbshow_style_attr_item_before_#4_#1_#2 } - { g__dbshow_style_attr_item_after_#4_#1_#2 } - } - { date } { - \exp_args:Nnx - \tl_use:c { g__dbshow_style_attr_wrapper_#4_#1_#2 } { - \dbshow_date_use:ncc { g__dbshow_data_#1_#2_#3 } - { g__dbshow_style_attr_sep_#4_#1_#2 } - { g__dbshow_style_attr_zfill_#4_#1_#2 } - } + \prop_map_function:cN { g__dbshow_attr_type_prop_#1 } \__dbshow_set_default:nn + \__dbshow_save_data:nnx {#1} { id } { \__dbshow_get_counter:n {#1} } + \keys_set:nn { dbshow/database/#1 } {#2} + \NewDocumentCommand { \dbsave } { s m +m } { + \IfBooleanTF {##1} { + \__dbshow_save_data:nnn {#1} {##2} { \exp_not:n {##3} } + } { + \__dbshow_save_data:nnn {#1} {##2} {##3} } } +} {} +\NewDocumentCommand { \dbitemkv } { m +m } { + \begin{dbitem}{#1}[#2] + \end{dbitem} } - -% #1 database -\cs_new_protected:Nn \dbshow_set_database_keys:n { - \prop_map_inline:cn { g__dbshow_type_map_#1 } { - \keys_define:nn { dbshow/database/#1 } { - ##1 .code:n = \dbshow_save_data:nnn { #1 } { ##1 } { ####1 }, - } - } +\cs_new:Nn \__dbshow_filter_int:NNNnn { + \int_compare:nTF {#2} {#4} {#5} } - -% #1 append or not #2 inherit #3 database #4 attrs -\NewDocumentCommand { \dbNewDatabase } { s o m m } { - \IfNoValueTF { #2 } { - \IfBooleanTF { #1 } - { \dbshow_database_new_append:nn { #3 } { #4 } } - { \dbshow_database_new:nn { #3 } { #4 } } - } { \dbshow_database_new_inherit:nnn { #3 } { #2 } { #4 } } - \dbshow_database_new_append:nn { #3 } { id=int } - \dbshow_process_type_map:n { #3 } - \dbshow_set_database_keys:n { #3 } - \dbNewStyle{default}{#3}{} -} - -% #1 database #2 attr-content map -\NewDocumentEnvironment { dbitem } { m O{} +b } { - \dbshow_check_database:n { #1 } - \dbshow_step_counter:n { #1 } - \cs_set:Nn \dbshow_set_default:nn { - \dbshow_save_data:nnx { #1 } { ##1 } { - \prop_item:cn { g__dbshow_default_map_#1 } { ##1 } - } - } - \prop_map_function:cN { g__dbshow_type_map_#1 } \dbshow_set_default:nn - \dbshow_save_data:nnx { #1 } { id } { \dbshow_get_counter:n { #1 } } - \keys_set:nn { dbshow/database/#1 } { #2 } - % ##1 exp or not ##2 attr ##3 content - \NewDocumentCommand { \dbsave } { s m m } { - \IfBooleanTF { ##1 } { - \dbshow_save_data:nnn { #1 } { ##2 } { \exp_not:n { ##3 } } - } { - \dbshow_save_data:nnn { #1 } { ##2 } { ##3 } - } - } -} { #3 } - -\cs_new:Nn \dbshow_if_int: { - \int_compare:nTF { \l_dbshow_rela } - { \dbshow_set_true: } - { \dbshow_set_false: } -} - -\cs_new:Nn \dbshow_if_fp: { - \fp_compare:nTF { \l_dbshow_rela } - { \dbshow_set_true: } - { \dbshow_set_false: } -} - -% star: all in -% no star: one in -\cs_new:Nn \dbshow_if_clist: { - \bool_if:NTF \l_star_bool { % and - \dbshow_set_true: - \exp_args:Nx - \clist_map_inline:nn { \l_dbshow_rela } { - \clist_if_in:NnF \dbval { ##1 } { - \dbshow_set_false: - \clist_map_break: - } - } - } - { % or - \dbshow_set_false: - \exp_args:Nx - \clist_map_inline:nn { \l_dbshow_rela } { - \clist_if_in:NnT \dbval { ##1 } { - \dbshow_set_true: - \clist_map_break: - } - } - } +\cs_generate_variant:Nn \__dbshow_filter_int:NNNnn { cccnn } +\cs_new:Nn \__dbshow_filter_fp:NNNnn { + \int_compare:nTF {#2} {#4} {#5} } - -% star: match full -% no star: match part -\cs_new:Nn \dbshow_if_str: { - \bool_if:NT \l_star_bool { - \tl_put_left:Nn \l_dbshow_rela { \A } - \tl_put_right:Nn \l_dbshow_rela { \Z } - } - \regex_match:VVTF \l_dbshow_rela \dbval - { \dbshow_set_true: } - { \dbshow_set_false: } -} -\cs_set_eq:NN \dbshow_if_tl: \dbshow_if_str: - -\cs_new:Npn \dbshow_parse_date:w #1|#2\dbshow_stop { - \clist_set_eq:Nc \l_point_clist { g__review_points_#1 } - \tl_set:Nn \l_date_tl { #2 } -} - -\cs_new_protected:Nn \dbshow_if_date: { - \int_zero_new:N \l__dbshow_if_tmpa_int - \int_zero_new:N \l__dbshow_if_tmpb_int - \int_zero_new:N \l__dbshow_if_diff_int - \bool_if:NTF \l_star_bool { % review points - \exp_after:wN \dbshow_parse_date:w \l_dbshow_rela\dbshow_stop - \dbshow_date_clear_new:n { tmp_day1 } - \dbshow_date_clear_new:n { tmp_day2 } - \dbshow_date_set:nx { tmp_day1 } { \l_date_tl } - \dbshow_date_set:nx { tmp_day2 } { \dbval } - \dbshow_date_sub:nnN { tmp_day1 } { tmp_day2 } \l__dbshow_if_diff_int - \clist_if_in:NxTF \l_point_clist { \int_use:N \l__dbshow_if_diff_int } - { \dbshow_set_true: } - { \dbshow_set_false: } - } - { % rela - \tl_set:Nx \l_dbshow_rela { \l_dbshow_rela } - \regex_extract_all:nVN { \d{4}/\d+/\d+ } \l_dbshow_rela \l_date_seq - \regex_split:nVN { \d{4}/\d+/\d+ } \l_dbshow_rela \l_other_seq - \tl_clear:N \l_dbshow_rela - \int_set:Nn \l__dbshow_if_tmpa_int { \seq_count:N \l_date_seq } - \int_step_inline:nn { \l__dbshow_if_tmpa_int } { - \tl_put_right:Nx \l_dbshow_rela { \seq_item:Nn \l_other_seq { ##1 } } - \dbshow_date_clear_new:n { rela-tmp } - \dbshow_date_set:nx { rela-tmp } { \seq_item:Nn \l_date_seq { ##1 } } - \dbshow_date_to_int:nN { rela-tmp } \l__dbshow_if_tmpb_int - \tl_put_right:Nx \l_dbshow_rela { \int_use:N \l__dbshow_if_tmpb_int } +\cs_generate_variant:Nn \__dbshow_filter_fp:NNNnn { cccnn } +\cs_new_protected:Nn \__dbshow_filter_clist:NNNnn { + \bool_if:NTF #1 { + #4 \clist_map_inline:Vn #2 + { \clist_if_in:NnF #3 {##1} { #5 \clist_map_break: } } + } { + #5 \clist_map_inline:Vn #2 + { \clist_if_in:NnT #3 {##1} { #4 \clist_map_break: } } + } +} +\cs_generate_variant:Nn \__dbshow_filter_clist:NNNnn { cccnn } +\cs_new_protected:Nn \__dbshow_filter_str:NNNnn { + \bool_if:NT #1 { + \tl_put_left:Nn #2 { \A } + \tl_put_right:Nn #2 { \Z } + } + \regex_match:VVTF #2 #3 {#4} {#5} +} +\cs_generate_variant:Nn \__dbshow_filter_str:NNNnn { cccnn } +\cs_set_eq:NN \__dbshow_filter_tl:NNNnn \__dbshow_filter_str:NNNnn +\cs_generate_variant:Nn \__dbshow_filter_tl:NNNnn { cccnn } +\cs_new_protected:Npn \__dbshow_parse_date_cond:NNw #1#2#3|#4\__dbshow_stop { + \clist_set_eq:Nc #1 { g__review_points_#3 } + \tl_set:Nn #2 {#4} +} +\cs_new_protected:Nn \__dbshow_filter_date:NNNnn { + \bool_if:NTF #1 { + \int_zero_new:N \l__dbshow_filter_diff_int + \exp_last_unbraced:NNNV \__dbshow_parse_date_cond:NNw + \l__dbshow_filter_tmp_clist \l__dbshow_filter_tmp_tl {#2} \__dbshow_stop + \__dbdate_clear_new:n { tmp_day1 } + \__dbdate_clear_new:n { tmp_day2 } + \__dbdate_set:xx { tmp_day1 } { \l__dbshow_filter_tmp_tl } + \__dbdate_set:xx { tmp_day2 } {#3} + \__dbdate_sub:nnN { tmp_day1 } { tmp_day2 } \l__dbshow_filter_diff_int + \clist_if_in:NxTF \l__dbshow_filter_tmp_clist + { \int_use:N \l__dbshow_filter_diff_int } {#4} {#5} + } { + \int_zero_new:N \l__dbshow_filter_tmpa_int + \int_zero_new:N \l__dbshow_filter_tmpb_int + \tl_set:Nx \l__dbshow_expr_tl {#2} + \regex_extract_all:nVN { \d{4}/\d+/\d+ } + \l__dbshow_expr_tl \l__dbshow_filter_date_seq + \regex_split:nVN { \d{4}/\d+/\d+ } + \l__dbshow_expr_tl \l__dbshow_filter_other_seq + \tl_clear:N \l__dbshow_expr_tl + \int_set:Nn \l__dbshow_filter_tmpa_int + { \seq_count:N \l__dbshow_filter_date_seq } + \int_step_inline:nn { \l__dbshow_filter_tmpa_int } { + \tl_put_right:Nx \l__dbshow_expr_tl + { \seq_item:Nn \l__dbshow_filter_other_seq {##1} } + \__dbdate_clear_new:n { date-tmp } + \__dbdate_set:xx { date-tmp } + { \seq_item:Nn \l__dbshow_filter_date_seq {##1} } + \__dbdate_to_int:nN { date-tmp } \l__dbshow_filter_tmpb_int + \tl_put_right:Nx \l__dbshow_expr_tl + { \int_use:N \l__dbshow_filter_tmpb_int } } - \tl_put_right:Nx \l_dbshow_rela { - \seq_item:Nn \l_other_seq { \l__dbshow_if_tmpa_int + 1 } + \tl_put_right:Nx \l__dbshow_expr_tl { + \seq_item:Nn \l__dbshow_filter_other_seq + { \l__dbshow_filter_tmpa_int + 1 } } - \int_compare:nTF { \l_dbshow_rela } - { \dbshow_set_true: } - { \dbshow_set_false: } - } -} - -% #1 database name #2 cond name #3 index -\cs_set:Nn \dbshow_if:nnn { - \tl_set_eq:Nc \l_dbshow_attr { g__dbshow_filter_attr_#1_#2 } - \tl_set_eq:Nc \l_dbshow_rela { g__dbshow_filter_rela_#1_#2 } - \prop_get:cVN { g__dbshow_type_map_#1 } \l_dbshow_attr \l_tmp_type - \cs_set_eq:Nc \dbval { g__dbshow_data_#1_\l_dbshow_attr _#3 } - \cs_set:Nn \dbshow_set_true: - { \bool_gset_true:c { g__dbshow_filter_bool_#1_#2 } } - \cs_set:Nn \dbshow_set_false: + \int_compare:nTF { \l__dbshow_expr_tl } {#4} {#5} + } +} +\cs_generate_variant:Nn \__dbshow_filter_date:NNNnn { cccnn } +\cs_set:Nn \__dbshow_filter:nnn { + \tl_set_eq:Nc \l__dbshow_attr_tl { g__dbshow_filter_attr_tl_#1_#2 } + \cs_set_eq:Nc \dbval { g__dbshow_data_#1_\l__dbshow_attr_tl _#3 } + \use:c + { __dbshow_filter_\__dbshow_get_type:nV {#1} \l__dbshow_attr_tl :cccnn } + { g__dbshow_cond_star_bool_#1_#2 } + { g__dbshow_filter_expr_tl_#1_#2 } + { dbval } + { \bool_gset_true:c { g__dbshow_filter_bool_#1_#2 } } { \bool_gset_false:c { g__dbshow_filter_bool_#1_#2 } } - \bool_set_eq:Nc \l_star_bool { g__dbshow_cond_star_#1_#2 } - \use:c { dbshow_if_\l_tmp_type : } -} - -% 将cond->attr, cond->rela, cond->bool关联起来 -% #1 database name #2 cond name #3 attr #4 rela #5 star -\cs_new_protected:Nn \dbshow_new_conditional:nnnnn { - \tl_gset:cn { g__dbshow_filter_attr_#1_#2 } { #3 } - \tl_gset:cn { g__dbshow_filter_rela_#1_#2 } { #4 } +} +\cs_new_protected:Nn \__dbshow_new_conditional:nnnnn { + \tl_gset:cn { g__dbshow_filter_attr_tl_#1_#2 } {#3} + \tl_gset:cn { g__dbshow_filter_expr_tl_#1_#2 } {#4} \bool_if_exist:cF { g__dbshow_filter_bool_#1_#2 } { \bool_new:c { g__dbshow_filter_bool_#1_#2 } } - \bool_if_exist:cF { g__dbshow_cond_star_#1_#2 } - { \bool_new:c { g__dbshow_cond_star_#1_#2 } } - \IfBooleanTF { #5 } - { \bool_gset_true:c { g__dbshow_cond_star_#1_#2 } } - { \bool_gset_false:c { g__dbshow_cond_star_#1_#2 } } - \cs_gset:cn { g__dbshow_filter_cs_#1_#2:n } { - \dbshow_if:nnn { #1 } { #2 } { ##1 } + \bool_if_exist:cF { g__dbshow_cond_star_bool_#1_#2 } + { \bool_new:c { g__dbshow_cond_star_bool_#1_#2 } } + \IfBooleanTF {#5} + { \bool_gset_true:c { g__dbshow_cond_star_bool_#1_#2 } } + { \bool_gset_false:c { g__dbshow_cond_star_bool_#1_#2 } } + \cs_gset:cn { g__dbshow_filter_hook_#1_#2:n } { + \__dbshow_filter:nnn {#1} {#2} {##1} } - \seq_gput_right:cn { g__dbshow_cond_list_#1 } { #2 } + \seq_gput_right:cn { g__dbshow_cond_seq_#1 } {#2} } - -% 将组合条件cond1, cond2, ..., 替换成cond1->bool, cond2->bool, ... -% #1 database name #2 filter name #3 filters -\cs_new_protected:Nn \dbshow_combine_conditional:nnn { +\cs_new_protected:Nn \__dbshow_combine_conditional:nnn { \tl_gset_eq:cN { g__dbshow_filter_bool_tl_#1_#2 } \c_true_bool \seq_gclear_new:c { g__dbshow_filter_run_seq_#1_#2 } - \regex_extract_all:nnN { \w+ } { #3 } \l_tmpa_seq - \seq_map_inline:Nn \l_tmpa_seq { - % ##1 cond name - \seq_if_in:cnT { g__dbshow_cond_list_#1 } { ##1 } { + \regex_extract_all:nnN { \w+ } {#3} \l__dbshow_cond_seq + \seq_map_inline:Nn \l__dbshow_cond_seq { + \seq_if_in:cnT { g__dbshow_cond_seq_#1 } {##1} { \seq_gput_right:cn { g__dbshow_filter_run_seq_#1_#2 } - { g__dbshow_filter_cs_#1_##1:n } + { g__dbshow_filter_hook_#1_##1:n } } } - \tl_set:Nn \l_tmpa_tl { #3 } + \tl_set:Nn \l__dbshow_cond_expr_tl {#3} \regex_replace_all:nnN { \w+ } { \c{ g__dbshow_filter_bool_#1_\0 } } - \l_tmpa_tl - \tl_gset_eq:cN { g__dbshow_filter_bool_tl_#1_#2 } \l_tmpa_tl -} - -% #1 database #2 content -\NewDocumentEnvironment { dbFilters } { m +b } { - \seq_gclear_new:c { g__dbshow_cond_list_#1 } - % #1 star #2 cond name #3 attr #4 rela + \l__dbshow_cond_expr_tl + \tl_gset_eq:cN + { g__dbshow_filter_bool_tl_#1_#2 } \l__dbshow_cond_expr_tl +} +\cs_generate_variant:Nn \__dbshow_combine_conditional:nnn { nVn } +\NewDocumentEnvironment { dbFilters } { m } { + \seq_gclear_new:c { g__dbshow_cond_seq_#1 } \DeclareDocumentCommand { \dbNewConditional } { s m m m } { - \dbshow_new_conditional:nnnnn - { #1 } { ##2 } { ##3 } { ##4 } { ##1 } + \__dbshow_new_conditional:nnnnn + {#1} {##2} {##3} {##4} {##1} } - % ##1 filter name ##2 filters ##3 info \DeclareDocumentCommand { \dbCombineConditionals } { m m O{} } { - \tl_gset:cn { g__dbshow_filter_info_#1_##1 } { ##3 } - \dbshow_combine_conditional:nnn { #1 } { ##1 } { ##2 } + \tl_gset:cn { g__dbshow_filter_info_tl_#1_##1 } {##3} + \__dbshow_combine_conditional:nnn {#1} {##1} {##2} } - #2 -} { } - -% #1 name #2 points +} {} \NewDocumentCommand { \dbNewReviewPoints } { m m } { - \clist_set:cn { g__review_points_#1 } { #2 } -} - -\cs_new:Nn \dbshow_identity:n { #1 } - -% #1 style name #2 database name #3 attr -\cs_new_protected:Nn \dbshow_new_attr_style:nnn { - \dbshow_check_attr:nn { #2 } { #3 } + \clist_set:cn { g__review_points_#1 } {#2} +} +\cs_set_eq:NN \dbIntAbs \int_abs:n +\cs_set_eq:NN \dbIntSign \int_sign:n +\cs_set_eq:NN \dbIntDivRound \int_div_round:nn +\cs_set_eq:NN \dbIntDivTruncate \int_div_truncate:nn +\cs_set_eq:NN \dbIntMax \int_max:nn +\cs_set_eq:NN \dbIntMin \int_min:nn +\cs_set_eq:NN \dbIntMod \int_mod:nn +\cs_set_eq:NN \dbFpSign \fp_sign:n +\cs_new:Nn \__dbshow_identity:n {#1} +\cs_new_protected:Nn \__dbshow_new_attr_style:nnn { + \__dbshow_check_attr:nn {#2} {#3} \keys_define:nn { dbshow/style/#1/#3 } { - before-code .tl_gset:c = { g__dbshow_style_attr_before_#1_#2_#3 }, - before-code .initial:n = , - after-code .tl_gset:c = { g__dbshow_style_attr_after_#1_#2_#3 }, - after-code .initial:n = , - % for date and clist - sep .clist_gset:c = { g__dbshow_style_attr_sep_#1_#2_#3 }, - % only for clist - item-before-code .tl_gset:c = { g__dbshow_style_attr_item_before_#1_#2_#3 }, - item-before-code .initial:n = , - item-after-code .tl_gset:c = { g__dbshow_style_attr_item_after_#1_#2_#3 }, - item-after-code .initial:n = , - % only for date - zfill .bool_gset:c = { g__dbshow_style_attr_zfill_#1_#2_#3 }, - zfill .initial:n = true, - zfill .default:n = true, - wrapper .tl_gset:c = { g__dbshow_style_attr_wrapper_#1_#2_#3 }, - wrapper .initial:n = { \dbshow_identity:n }, + before-code .tl_gset:c = { + g__dbshow_style_attr_before_tl_#1_#2_#3 + }, + before-code .initial:n = , + after-code .tl_gset:c = { + g__dbshow_style_attr_after_tl_#1_#2_#3 + }, + after-code .initial:n = , + sep .clist_gset:c = { + g__dbshow_style_attr_sep_#1_#2_#3 + }, + item-before-code .tl_gset:c = { + g__dbshow_style_attr_item_before_tl_#1_#2_#3 + }, + item-before-code .initial:n = , + item-after-code .tl_gset:c = { + g__dbshow_style_attr_item_after_tl_#1_#2_#3 + }, + item-after-code .initial:n = , + zfill .bool_gset:c = { + g__dbshow_style_attr_zfill_bool_#1_#2_#3 + }, + zfill .initial:n = true, + zfill .default:n = true, + wrapper .tl_gset:c = { + g__dbshow_style_attr_wrapper_#1_#2_#3 + }, + wrapper .initial:n = { \__dbshow_identity:n }, } - \str_case_e:nn { \prop_item:cn { g__dbshow_type_map_#2 } { #3 } } { - { clist } { \keys_set:nn { dbshow/style/#1/#3 } { sep = { { ,~ } } } } - { date } { \keys_set:nn { dbshow/style/#1/#3 } { sep = { { / } } } } + \str_case_e:nn { \__dbshow_get_type:nn {#2} {#3} } { + { clist } + { \keys_set:nn { dbshow/style/#1/#3 } { sep = { { ,~ } } } } + { date } + { \keys_set:nn { dbshow/style/#1/#3 } { sep = { { / } } } } } } - -\int_gzero_new:N \g__dbshow_raw_filter_int -% #1 style name #2 database name -\cs_new_protected:Nn \dbshow_new_database_style:nn { - \dbshow_check_database:n { #2 } +\cs_new_protected:Nn \__dbshow_new_database_style:nn { + \__dbshow_check_database:n {#2} \keys_define:nn { dbshow/style/#1 } { - filter .tl_gset:c = { g__dbshow_filter_#1_#2 }, - filter .initial:n = -none-, - raw-filter .code:n = { - \int_gincr:N \g__dbshow_raw_filter_int - \str_set:Nx \l_tmpa_str { -raw\int_use:N \g__dbshow_raw_filter_int - } - \exp_args:NnV \tl_gset:cn { g__dbshow_filter_#1_#2 } \l_tmpa_str - \exp_args:NnV \dbshow_combine_conditional:nnn { #2 } \l_tmpa_str { ##1 } + raw-filter .code:n = { + \int_gincr:N \g__dbshow_raw_filter_int + \str_set:Nx \l__dbshow_raw_filter_str + { -raw\int_use:N \g__dbshow_raw_filter_int - } + \tl_gset:cV { g__dbshow_filter_#1_#2 } \l__dbshow_raw_filter_str + \__dbshow_combine_conditional:nnn {#2} \l__dbshow_raw_filter_str {##1} }, - sort .clist_gset:c = { g__dbshow_sort_#1_#2 }, - before-code .tl_gset:c = { g__dbshow_style_before_#1_#2 }, - before-code .initial:n = , - item-code .tl_gset:c = { g__dbshow_style_database_item_#1_#2 }, - item-code .initial:n = , - after-code .tl_gset:c = { g__dbshow_style_after_#1_#2 }, - after-code .initial:n = , - record-before-code .tl_gset:c = { g__dbshow_style_record_before_#1_#2 }, - record-before-code .initial:n = , - record-after-code .tl_gset:c = { g__dbshow_style_record_after_#1_#2 }, - record-after-code .initial:n = , - } - \prop_map_inline:cn { g__dbshow_type_map_#2 } { - \dbshow_new_attr_style:nnn { #1 } { #2 } { ##1 } - } + filter .tl_gset:c = { g__dbshow_filter_#1_#2 }, + filter .initial:n = -none-, + sort .clist_gset:c = { g__dbshow_sort_clist_#1_#2 }, + before-code .tl_gset:c = { g__dbshow_style_before_tl_#1_#2 }, + before-code .initial:n = , + item-code .tl_gset:c = { g__dbshow_style_database_item_tl_#1_#2 }, + item-code .initial:n = , + after-code .tl_gset:c = { g__dbshow_style_after_tl_#1_#2 }, + after-code .initial:n = , + record-before-code .tl_gset:c = { g__dbshow_style_record_before_tl_#1_#2 }, + record-before-code .initial:n = , + record-after-code .tl_gset:c = { g__dbshow_style_record_after_tl_#1_#2 }, + record-after-code .initial:n = , + } + \prop_map_inline:cn { g__dbshow_attr_type_prop_#2 } + { \__dbshow_new_attr_style:nnn {#1} {#2} {##1} } } - -% #1 base style #2 style #3 database #4 opt \NewDocumentCommand { \dbNewStyle } { o m m +m } { - \tl_gset:cn { g__dbshow_style_opts_#2_#3 } { #4, } - \IfValueT { #1 } { - \tl_gclear:N \g_tmpa_tl - \clist_map_inline:nn { #1 } { - \dbshow_check_style:nn { ##1 } { #3 } - \tl_if_exist:cT { g__dbshow_style_opts_##1_#3 } { - \tl_gconcat:ccc { g_tmpa_tl } - { g_tmpa_tl } { g__dbshow_style_opts_##1_#3 } + \tl_gset:cn { g__dbshow_style_opts_tl_#2_#3 } { #4, } + \IfValueT {#1} { + \tl_clear_new:N \l__dbshow_style_tmp_tl + \clist_map_inline:nn {#1} { + \__dbshow_check_style:nn {##1} {#3} + \tl_if_exist:cT { g__dbshow_style_opts_tl_##1_#3 } { + \tl_concat:ccc { l__dbshow_style_tmp_tl } + { l__dbshow_style_tmp_tl } { g__dbshow_style_opts_tl_##1_#3 } } } - \tl_gconcat:ccc { g__dbshow_style_opts_#2_#3 } - { g_tmpa_tl } { g__dbshow_style_opts_#2_#3 } - } - \dbshow_new_database_style:nn { #2 } { #3 } - \exp_args:Nnv - \keys_set:nn { dbshow/style/#2 } { g__dbshow_style_opts_#2_#3 } -} - -\cs_new:Npn \dbshow_sort_parse_star:w #1* { - \tl_set:Nx \l_op_same { > } - \tl_set:Nx \l_op_swap { < } - \str_set:Nn \l_tmpa_str { #1 } -} - -% #1 database #2 index #3 style -\cs_new:Nn \dbshow_sort:nNn { - \int_set:Nn \l_tmpb_int { \clist_count:c { g__dbshow_sort_#3_#1 } } + \tl_gconcat:ccc { g__dbshow_style_opts_tl_#2_#3 } + { l__dbshow_style_tmp_tl } { g__dbshow_style_opts_tl_#2_#3 } + } + \__dbshow_new_database_style:nn {#2} {#3} + \keys_set:nv { dbshow/style/#2 } { g__dbshow_style_opts_tl_#2_#3 } +} +\cs_new_protected:Npn \__dbshow_sort_parse_star:NNNw #1#2#3#4* { + \tl_set:Nn #1 { > } + \tl_set:Nn #2 { < } + \tl_set:Nn #3 {#4} +} +\cs_new_protected:Nn \__dbshow_sort:nNn { + \int_zero_new:N \l__dbshow_sort_len_int + \int_zero_new:N \l__dbshow_sort_tmp_int + \int_set:Nn \l__dbshow_sort_len_int + { \clist_count:c { g__dbshow_sort_clist_#3_#1 } } \clist_sort:Nn #2 { - \int_zero:N \l_tmpa_int - \cs_set:Nn \dbshow_sort_single: { - \int_incr:N \l_tmpa_int - \str_set:Nx \l_tmpa_str % attr - { \clist_item:cn { g__dbshow_sort_#3_#1 } { \l_tmpa_int } } - \str_if_in:NnTF \l_tmpa_str { * } { - \exp_after:wN \dbshow_sort_parse_star:w \l_tmpa_str - } - { - \tl_set:Nx \l_op_same { < } - \tl_set:Nx \l_op_swap { > } + \int_zero:N \l__dbshow_sort_tmp_int + \cs_set:Nn \__dbshow_sort_single: { + \int_incr:N \l__dbshow_sort_tmp_int + \str_set:Nx \l__dbshow_sort_attr_str { + \clist_item:cn + { g__dbshow_sort_clist_#3_#1 } + { \l__dbshow_sort_tmp_int } } - \exp_args:NnV \dbshow_check_attr:nn { #1 } \l_tmpa_str - - \prop_get:cVN { g__dbshow_type_map_#1 } \l_tmpa_str \l_tmp_type - \clist_if_in:nVF { str, int, date, fp } \l_tmp_type { - \msg_error:nnx { dbshow } { unsupported-sort-type } { \l_tmp_type } + \str_if_in:NnTF \l__dbshow_sort_attr_str { * } { + \exp_after:wN \__dbshow_sort_parse_star:NNNw + \exp_after:wN \l__dbshow_sort_same_op_tl + \exp_after:wN \l__dbshow_sort_swap_op_tl + \exp_after:wN \l__dbshow_sort_attr_str + \l__dbshow_sort_attr_str + } { + \tl_set:Nn \l__dbshow_sort_same_op_tl { < } + \tl_set:Nn \l__dbshow_sort_swap_op_tl { > } } - - \str_if_eq:eeT { \l_tmp_type } { date } { - \str_set:Nn \l_tmp_type { str } + \__dbshow_check_attr:nV {#1} \l__dbshow_sort_attr_str + \tl_set:Nx \l__dbshow_sort_type_tl + { \__dbshow_get_type:nV {#1} \l__dbshow_sort_attr_str } + \clist_if_in:nVF + { str, int, date, fp } { \l__dbshow_sort_type_tl } { + \msg_error:nnx { dbshow } { unsupported-sort-type } + { \l__dbshow_sort_type_tl } } - - \cs_set_eq:Nc \l_tmpa_tl { g__dbshow_data_#1_\l_tmpa_str _##1 } - \cs_set_eq:Nc \l_tmpb_tl { g__dbshow_data_#1_\l_tmpa_str _##2 } - \cs_set_eq:Nc \dbshow_compare { \l_tmp_type _compare:VNVTF } - - \dbshow_compare \l_tmpa_tl \l_op_same \l_tmpb_tl + \str_if_eq:eeT { \l__dbshow_sort_type_tl } { date } + { \tl_set:Nn \l__dbshow_sort_type_tl { str } } + \cs_set_eq:Nc \l__dbshow_sort_tmpa_tl + { g__dbshow_data_#1_\l__dbshow_sort_attr_str _##1 } + \cs_set_eq:Nc \l__dbshow_sort_tmpb_tl + { g__dbshow_data_#1_\l__dbshow_sort_attr_str _##2 } + \cs_set_eq:Nc \__dbshow_compare + { \l__dbshow_sort_type_tl _compare:VNVTF } + \__dbshow_compare \l__dbshow_sort_tmpa_tl + \l__dbshow_sort_same_op_tl \l__dbshow_sort_tmpb_tl { \sort_return_same: } { - \dbshow_compare { \l_tmpa_tl } \l_op_swap { \l_tmpb_tl } + \__dbshow_compare \l__dbshow_sort_tmpa_tl + \l__dbshow_sort_swap_op_tl \l__dbshow_sort_tmpb_tl { \sort_return_swapped: } { - \int_compare:nTF { \l_tmpa_int = \l_tmpb_int } + \int_compare:nTF + { \l__dbshow_sort_len_int = \l__dbshow_sort_tmp_int } { \sort_return_same: } - { \dbshow_sort_single: } + { \__dbshow_sort_single: } } } } - \dbshow_sort_single: + \__dbshow_sort_single: } } - -% #1 style #2 database #3 filter -\cs_new_protected:Nn \dbshow_init_iterator:nnn { - \tl_set:Nn \dbDatabase { #2 } - \tl_set:Nx \dbFilterName { #3 } - \tl_set_eq:Nc \dbFilterInfo { g__dbshow_filter_info_#2_#3 } - - \clist_clear_new:N \l_index - %% run filters - % ##1 index - \cs_set:Nn \dbshow_filter:n { - \seq_if_exist:cTF { g__dbshow_filter_run_seq_#2_#3 } { - \seq_map_inline:cn { g__dbshow_filter_run_seq_#2_#3 } { - \use:c { ####1 } { ##1 } +\cs_new:Nn \__dbshow_clist_wrapper:NNn { + \exp_not:n { { #1#3#2 }, } +} +\cs_new:Nn \__dbshow_clist_use:NNNN { + \int_case:nnF { \clist_count:N #2 } { + { 1 } { + \clist_use:xx + { \clist_map_tokens:Nn #1 { \__dbshow_clist_wrapper:NNn #3 #4 } } + { \clist_item:Nn #2 { 1 } } + } + { 3 } { + \clist_use:xxxx + { \clist_map_tokens:Nn #1 { \__dbshow_clist_wrapper:NNn #3 #4 } } + { \clist_item:Nn #2 { 1 } } + { \clist_item:Nn #2 { 2 } } + { \clist_item:Nn #2 { 3 } } + } + } { + \__dbshow_sep_error:xxx + { 1~or~3 } + { \clist_count:N #2 } + { \clist_use:Nn #2 { ,~ } } + } +} +\cs_generate_variant:Nn \__dbshow_clist_use:NNNN { cccc } +\cs_new:Nn \__dbshow_date_use:nNN { + \int_case:nnF { \clist_count:N #2 } { + { 1 } { + \bool_if:NTF {#3} + { \__dbdate_use_zfill:nf } + { \__dbdate_use:nf } + {#1} + { \clist_item:Nn #2 { 1 } } + } + { 4 } { + \bool_if:NTF {#3} + { \__dbdate_use_zfill:nffff } + { \__dbdate_use:nffff } + {#1} + { \clist_item:Nn #2 { 1 } } + { \clist_item:Nn #2 { 2 } } + { \clist_item:Nn #2 { 3 } } + { \clist_item:Nn #2 { 4 } } + } + } { + \__dbshow_sep_error:xxx + { 1~or~4 } + { \clist_count:N #2 } + { \clist_use:Nn #2 { ,~ } } + } +} +\cs_generate_variant:Nn \__dbshow_date_use:nNN { ncc } +\cs_new:Nn \__dbshow_use_data:nnnn { + \str_case_e:nn + { \prop_item:cn { g__dbshow_attr_type_prop_#1 } {#2} } { + { str } { \str_use:c { g__dbshow_data_#1_#2_#3 } } + { tl } { \tl_use:c { g__dbshow_data_#1_#2_#3 } } + { int } { \int_use:c { g__dbshow_data_#1_#2_#3 } } + { fp } { \fp_use:c { g__dbshow_data_#1_#2_#3 } } + { clist } { + \__dbshow_clist_use:cccc { g__dbshow_data_#1_#2_#3 } + { g__dbshow_style_attr_sep_#4_#1_#2 } + { g__dbshow_style_attr_item_before_tl_#4_#1_#2 } + { g__dbshow_style_attr_item_after_tl_#4_#1_#2 } + } + { date } { + \exp_args:Nnx + \tl_use:c { g__dbshow_style_attr_wrapper_#4_#1_#2 } { + \__dbshow_date_use:ncc { g__dbshow_data_#1_#2_#3 } + { g__dbshow_style_attr_sep_#4_#1_#2 } + { g__dbshow_style_attr_zfill_bool_#4_#1_#2 } } - \exp_args:Nv - \bool_if:nT { g__dbshow_filter_bool_tl_#2_#3 } - { \clist_put_right:Nn \l_index { ##1 } } - } { \clist_put_right:Nn \l_index { ##1 } } + } } - \int_step_function:nN { \dbshow_get_counter:n { #2 } } \dbshow_filter:n - \clist_if_empty:cF { g__dbshow_sort_#1_#2 } - { \dbshow_sort:nNn { #2 } \l_index { #1 } } - - % ##1 index - \int_zero_new:N \l_counter_int - \cs_set:Nn \dbshow_iter:n { - \int_incr:N \l_counter_int - \tl_set:Nx \dbalph { \int_to_alph:n { \l_counter_int } } - \tl_set:Nx \dbAlph { \int_to_Alph:n { \l_counter_int } } - \tl_set:Nx \dbarabic { \int_to_arabic:n { \l_counter_int } } - \tl_set:Nx \dbRoman { \int_to_Roman:n { \l_counter_int } } - \tl_set:Nx \dbroman { \int_to_roman:n { \l_counter_int } } - \tl_set:Nn \dbIndex { ##1 } - - % ####1 attr - \DeclareExpandableDocumentCommand { \dbuse } { m } { - \dbshow_check_attr:nn { #2 } { ####1 } - \tl_use:c { g__dbshow_style_attr_before_#1_#2_####1 } - \dbshow_use_data:nnnn { #2 } { ####1 } { ##1 } { #1 } - \tl_use:c { g__dbshow_style_attr_after_#1_#2_####1 } +} +\cs_new_protected:Nn \__dbshow_show_set_macro:nn { + \tl_set:Nn \dbDatabase {#1} + \tl_set:Nn \dbFilterName {#2} + \tl_set_eq:Nc \dbFilterInfo { g__dbshow_filter_info_tl_#1_#2 } +} +\cs_new_protected:Nn \__dbshow_show_filter:nnN { + \int_step_inline:nn { \__dbshow_get_counter:n {#1} } { + \seq_if_exist:cTF { g__dbshow_filter_run_seq_#1_#2 } { + \seq_map_inline:cn { g__dbshow_filter_run_seq_#1_#2 } { + \use:c {####1} {##1} + } + \exp_args:Nv + \bool_if:nT { g__dbshow_filter_bool_tl_#1_#2 } + { \clist_put_right:Nn #3 {##1} } + } { \clist_put_right:Nn #3 {##1} } + } +} +\cs_new_protected:Nn \__dbshow_show_set_counter:N { + \tl_set:Nx \dbalph { \int_to_alph:n {#1} } + \tl_set:Nx \dbAlph { \int_to_Alph:n {#1} } + \tl_set:Nx \dbarabic { \int_to_arabic:n {#1} } + \tl_set:Nx \dbRoman { \int_to_Roman:n {#1} } + \tl_set:Nx \dbroman { \int_to_roman:n {#1} } +} +\cs_new_protected:Nn \__dbshow_show_item:nnN { + \int_zero_new:N \l__dbshow_show_int + \clist_map_inline:Nn #3 { + \int_incr:N \l__dbshow_show_int + \__dbshow_show_set_counter:N \l__dbshow_show_int + \tl_set:Nn \dbIndex {##1} + \cs_set:Npn \dbuse ####1 { + \__dbshow_check_attr:nn {#2} {####1} + \tl_use:c { g__dbshow_style_attr_before_tl_#1_#2_####1 } + \__dbshow_use_data:nnnn {#2} {####1} {##1} {#1} + \tl_use:c { g__dbshow_style_attr_after_tl_#1_#2_####1 } } - \tl_use:c { g__dbshow_style_record_before_#1_#2 } - \tl_use:c { g__dbshow_style_database_item_#1_#2 } - \tl_use:c { g__dbshow_style_record_after_#1_#2 } + \tl_use:c { g__dbshow_style_record_before_tl_#1_#2 } + \tl_use:c { g__dbshow_style_database_item_tl_#1_#2 } + \tl_use:c { g__dbshow_style_record_after_tl_#1_#2 } } - \prg_set_conditional:Nnn \dbshow_if_empty: { T, F, TF } { - \clist_if_empty:NTF \l_index +} +\cs_new_protected:Nn \__dbshow_show_set_cond:N { + \prg_set_conditional:Nnn \__dbshow_if_empty: { T, F, TF } { + \clist_if_empty:NTF #1 { \prg_return_true: } { \prg_return_false: } } - \cs_set_eq:NN \dbIfEmptyT\dbshow_if_empty:T - \cs_set_eq:NN \dbIfEmptyF\dbshow_if_empty:F - \cs_set_eq:NN \dbIfEmptyTF\dbshow_if_empty:TF - - \tl_use:c { g__dbshow_style_before_#1_#2 } - \clist_map_function:NN \l_index \dbshow_iter:n - \tl_use:c { g__dbshow_style_after_#1_#2 } -} - -% #1 style #2 database + \cs_set_eq:NN \dbIfEmptyT \__dbshow_if_empty:T + \cs_set_eq:NN \dbIfEmptyF \__dbshow_if_empty:F + \cs_set_eq:NN \dbIfEmptyTF \__dbshow_if_empty:TF +} +\cs_new_protected:Nn \__dbshow_show:nnn { + \__dbshow_show_set_macro:nn {#2} {#3} + \clist_clear_new:N \l__dbshow_show_index_clist + \__dbshow_show_filter:nnN {#2} {#3} \l__dbshow_show_index_clist + \clist_if_empty:cF { g__dbshow_sort_clist_#1_#2 } + { \__dbshow_sort:nNn {#2} \l__dbshow_show_index_clist {#1} } + \tl_use:c { g__dbshow_style_before_tl_#1_#2 } + \__dbshow_show_item:nnN {#1} {#2} \l__dbshow_show_index_clist + \tl_use:c { g__dbshow_style_after_tl_#1_#2 } +} +\cs_generate_variant:Nn \__dbshow_show:nnn { nnv } \NewDocumentCommand { \dbshow } { m m } { - \dbshow_check_database:n { #2 } - \tl_set_eq:Nc \l_dbshow_filter { g__dbshow_filter_#1_#2 } - \exp_args:Nnv \dbshow_check_filter:nn - { #2 } { g__dbshow_filter_#1_#2 } - \exp_args:Nnnv \dbshow_init_iterator:nnn - { #1 } { #2 } { g__dbshow_filter_#1_#2 } -} - -\cs_set_eq:NN \dbIntAbs \int_abs:n -\cs_set_eq:NN \dbIntSign \int_sign:n -\cs_set_eq:NN \dbIntDivRound \int_div_round:nn -\cs_set_eq:NN \dbIntDivTruncate \int_div_truncate:nn -\cs_set_eq:NN \dbIntMax \int_max:nn -\cs_set_eq:NN \dbIntMin \int_min:nn -\cs_set_eq:NN \dbIntMod \int_mod:nn -\cs_set_eq:NN \dbFpSign \fp_sign:n - -%%%%%%%%%%%%%%%%% date - -% #1 year -\prg_new_conditional:Nnn \dbshow_date_if_leap:n { T, F, TF, p } { + \__dbshow_check_database:n {#2} + \__dbshow_check_filter:nv {#2} { g__dbshow_filter_#1_#2 } + \__dbshow_show:nnv {#1} {#2} { g__dbshow_filter_#1_#2 } +} +\prg_new_conditional:Nnn \__dbdate_if_leap:n { T, F, TF, p } { \bool_if:nTF { - \int_compare_p:nNn { \int_mod:nn { #1 } { 400 } } = { 0 } || - ( - !\int_compare_p:nNn { \int_mod:nn { #1 } { 100 } } = { 0 } && - \int_compare_p:nNn { \int_mod:nn { #1 } { 4 } } = { 0 } - ) - } - { \prg_return_true: } - { \prg_return_false: } + \int_compare_p:nNn { \int_mod:nn {#1} { 400 } } = { 0 } || + (!\int_compare_p:nNn { \int_mod:nn {#1} { 100 } } = { 0 } && + \int_compare_p:nNn { \int_mod:nn {#1} { 4 } } = { 0 }) + } { \prg_return_true: } { \prg_return_false: } } - -\clist_const:Nn \dbshow_date_month_clist +\clist_const:Nn \c__dbdate_month_clist { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 } - -\int_new:N \l__date_ans_int -\int_new:N \l__date_tmpa_int -\int_new:N \l__date_tmpb_int - -% #1 year #2 month #3 day #4 token to save the result -\cs_new_protected:Nn \dbshow_date_to_int:nnnN { - \int_set:Nn \l__date_ans_int { #3 - 1 } +\cs_new_protected:Nn \__dbdate_to_int:nnnN { + \int_zero_new:N \l__dbdate_ans_int + \int_zero_new:N \l__dbdate_tmpa_int + \int_zero_new:N \l__dbdate_tmpb_int + \int_set:Nn \l__dbdate_ans_int { #3 - 1 } \int_step_inline:nn { #2 - 1 } { - \int_add:Nn \l__date_ans_int { - \clist_item:Nn \dbshow_date_month_clist { ##1 } + \int_add:Nn \l__dbdate_ans_int { + \clist_item:Nn \c__dbdate_month_clist {##1} } \bool_if:nT { - \int_compare_p:nNn { ##1 } = { 2 } && - \dbshow_date_if_leap_p:n { #1 } - } { \int_incr:N \l__date_ans_int } + \int_compare_p:nNn {##1} = { 2 } && + \__dbdate_if_leap_p:n {#1} + } { \int_incr:N \l__dbdate_ans_int } } - \int_add:Nn \l__date_ans_int { 365 * (#1 - 1971) } - \int_add:Nn \l__date_ans_int { + \int_add:Nn \l__dbdate_ans_int { 365 * (#1 - 1971) } + \int_add:Nn \l__dbdate_ans_int { \int_div_truncate:nn { #1 - 1 } { 4 } - \int_div_truncate:nn { 1971 } { 4 } } - \int_sub:Nn \l__date_ans_int { + \int_sub:Nn \l__dbdate_ans_int { \int_div_truncate:nn { #1 - 1 } { 100 } - \int_div_truncate:nn { 1971 } { 100 } } - \int_add:Nn \l__date_ans_int { + \int_add:Nn \l__dbdate_ans_int { \int_div_truncate:nn { #1 - 1 } { 400 } - \int_div_truncate:nn { 1971 } { 400 } } - \int_set_eq:NN #4 \l__date_ans_int -} - -\cs_new_protected:Nn \dbshow_date_to_int:NNNN { - \dbshow_date_to_int:nnnN { #1 } { #2 } { #3 } #4 -} -\cs_generate_variant:Nn \dbshow_date_to_int:NNNN { cccN } - -% #1 date #2 int -\cs_new:Nn \dbshow_date_to_int:nN { - \dbshow_date_to_int:cccN - { dbshow_date_year_#1 } - { dbshow_date_month_#1 } - { dbshow_date_day_#1 } + \int_set_eq:NN #4 \l__dbdate_ans_int +} +\cs_new_protected:Nn \__dbdate_to_int:NNNN { + \__dbdate_to_int:nnnN {#1} {#2} {#3} #4 +} +\cs_generate_variant:Nn \__dbdate_to_int:NNNN { cccN } +\cs_new:Nn \__dbdate_to_int:nN { + \__dbdate_to_int:cccN + { __dbdate_year_#1 } + { __dbdate_month_#1 } + { __dbdate_day_#1 } #2 } - -\cs_new_protected:Nn \dbshow_date_set_val:n { - \tl_set:cx { #1 } { \dbshow_date_use_zfill:nn { #1 } { / } } -} -\cs_new_protected:Nn \dbshow_date_gset_val:n { - \tl_gset:cx { #1 } { \dbshow_date_use_zfill:nn { #1 } { / } } -} - -\cs_new_protected:Nn \dbshow_date_init:n { - \dbshow_date_set:nnnn { #1 } { 1971 } { 1 } { 1 } - \dbshow_date_set_val:n { #1 } -} -\cs_new_protected:Nn \dbshow_date_ginit:n { - \dbshow_date_gset:nnnn { #1 } { 1971 } { 1 } { 1 } - \dbshow_date_gset_val:n { #1 } -} - -\cs_new_protected:Nn \dbshow_date_new:n { - \int_new:c { dbshow_date_year_#1 } - \int_new:c { dbshow_date_month_#1 } - \int_new:c { dbshow_date_day_#1 } - \dbshow_date_ginit:n { #1 } -} - -\cs_new_protected:Nn \dbshow_date_clear_new:n { - \int_zero_new:c { dbshow_date_year_#1 } - \int_zero_new:c { dbshow_date_month_#1 } - \int_zero_new:c { dbshow_date_day_#1 } - \dbshow_date_init:n { #1 } -} - -\cs_new_protected:Nn \dbshow_date_gclear_new:n { - \int_gzero_new:c { dbshow_date_year_#1 } - \int_gzero_new:c { dbshow_date_month_#1 } - \int_gzero_new:c { dbshow_date_day_#1 } - \dbshow_date_ginit:n { #1 } -} - -% #1 name #2 year #3 month #4 day -\cs_new_protected:Nn \dbshow_date_set:nnnn { - \int_set:cn { dbshow_date_year_#1 } { #2 } - \int_set:cn { dbshow_date_month_#1 } { #3 } - \int_set:cn { dbshow_date_day_#1 } { #4 } - \dbshow_date_set_val:n { #1 } -} - -% #1 name #2 year #3 month #4 day -\cs_new_protected:Nn \dbshow_date_gset:nnnn { - \int_gset:cn { dbshow_date_year_#1 } { #2 } - \int_gset:cn { dbshow_date_month_#1 } { #3 } - \int_gset:cn { dbshow_date_day_#1 } { #4 } - \dbshow_date_gset_val:n { #1 } -} - -\cs_new_protected:Npn \dbshow_date_set:w #1\dbshow_sep#2/#3/#4\dbshow_stop { - \dbshow_date_clear_new:n { #1 } - \dbshow_date_set:nnnn { #1 } { #2 } { #3 } { #4 } -} -\cs_new_protected:Npn \dbshow_date_gset:w #1\dbshow_sep#2/#3/#4\dbshow_stop { - \dbshow_date_gclear_new:n { #1 } - \dbshow_date_gset:nnnn { #1 } { #2 } { #3 } { #4 } -} - -% #1 date name #2 date -\cs_new_protected:Nn \dbshow_date_set:nn { - \dbshow_date_set:w #1\dbshow_sep#2\dbshow_stop -} -\cs_generate_variant:Nn \dbshow_date_set:nn { nx } -\cs_new_protected:Nn \dbshow_date_gset:nn { - \dbshow_date_gset:w #1\dbshow_sep#2\dbshow_stop -} -\cs_generate_variant:Nn \dbshow_date_gset:nn { nx } - -% #1 date 1 #2 date 2 #3 int token -\cs_new_protected:Nn \dbshow_date_sub:nnN { - \dbshow_date_to_int:nN { #1 } \l__date_tmpa_int - \dbshow_date_to_int:nN { #2 } \l__date_tmpb_int - \int_set:Nn #3 { \l__date_tmpa_int - \l__date_tmpb_int } -} - -\cs_new:Nn \dbshow_date_show_two:N { - \int_compare:nNnTF { #1 } > { 9 } +\cs_new_protected:Nn \__dbdate_set_val:n { + \tl_set:cx {#1} { \__dbdate_use_zfill:nn {#1} { \g__dbdate_sep_tl } } +} +\cs_new_protected:Nn \__dbdate_gset_val:n { + \tl_gset:cx {#1} { \__dbdate_use_zfill:nn {#1} { \g__dbdate_sep_tl } } +} +\cs_new_protected:Nn \__dbdate_init:n { + \__dbdate_set:nnnn {#1} { 1971 } { 1 } { 1 } + \__dbdate_set_val:n {#1} +} +\cs_new_protected:Nn \__dbdate_ginit:n { + \__dbdate_gset:nnnn {#1} { 1971 } { 1 } { 1 } + \__dbdate_gset_val:n {#1} +} +\cs_new_protected:Nn \__dbdate_new:n { + \int_new:c { __dbdate_year_#1 } + \int_new:c { __dbdate_month_#1 } + \int_new:c { __dbdate_day_#1 } + \__dbdate_ginit:n {#1} +} +\cs_generate_variant:Nn \__dbdate_new:n { x } +\cs_new_protected:Nn \__dbdate_clear_new:n { + \int_zero_new:c { __dbdate_year_#1 } + \int_zero_new:c { __dbdate_month_#1 } + \int_zero_new:c { __dbdate_day_#1 } + \__dbdate_init:n {#1} +} +\cs_generate_variant:Nn \__dbdate_clear_new:n { x } +\cs_new_protected:Nn \__dbdate_gclear_new:n { + \int_gzero_new:c { __dbdate_year_#1 } + \int_gzero_new:c { __dbdate_month_#1 } + \int_gzero_new:c { __dbdate_day_#1 } + \__dbdate_ginit:n {#1} +} +\cs_generate_variant:Nn \__dbdate_gclear_new:n { x } +\cs_new_protected:Nn \__dbdate_set:nnnn { + \int_set:cn { __dbdate_year_#1 } {#2} + \int_set:cn { __dbdate_month_#1 } {#3} + \int_set:cn { __dbdate_day_#1 } {#4} + \__dbdate_set_val:n {#1} +} +\cs_new_protected:Nn \__dbdate_gset:nnnn { + \int_gset:cn { __dbdate_year_#1 } {#2} + \int_gset:cn { __dbdate_month_#1 } {#3} + \int_gset:cn { __dbdate_day_#1 } {#4} + \__dbdate_gset_val:n {#1} +} +\cs_new_protected:Nn \__dbdate_set_sep:n { + \tl_gset:Nn \g__dbdate_sep_tl { #1 } + \cs_gset_protected:Npn \__dbdate_set:w ##1\__dbdate_sep##2#1##3#1##4\__dbdate_stop { + \__dbdate_clear_new:n {##1} + \__dbdate_set:nnnn {##1} {##2} {##3} {##4} + } + \cs_gset_protected:Npn \__dbdate_gset:w ##1\__dbdate_sep##2#1##3#1##4\__dbdate_stop { + \__dbdate_gclear_new:n {##1} + \__dbdate_gset:nnnn {##1} {##2} {##3} {##4} + } +} +\cs_gset_eq:NN \dbdatesep \__dbdate_set_sep:n +\dbdatesep{/} +\cs_new_protected:Nn \__dbdate_set:nn { + \__dbdate_set:w #1\__dbdate_sep#2\__dbdate_stop +} +\cs_generate_variant:Nn \__dbdate_set:nn { xx } +\cs_new_protected:Nn \__dbdate_gset:nn { + \__dbdate_gset:w #1\__dbdate_sep#2\__dbdate_stop +} +\cs_generate_variant:Nn \__dbdate_gset:nn { xx } +\cs_new_protected:Nn \__dbdate_sub:nnN { + \int_zero_new:N \l__dbdate_sub_tmpa_int + \int_zero_new:N \l__dbdate_sub_tmpb_int + \__dbdate_to_int:nN {#1} \l__dbdate_sub_tmpa_int + \__dbdate_to_int:nN {#2} \l__dbdate_sub_tmpb_int + \int_set:Nn #3 { \l__dbdate_sub_tmpa_int - \l__dbdate_sub_tmpb_int } +} +\cs_new:Nn \__dbdate_show_two:N { + \int_compare:nNnTF {#1} > { 9 } { \int_use:N #1 } { 0\int_use:N #1 } } -\cs_generate_variant:Nn \dbshow_date_show_two:N { c } - -\cs_new:Nn \dbshow_date_use:nnnnn { - #2\int_use:c { dbshow_date_year_#1 } - #3\int_use:c { dbshow_date_month_#1 } - #4\int_use:c { dbshow_date_day_#1 }#5 -} -\cs_generate_variant:Nn \dbshow_date_use:nnnnn { nffff } - -\cs_new:Nn \dbshow_date_use_zfill:nnnnn { - #2\int_use:c { dbshow_date_year_#1 } - #3\dbshow_date_show_two:c { dbshow_date_month_#1 } - #4\dbshow_date_show_two:c { dbshow_date_day_#1 }#5 -} -\cs_generate_variant:Nn \dbshow_date_use_zfill:nnnnn { nffff } - -\cs_new:Nn \dbshow_date_use:nn { - \dbshow_date_use:nnnnn { #1 } { } { #2 } { #2 } { } -} -\cs_generate_variant:Nn \dbshow_date_use:nn { nf } - -\cs_new:Nn \dbshow_date_use_zfill:nn { - \dbshow_date_use_zfill:nnnnn { #1 } { } { #2 } { #2 } { } -} -\cs_generate_variant:Nn \dbshow_date_use_zfill:nn { nf } - -\tl_set:Nx \dbtoday { - \int_use:N \c_sys_year_int/ - \int_use:N \c_sys_month_int/ +\cs_generate_variant:Nn \__dbdate_show_two:N { c } +\cs_new:Nn \__dbdate_use:nnnnn { + #2\int_use:c { __dbdate_year_#1 } + #3\int_use:c { __dbdate_month_#1 } + #4\int_use:c { __dbdate_day_#1 }#5 +} +\cs_generate_variant:Nn \__dbdate_use:nnnnn { nffff } +\cs_new:Nn \__dbdate_use_zfill:nnnnn { + #2\int_use:c { __dbdate_year_#1 } + #3\__dbdate_show_two:c { __dbdate_month_#1 } + #4\__dbdate_show_two:c { __dbdate_day_#1 }#5 +} +\cs_generate_variant:Nn \__dbdate_use_zfill:nnnnn { nffff } +\cs_new:Nn \__dbdate_use:nn { + \__dbdate_use:nnnnn {#1} {} {#2} {#2} {} +} +\cs_generate_variant:Nn \__dbdate_use:nn { nf } +\cs_new:Nn \__dbdate_use_zfill:nn { + \__dbdate_use_zfill:nnnnn {#1} {} {#2} {#2} {} +} +\cs_generate_variant:Nn \__dbdate_use_zfill:nn { nf } +\cs_new_protected:Nn \__dbdate_show:n { + \exp_args:Nx \tl_show:n { >#1~=~\__dbdate_use:nn {#1} { - } } +} +\tl_set:Nn \dbtoday { + \int_use:N \c_sys_year_int \g__dbdate_sep_tl + \int_use:N \c_sys_month_int \g__dbdate_sep_tl \int_use:N \c_sys_day_int } - -\endinput +%% +%% -------------------------------------------------------------------------- +%% This package consists of the file dbshow.dtx, +%% and the derived files dbshow.pdf, +%% dbshow.sty, +%% dbshow.ins and +%% README.md. +%% +%% End of file `dbshow.sty'. |