summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/leadsheets/leadsheets.library.properties.code.tex
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /macros/latex/contrib/leadsheets/leadsheets.library.properties.code.tex
Initial commit
Diffstat (limited to 'macros/latex/contrib/leadsheets/leadsheets.library.properties.code.tex')
-rw-r--r--macros/latex/contrib/leadsheets/leadsheets.library.properties.code.tex232
1 files changed, 232 insertions, 0 deletions
diff --git a/macros/latex/contrib/leadsheets/leadsheets.library.properties.code.tex b/macros/latex/contrib/leadsheets/leadsheets.library.properties.code.tex
new file mode 100644
index 0000000000..44a69aaa25
--- /dev/null
+++ b/macros/latex/contrib/leadsheets/leadsheets.library.properties.code.tex
@@ -0,0 +1,232 @@
+% --------------------------------------------------------------------------
+% the LEADSHEETS package
+%
+% typesetting leadsheets and songbooks
+%
+% --------------------------------------------------------------------------
+% Clemens Niederberger
+% E-Mail: contact@mychemistry.eu
+% --------------------------------------------------------------------------
+% Copyright 2014-2017 Clemens Niederberger
+%
+% 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 Clemens Niederberger.
+% --------------------------------------------------------------------------
+\LeadsheetsExplLibrary{properties}{2016/05/18 song properties}
+
+\cs_generate_variant:Nn \tl_if_eq:nnTF {x}
+
+\seq_new:N \l__leadsheets_song_properties_seq
+\prop_new:N \l__leadsheets_duplicate_properties_prop
+
+\cs_new_protected:Npn \leadsheets_define_property:n #1
+ {
+ \prop_new:c {l__leadsheets_songs_#1_prop}
+ \seq_put_right:Nn \l__leadsheets_song_properties_seq {#1}
+ }
+
+\cs_new_protected:Npn \leadsheets_set_property:nnn #1#2#3
+ {
+ \tl_set_rescan:Nnn \l__leadsheets_tmpa_tl
+ { \char_set_catcode_other:N \# }
+ {#3}
+ \prop_gput:cnV {l__leadsheets_songs_#2_prop} {#1}
+ \l__leadsheets_tmpa_tl
+ }
+\cs_generate_variant:Nn \prop_gput:cnn {cnV}
+\cs_generate_variant:Nn \leadsheets_set_property:nnn { nnx }
+
+\cs_new:Npn \leadsheets_get_property:nn #1#2
+ { \prop_item:cn {l__leadsheets_songs_#2_prop} {#1} }
+\cs_generate_variant:Nn \leadsheets_get_property:nn { V }
+
+\prg_new_conditional:Npnn \leadsheets_if_property:nn #1#2 {p,T,F,TF}
+ {
+ \prop_if_in:cnTF {l__leadsheets_songs_#2_prop} {#1}
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+\cs_generate_variant:Nn \leadsheets_if_property:nnTF { V }
+\cs_generate_variant:Nn \leadsheets_if_property:nnT { V }
+\cs_generate_variant:Nn \leadsheets_if_property_p:nn { V }
+
+\prg_new_protected_conditional:Npnn \leadsheets_if_any_property:nn #1#2 {T,F,TF}
+ {
+ \bool_set_false:N \l__leadsheets_tmpa_bool
+ \clist_map_inline:nn {#1}
+ {
+ \prop_if_in:cnT {l__leadsheets_songs_#2_prop} {#1}
+ { \bool_set_true:N \l__leadsheets_tmpa_bool }
+ }
+ \bool_if:NTF \l__leadsheets_tmpa_bool
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+\cs_generate_variant:Nn \leadsheets_if_any_property:nnTF {V}
+
+\prg_new_protected_conditional:Npnn \leadsheets_if_all_properties:nn #1#2 {T,F,TF}
+ {
+ \bool_set_false:N \l__leadsheets_tmpa_bool
+ \clist_map_inline:nn {#1}
+ {
+ \prop_if_in:cnTF {l__leadsheets_songs_#2_prop} {#1}
+ { \bool_set_true:N \l__leadsheets_tmpa_bool }
+ { \bool_set_false:N \l__leadsheets_tmpa_bool }
+ }
+ \bool_if:NTF \l__leadsheets_tmpa_bool
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+\cs_generate_variant:Nn \leadsheets_if_all_properties:nnTF {V}
+
+\prg_new_protected_conditional:Npnn \leadsheets_if_properties_eq:nnn #1#2#3 {T,F,TF}
+ {
+ \tl_if_eq:xxTF
+ { \leadsheets_get_property:nn {#1} {#2} }
+ { \leadsheets_get_property:nn {#1} {#3} }
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+\cs_generate_variant:Nn \leadsheets_if_properties_eq:nnnTF { V }
+
+\prg_new_protected_conditional:Npnn \leadsheets_if_property_eq:nnn #1#2#3 {T,F,TF}
+ {
+ \tl_if_eq:xnTF
+ { \leadsheets_get_property:nn {#1} {#2} }
+ { #3 }
+ { \prg_return_true: }
+ { \prg_return_false: }
+ }
+\cs_generate_variant:Nn \leadsheets_if_property_eq:nnnTF { V }
+
+\cs_new_protected:Npn \leadsheets_copy_property:nnn #1#2#3
+ {
+ \bool_if:nT
+ {
+ !\leadsheets_if_property_p:nn {#1} {#3}
+ &&
+ \leadsheets_if_property_p:nn {#1} {#2}
+ }
+ {
+ \leadsheets_set_property:nnx {#1} {#3}
+ { \leadsheets_get_property:nn {#1} {#2} }
+ }
+ }
+
+\cs_new_protected:Npn \leadsheets_duplicate_property:nn #1#2
+ { \prop_put:Nnn \l__leadsheets_duplicate_properties_prop {#1} {#2} }
+
+\cs_new_protected:Npn \leadsheets_set_duplicate_properties:n #1
+ {
+ \prop_map_inline:Nn \l__leadsheets_duplicate_properties_prop
+ { \leadsheets_copy_property:nnn {#1} {##1} {##2} }
+ }
+
+\cs_new_protected:Npn \leadsheets_print_property_list:nnnnnn #1#2#3#4#5#6
+ {
+ \seq_set_split:Nnx \l__leadsheets_tmpa_seq {~and~}
+ { \leadsheets_get_property:nn {#1} {#2} }
+ \seq_clear:N \l__leadsheets_tmpb_seq
+ \seq_map_inline:Nn \l__leadsheets_tmpa_seq
+ { \seq_put_right:Nn \l__leadsheets_tmpb_seq { #3 {##1} } }
+ \seq_use:Nnnn \l__leadsheets_tmpb_seq {#4} {#5} {#6}
+ }
+\cs_generate_variant:Nn \leadsheets_print_property_list:nnnnnn { V }
+
+\cs_new_protected:Npn \leadsheets_use_property_list:nnnn #1#2#3#4
+ {
+ \seq_set_split:Nnx \l__leadsheets_tmpa_seq {~and~}
+ { \leadsheets_get_property:nn {#1} {#2} }
+ \seq_clear:N \l__leadsheets_tmpb_seq
+ \seq_map_inline:Nn \l__leadsheets_tmpa_seq
+ { \seq_put_right:Nn \l__leadsheets_tmpb_seq { #3 {##1} } }
+ \seq_use:Nn \l__leadsheets_tmpb_seq {#4}
+ }
+\cs_generate_variant:Nn \leadsheets_use_property_list:nnnn { V }
+
+\cs_new:Npn \leadsheets_for_property_list:nn #1#2
+ { \__leadsheets_for_property_list_aux:nww {#2} #1 ~and~ \q_stop }
+\cs_generate_variant:Nn \leadsheets_for_property_list:nn { f }
+
+\cs_new:Npn \__leadsheets_for_property_list_aux:nww #1#2 ~and~ #3 \q_stop
+ {
+ #1 { #2 }
+ \tl_if_blank:nF {#3}
+ { \__leadsheets_for_property_list_aux:nww {#1} #3 \q_stop }
+ }
+
+\DeclareExpandableDocumentCommand \songproperty {m}
+ { \leadsheets_get_property:Vn \l_leadsheets_current_song_id_tl {#1} }
+
+% #1: command that formats every entry in list
+% #2: property
+% #3: separator between two
+% #4: separator between more than tow
+% #5: separator between last two
+\NewDocumentCommand \printsongpropertylist {O{\use:n}mmmm}
+ {
+ \leadsheets_print_property_list:Vnnnnn \l_leadsheets_current_song_id_tl
+ {#2} {#1} {#3} {#4} {#5}
+ }
+
+% #1: command that formats every entry in list
+% #2: property
+% #3: separator
+\NewDocumentCommand \usesongpropertylist {O{\use:n}mm}
+ {
+ \leadsheets_use_property_list:Vnnn \l_leadsheets_current_song_id_tl
+ {#2} {#1} {#3}
+ }
+
+% #1: command that formats every entry in list
+% #2: property
+\DeclareExpandableDocumentCommand \forsongpropertylist {mm}
+ {
+ \leadsheets_for_property_list:fn
+ { \leadsheets_get_property:Vn \l_leadsheets_current_song_id_tl {#1} }
+ {#2}
+ }
+
+\DeclareExpandableDocumentCommand \ifsongproperty {m}
+ { \leadsheets_if_property:VnTF \l_leadsheets_current_song_id_tl {#1} }
+
+\NewDocumentCommand \ifanysongproperty {m}
+ { \leadsheets_if_any_property:VnTF \l_leadsheets_current_song_id_tl {#1} }
+
+\NewDocumentCommand \ifallsongproperties {m}
+ { \leadsheets_if_all_properties:VnTF \l_leadsheets_current_song_id_tl {#1} }
+
+\DeclareExpandableDocumentCommand \ifsongmeasuring {}
+ { \leadsheets_if_measuring:TF }
+
+\NewDocumentCommand \ifsongpropertiesequal {mm}
+ { \leadsheets_if_properties_eq:VnnTF \l_leadsheets_current_song_id_tl {#1} {#2} }
+
+% #1: property 1
+% #2: property 2
+\NewDocumentCommand \ifsongpropertyequal {mm}
+ { \leadsheets_if_property_eq:VnnTF \l_leadsheets_current_song_id_tl {#1} {#2} }
+
+% #1: property
+% #2: tokenlist
+\NewDocumentCommand \definesongproperty {m}
+ { \leadsheets_define_property:n {#1} }
+\@onlypreamble\definesongproperty
+
+\NewDocumentCommand \copysongproperty {mm}
+ { \leadsheets_duplicate_property:nn {#1} {#2} }
+\@onlypreamble\copysongproperty
+
+\file_input_stop:
+
+2015/07/05: enable usage of # in the key property
+2016/05/18: new commands \ifanysongproperty and \ifallsongproperties