From 488c0deadffebf3eefce7b28f26b0ed5c38e1b0e Mon Sep 17 00:00:00 2001 From: Gustavo Pantuza Date: Wed, 4 Oct 2023 17:00:35 -0700 Subject: [PATCH 1/4] Updates Sphinx version to 7.2.6 --- dev-requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev-requirements.txt b/dev-requirements.txt index 3d785fd..c2bd128 100644 --- a/dev-requirements.txt +++ b/dev-requirements.txt @@ -3,4 +3,4 @@ build==0.5.1 ipython==7.31.1 pycodestyle==2.7.0 pytest==6.2.4 -Sphinx==4.1.1 +Sphinx==7.2.6 From 8e259d1bded85d141e3427565aab6e8a8c7a7734 Mon Sep 17 00:00:00 2001 From: Gustavo Pantuza Date: Wed, 4 Oct 2023 17:01:48 -0700 Subject: [PATCH 2/4] Adds templates_path new command line argument with default value --- autogenfiles/autogenfiles.py | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/autogenfiles/autogenfiles.py b/autogenfiles/autogenfiles.py index 7a06820..19b8803 100644 --- a/autogenfiles/autogenfiles.py +++ b/autogenfiles/autogenfiles.py @@ -13,11 +13,15 @@ from .files_helper import prepare_output_path_dir, read_template -def run(variables: dict, output_path: str): +def run(templates_path: str, variables: dict, output_path: str): """Runs the logic for generating rendered templates outcome Params: - :dir_name: str, Required + :templates_path: str, Optional + Path to the templates directory + :variables: str, Optional + Dictionary with all the variables to be injected on the templates + :output_path: str, Required Name of output directory """ # avoids problem with concats without trailling slash @@ -26,7 +30,7 @@ def run(variables: dict, output_path: str): # makes sure output dir exists to avoid FileNotFound error prepare_output_path_dir(output_path) - file_list, subfolders, dir_size = prepare_files_and_subfolders() + file_list, subfolders, dir_size = prepare_files_and_subfolders(templates_path) if subfolders: create_subfolder_structure(subfolders, output_path) @@ -35,9 +39,9 @@ def run(variables: dict, output_path: str): # makes sure I have correct file names for subfolder structure if dir_size == 1: file_name = f - f = f'templates/{f}' + f = f'{templates_path}/{f}' else: - file_name = f.split('templates/')[1] + file_name = f.split(f'{templates_path}')[1] template = read_template(f) # create templates @@ -55,11 +59,13 @@ def run(variables: dict, output_path: str): @click.command() +@click.option('-t', '--templates-path', default='templates/', + help='A custom templates path. Default is `./templates`') @click.option('-v', '--variable-list', default='variables.yaml', help='Name of the yaml files containing variables') @click.option('-o', '--output-path', default='./', help='Output path, by default writes to root') -def AutoGenFiles(variable_list, output_path): +def AutoGenFiles(templates_path, variable_list, output_path): """CLI""" print(f'Output path: {output_path}') # read variables to substitute @@ -72,5 +78,5 @@ def AutoGenFiles(variable_list, output_path): return click.echo(f'Variables found: {list(variables.keys())}') - run(variables, output_path) + run(templates_path, variables, output_path) click.echo('Output fully written') From 7146d54e712cc8e6e80bac85a9a7144bd5175d69 Mon Sep 17 00:00:00 2001 From: Gustavo Pantuza Date: Wed, 4 Oct 2023 17:02:17 -0700 Subject: [PATCH 3/4] Builds project documentation with new parameters --- docs/build/doctrees/API.doctree | Bin 31007 -> 33112 bytes docs/build/doctrees/environment.pickle | Bin 19802 -> 78752 bytes docs/build/doctrees/index.doctree | Bin 4726 -> 4790 bytes docs/build/doctrees/usage.doctree | Bin 8031 -> 7877 bytes docs/build/html/.buildinfo | 2 +- docs/build/html/API.html | 72 +- docs/build/html/_sources/usage.rst.txt | 2 +- docs/build/html/_static/alabaster.css | 4 +- docs/build/html/_static/basic.css | 77 +- docs/build/html/_static/doctools.js | 381 +++----- .../html/_static/documentation_options.js | 9 +- docs/build/html/_static/language_data.js | 102 +-- docs/build/html/_static/pygments.css | 2 + docs/build/html/_static/searchtools.js | 822 ++++++++++-------- docs/build/html/_static/sphinx_highlight.js | 154 ++++ docs/build/html/genindex.html | 20 +- docs/build/html/index.html | 26 +- docs/build/html/py-modindex.html | 20 +- docs/build/html/search.html | 23 +- docs/build/html/searchindex.js | 2 +- docs/build/html/usage.html | 48 +- 21 files changed, 868 insertions(+), 898 deletions(-) create mode 100644 docs/build/html/_static/sphinx_highlight.js diff --git a/docs/build/doctrees/API.doctree b/docs/build/doctrees/API.doctree index 18b3bfeca681f0ddbb0f2c85cbe63c492c6c1748..5a42b79cb24f6f3491cdb78015f80e54e98d60bc 100644 GIT binary patch literal 33112 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 +wyw{lbRmJMWD({mx&Kuv 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 Xy*eqt4brr@bPgl89OOhCWcmLAYn<6M literal 31007 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 kR=h>)ZHPuZ{5Mm)b=0}Hl+{r*29 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 literal 19802 zcmcIsYls}#b(Th&r{=Bq?#gbhZ0~5-)4eY{i|yEwrCoVF+R?I)7~)mR)!j8yRa0Hn zs)uIA8wHy<>m9hT2AA_N34uT$4-yg*42Bp&Vqy%zgb;%v{|tseAPz|ggan-LoO5qI zX1b-B@mh%Ku6xft_uO;O>z;F~zcBi>TQ42qe`+!5yI#1}bi%t{9ECk6Omj8=$;=D7 z&sUnhnqU56elK5A$LxMTUsY4xsFTKy)Aiz9-Dtg@IC0YQog_(}UO$TMpmja!WP~kg z_2bBQI{0E|X|(QyYhK_aEg(o*ZJLL^60RgyV@cd$l%F^>$|TC-jssMk2s5qcYDTZn zJda(Ij$%oZ(OoBwy)Fp2m#fjlNi$xevz0nw;zePS-^R)dPHm-4S_!Dm)k(uXG@4;_2`q$C!5daYL+%4uu~_o`gZDK1!~GF+HzaXJ6oL~ z>pIk(Ix#O&O}S|=uu|9Q0o9}(*lim-N^^2YlG>@)DG-iZ(g19;PCsi~og}e%cWJs= z9#U(X;U>QVG$Y$(CE41Vx0S0CohS$(EX;Lv;#S;sVyAoE>!dmM>y=y`Z^j8pXzV0u zoORL+-6?h|Pt;79^|0gCS`_!}l%;h%5nNdOtMaY!eiAc)VPLMtU+~tO+%%fn?Eozk zuhAzrO?9HKv)m4%&IZQc^peyI*QqB{V|VQ!V|iI}&$;K-F{n?z`sLhx#J%8N!xy!n z_u8s#?Gcbq9ALlulhZa4vA?ZC01LnO3nT%MEMmI3Ev;g%W4yA|5B+h^X4qbR-CeAD#ZdlPKEm&?GZ z9t(oSLO<$-U1v-8OwcfHci&)G_eu9z88oLi*9pN%@D3uCrEAO2Eho@RfxYCuPhh9J z&YGPCsTD(8%yQ1z-LAEkg)9#cyBPMwbrLZCZ5cIB0KKT2Va>FRqT@mudp$@(l!j62 zSh2GPISM;zpa6=v87GXZzdhY`7rZ+e`~@)1nLg3`j={?t#CWYR!v< z5+>@43~L6u4fmpK_nc8es|}mOTgUikHXNsKZQ5}NP8Gx~Bw4=?Sx?HI+j_DyST}D3 zM6B0~LJM%DL+EFOQ&1Gk>3c!6ZurSf5X?%`A~T9CFcivK3vA4-nLFDD5AApxo7=O! zFjpge2qR1PbO_U*fSKew^3_$6<9TVTSj~IrLC18@4*L+&#L8mGzF?RLy|nLjHn#H} z2Ab8+mbV^8P|e#i_EfzY8@Ue2)170Y@MhyqYW;`Ki7h(_%;*JfckY0R#)257G9#cohBs4bkXTS$Z*AK&ouH-;q$^Gnv&yLqj?u!} z;Z+T`1UyaeWDv`O(~Ffh%VufM)v-I*9nJ1j)qZWa$yqI_Nu#Z-?jybpTRg#D6-EVo zg2M*)VRzU@I+^fbhOIShyTiKgo|k>%R%4BBT$#`z!f|RRo28~0LfnJfuuPwhukBM1q1|M;=&V|5!&GteiPP|;pZ4V zoOzgfYaY3-@hsd3qfLWQ=1)585W^SU`&Si*&LcIo-$YSTKP9Mhz!i=D#l zX(3~L{fJbGUA$IW_i^_LnNiqgd~gj&2{+QHqeb|bAQj4~8S#nM(E>Dqp8=EO>in<< z7Bm=|XN3F|)77(eyS3?cNk@*zC|M2LL})7cNiPh%5NIn~0g1N6{=Y5F^NbVGQz!P= z=n)Tjfb<~lf{ke-;KA1q>qJ9HL3wugJYxyj2=g*h-t|C@*o}OfRxlq4>nX{r<%{0WD;O)BWOS4 zpXQb|`>qGJ=tlR0?lSkfO}8aq9&?ujevaW`Q)9cn^3#GEUfIg}UBr2ClpGlFG!kef zkkqyfI{+ud%`yl+6MTpBGqI>k2Q3In#pup38D)DBogQzdh%^OA7(%2#@xsKh8u)wo$kkWobV{08qqUqa1r_ z>P2x7I3OHCK!ezpoDtJ5LLyF-e547@N16>iSSFAqm%)%;puJX|+1tu<0jVC-CmZ&Cp3(VZYbXuveaG zImw4w*ofs`FIesnVF1<~=qJ#^u}*@{7S;FTs&+o89`z z8=obh+XkpW1Zki+Mel|g`!s^YLG91%ZeMqB8r(`LrXYP$V#I`Z98)J4O4VX@}E~EH)L!eLYlkl{P80W3*E6B3|jNfeFai!4QTC&b4$9 zKL5h&H*YppufFtr<73aiboIrXSFT>a{>t;OzWVXJnEZ4(T8>IM1lv7WuA5g^Z@hl> z28Q0ec_r|gQM_ImHcdz8Eojd=`9C$$?;ZT)DN7yPGIR{GM&*Rm_H=|yL|!Eqj6T^gpm*qjzr+34C5~HEeNI&dvMpR zbRkc{hbvesZayQ;6`y2cA?`jQ-4b&8J0xk9c_bnzb&C5myK2z_cW4T*YaNIZxjhXJ zGlOujv$5;!@i5sR>A*Q5+Js#~vcZet%!W;vjOt z{{cp+_udMf2A1wLD$#2rT5A+}x|x@}q~ioQm|!20LPr9|M}%#dGv|TX*)W@AfdBKD@OP6 zEJU_IZ0t$yqv)>i`^Dju=4I6S%v_5H?dn|m`bjCg?o2D0H4b=`*%=tWGEt%K5N1IN7`L`h^{X_$1dpitV}^qogS z)azTwt%WwFMXk2o*?_A|T(hE!{cU8BLyNpY7T$r^p(AqFO1JwaeWnv*rygZD?*lYT_7NFD#4dGPv@DtNV$6Jr4P!VpRrFQx#ZHehi1q%nrAeT*B}J93D8M8uc)P@Pro_d|$0JBU0;Z%Qh}J?b~yDSRmp#n4vHp)hfvRs024++D;JwR%P`Z&UeD7;+O-M9rRth?I2jBWD6Us zvj$Y~6=nn&d)}6V%vc@F^ zQ~Z$W_CjPK5gZk(EBxen0|GCB!FN%Gk&;G{eLHI^ggOY*l?!%`EOqC11DM)J39<(V zZ@9Yp$1sU{TB-4 z$p-us+zPfBmQg2Ww1<1RgreF^&qEm$A|z93nDeHlYOO~RBEoVr%yykCAP}@5`BUtc z0eDXV;Du5K^-yU*J`}Y902dx}4;X49cPT`EFl5qqIv(uQZpil)ILQy&U6gJ(9Y<9M z#6LDgG=<1qydN-?whG7(+z+y-e-+>hHE^tnvLCDoi?traC^#-_EvR?Jq)4XgRBer#0Ydi1uM?xO-rew(8`)i8O#&CSiG zEQ+#3Erb*;Kqf8Rai9?unw=pmgJYS4}fY%ak=UH37%VW|y}?i~WtOKlnuaA79%3jFEq8 zNN#`QpFZt>8z%;ON|O(M|IJL{Isj$6kiDkNi2IZ}p`9rbU{p$wA}974vB5FYgs<0ch+wApOoKly2srE77v3BD>o)d8EF4+N@?V4$#d(`&~#ZMLpc z{tOj>xOELxcsuOggv)!4Lem1|1z1prGB!!;Wj=sC(_Ax6tzVGKA4%((=5wvUYqvzu z=!wE(wD5!_wx8jIVhy2F5E-7;E7tHcoHa^#u8+y)G)cSad`RH@mk}^;P_e4zd!cVX z-KyMIDxG_hW=Ll&2q8n1E@CpaH+8@RKQqyBasLh3 z5Tr-^g=2*NHJooqz90XL6Ck_cG}5S6yZqr7ek-Y0E-ymz`EH(nhA=D*8Tiw%FN6_F_WzyOeG)UtO+u#Dz2Tol3s(OS(LVY*d&Sy%berD*fZxI&5b9sV=TAeRzs%Fg z=72V`J`bRc{dbKrZV|e!y_dqG!;D3fKc$9CTxGFXV2EIi#X zFqVSDioX9|VhGDgP~Q*#5}qMs@0X9qmW?9> z=DNh~d}-AfO2mYRyqlK(YOTy2eu8hl;eTn96`=7(dpe^&)hIMQV>tKyod{GL24a64> zzFCpfjs742q3F+;qQYYCM-29-3F_n}uz|{v%b;pmQzcCIe;KpN{C{%b`8A4PEl~W? zAyMFRTw&9y+v6Dbu@7cwA*z{C!6n*xa9sZPiiN##$c6de=Yiq{hM9+Lx}3^utGCLj>uGUfwJ?!N#{)#N^SO1+&!P415v z<9$r-yRF&NFNP>lp}@#@DQe+Gy-S2{`uIUtyiX>p8EA8b60L;)3x3GVlLwwzqZq+J zK{0kn6npjf7-M?(CH%})91U;i*D@Mj*wA-zYx^<`NEZ3jffu>o9XflddJJ9m!evd} zp1o=wn1(%j^@MPEm~mMe%KO6_m+|K%^I7+6MXNCPl>;wqzs#Muq%*Ji9&X+`@T7aV zdGoL+9>+jg`iqR>U1$63EmWQ2Mv-=|N&4jxtKVA5`zuF}tH_?MoW>r33mXBBD<2C*mEa8+@7#Pawj=y zYWA@H`-eqg6}$J3vU~4(VEF>QchdM2C${U`GhOSFo%zXu7xL5XOf~JkcW3_Zz|`#7 zng2N~il6z;oI(aCQlKNUd5SuUhtJ?dzOaH|vi-f*(r zYvU%T|6OvGW3S4Sc{85{9wpVp!`px1`qegGut)yUJbw~}w@o~c@-;SmL5&cF3ehV( zqAJYwcie9KLo8%f&3VZyP8DWHO~8XNccJ)2biR zUtD~pJAAj|TlA9!v*z96m+969-CvkCEmvby#8>@3552>GnJIpZ?>l~izX)+M{=lkr zm8Y^GU0AKGrbrM|8>NhafU-CEpvdQTzOK$7KH3=Wo|U$Q_wnGkN0fry zV{#8XS5L%QxOBO(goC=^ACCTVt}YCny9qpW?+?iRUk3+Jq*WGQ z5#B!$PY)+z81fnk*Xarnu5HMRu~0bN&M-_#_D{x#hm&!?32LN#!a(YG<*49JZyoHP zil-h-#V*`60zSkQXQQI~pZ2lg)7CJW$ylf#9jJqK_iiM=u7q`%s#ssay)lojmEby8 zMEi)}$Vju)xzAE+$RN~pd8+j`hhUdwIa#Jg@P-{(pH1i(+}*e=k-eNT#K-xXQUz$n zwG#_3<>>oi#(3?p?b>0}wUZTgoPP759K59XmZv#W)DIZLE<)jFO!y7h=i$`1QKnmx zqU~>zT^JLJ^PLnm{0EsR|L-tFkN#~MJz?&L>hX2rssF*ChdRVouBL0Ixh!3I3Rh)l32*bYnV;IKpOGXaf79fxb@R19+ zx&ITMrTB#?{fdQJuwK(|nd06MZh3Br)*czdQs?lh<>$AH*H9hkb8&HzUX=~;6Hs_F zX%rP(yq82;?H|WDf0X`=(Vubr`EveN-o|SN6HtGl1(a_u7f-ksGXk)sU1Qa>FuE}u z`&`@d ze)xLm-MKE822qlKCr3oz4cHpx{$(ImGuQFsAh;3Qr4fl-qfm?ZEed*{EYPo_(`^tq am`U>0mOjeh2!r2>fmYEAa_G(4&Ho1@jH)02 diff --git a/docs/build/doctrees/index.doctree b/docs/build/doctrees/index.doctree index 1f1b3289e9b7747d41880035b7f0427ed63248eb..388b95cf49e397450d32476dd0e8c008c589a3b6 100644 GIT binary patch delta 315 zcmeySvQ3qxfpzNYi7ekH{_7Jq)ekLBEh^S8NX#oKtxD8SNiCbaneiaAbcX5V^Bhu> z7jQ~!Ud!}_5hzdw6%d$wiRCbmKNHB8-n^Z)0wj4B$Z^_S!S2hr`6NdklSz+ANl{{6 zaZX}MW`16LK~a8sQEGAVl-em8J**}9C5bsxycv49U}{oRfZWo_=G@_2J#6`tY^5kUxD`LEvxryni@j3a4DVcfcQ+il(GV`*hOg0nH6A>&< hO$Ix(I5j6N9xUEDIay#SduNs@BLhR{W`4nRMgY1zbYuVk delta 238 zcmdm{`b~wUfpu#3M3!$X8LSz?6Myxod+LW4rxq3KXQdVwm!#$vjYK>kc1UuyFt z)=EaGz*&&Mjkn*-Q=8G+i_HqYV6XPRu!9lm)1_iRSSt&{vq=6JoF6X~8IY~fw V@)Ch1?0#9Mj0_BZoBajT83CBpP<#LY diff --git a/docs/build/doctrees/usage.doctree b/docs/build/doctrees/usage.doctree index fbdd24797762cb7ed41bfcb45be14d72ad8c3ebf..df882e57a9cc1ec103c99c1efff2ac09667f57c8 100644 GIT binary patch delta 1079 zcmbVK?MqWp822=9b92)z*HrGb`Ju?fO(mmNDI#ScEkVjpF|XTkXLsAZ*ZX1^s1^7! z7?GV@h(QVUv8Y`1!4QHLy%1qhNfEu!pAh(=579ZtEeQP7m*;SP=lA@c-}9X3Ysb^W z+&S*ba{U~4XYS#}s`lVX4XRpD5hUF>D+FV36eqz5{svy*ds~(`#G^h9yR3X}#!?O} zJW{Z$d=Gw7`U&T`0dk+EcQB2QZwIqp2m{aC?bKKmGe_JOA@fjs@m4ukbOJ$1$c~6iw&dZQX zHj{e(q2WQ-PTX&=19?1RpC_!JgtZUkb3Nr9pbYUM03{`qb&%V^GT%D-JiO>8=w>~L zwfM285wBWHdE$}Lm`xBW+M_65a~>cC-4$V4p|wzf`l#iaS(UpLgBD)wqGFdT99$~} zZ}wL*M<)vW&h9+5K=eBsS?7q$9_cc4xd%!|6Dg?qB?x1hU+|9#YC;&INMTrhUG|@m z)nverS6$xy$a>l&v;3drdSWwDv>9UF+uW?J^gnGKVo$4XGGcMII3xN!;uOBM?H56> z;?GsfOwe zj9^TT;&uL=*O^EQaTrO-LM$Q0&1`8ZAtg=x!WZzk3qKXnU}`wR@C;t}jZc0j-HKmG zKq88ZAL;D_4Hsybq~Q$>uW4AJVVMLYYm@?08;j4t^fc4 delta 1130 zcmZ`%T}V_x6n4_tKiA)NHQQaiQdTOuCWN?_K?EkjMJW4u2wm54$HCpZ-Fvr9=tmz! z!^O1Oz)Vbt=%onSr$p!ngoOwSg2)J?7ooSF%$_=PcXfTJmvir#^L^+0&Y4*~zTSaH z@x61^v-nva#ndtTV){^*w?`wY=4C|FbP|dvs(;vfN(n?mB&=)Rh^jCW&^3M*T`^CJ>ux~{kDE^e^gT3rC!n|p{!-jzS%TBA@c%`e z^1ea~E;lOQEs33hH^jhvrpU$@tsa!(E7mz+Z2@j`hvgBhN*DzP zC+fDvoqV&%Q|A;@snM|HkLpU0gvI4)yF9XBT8Qij`3x6J#aW|TRw!-sm;q@knFFIU zY5w%~I>a5aDQ+tL18?h9Xk5Rrrp~W?+AMLI@{1x^1ibH@!#bal9wtTp#0)J(5H~7s-p5Y zdmYKr%0(neRM#V#&+CoFVoi||ox)R8)S!2OT=hmsMB}M_ofYnFkgh1hTGJ5G2L*^X zyFPK3yOCdZU%&Me{ICrOl+hsjA+mK5CPf$*VNHb3BCLw=7D6;`4f{hxABhl6ybmV2 u$dt)O1KA+U22nOhlTlhDV1|yJ25F-qLPM-VNYGTe|I~JWwvtpl=h0up=U`?4 diff --git a/docs/build/html/.buildinfo b/docs/build/html/.buildinfo index e9d0191..80c81f1 100644 --- a/docs/build/html/.buildinfo +++ b/docs/build/html/.buildinfo @@ -1,4 +1,4 @@ # Sphinx build info version 1 # This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. -config: 7ddcc93c3d9f4799a2b495f01affb8e4 +config: fd285bc0b62a59d3d225e89af3060393 tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/docs/build/html/API.html b/docs/build/html/API.html index 9b5b29d..09828f7 100644 --- a/docs/build/html/API.html +++ b/docs/build/html/API.html @@ -1,18 +1,16 @@ - - + - + API — AutoGenFiles 0.0.4 documentation - - - - - - + + + + + @@ -33,17 +31,25 @@
-

API

+

API

-

AutoGenFiles Core

+

AutoGenFiles Core

The core module of AutoGenFiles project

-autogenfiles.autogenfiles.run(variables: dict, output_path: str)
+autogenfiles.autogenfiles.run(templates_path: str, variables: dict, output_path: str)

Runs the logic for generating rendered templates outcome

Params:
-
dir_name
+
templates_path:
+

str, Optional +Path to the templates directory

+
+
variables:
+

str, Optional +Dictionary with all the variables to be injected on the templates

+
+
output_path:

str, Required Name of output directory

@@ -54,14 +60,14 @@

API
-

Files Helper

+

Files Helper

Helper functions to deal with files

-autogenfiles.files_helper.create_subfolder_structure(subfolders, output_path)
+autogenfiles.files_helper.create_subfolder_structure(subfolders, output_path)

Creates subfolders inside output path

-
Params
+
Params:
subfolders: list(str), Required

A list of string cotaining templates/ subfolders names

@@ -74,11 +80,11 @@

API
-autogenfiles.files_helper.guarantee_trailing_slash(directory_name: str) str
+autogenfiles.files_helper.guarantee_trailing_slash(directory_name: str) str

Adds a trailling slash when missing

Params:
-
directory_name
+
directory_name:

str, required A directory name to add trailling slash if missing

@@ -86,7 +92,7 @@

API

-
Returns
+
Returns:

A post processed directory name with trailling slash

@@ -94,11 +100,11 @@

API
-autogenfiles.files_helper.prepare_files_and_subfolders(templates_dir: str = 'templates/')
+autogenfiles.files_helper.prepare_files_and_subfolders(templates_dir: str = 'templates/')

Given a templates directory, create lists of paths for the templates

Params:
-
templates_dir
+
templates_dir:

str, required A directory name where templates can be found

@@ -106,7 +112,7 @@

API

-
Returns
+
Returns:

Three objects containing the files names, subfolder list names and the size of the templates directory

@@ -115,11 +121,11 @@

API
-autogenfiles.files_helper.prepare_output_path_dir(dir_name: str)
+autogenfiles.files_helper.prepare_output_path_dir(dir_name: str)

Creates missing directories for output files

Params:
-
dir_name
+
dir_name:

str, Required Name of output directory

@@ -130,11 +136,11 @@

API
-autogenfiles.files_helper.read_template(file_name: str) str
+autogenfiles.files_helper.read_template(file_name: str) str

Reads a template file and returns its content

Params:
-
file_name
+
file_name:

str, Required Template file name

@@ -142,7 +148,7 @@

API

-
Returns
+
Returns:

Template file contents

@@ -150,15 +156,15 @@

API
-

Configuration module

+

Configuration module

The module that reads the variables file and return the variables

-autogenfiles.configuration.variables_to_substitute(variable_list: str)
+autogenfiles.configuration.variables_to_substitute(variable_list: str)

Reads variable file

Params:
-
variable_list
+
variable_list:

str, Required The variable file to be read and interpreted

@@ -215,7 +221,7 @@

Quick search

- + @@ -232,8 +238,8 @@

Quick search

©2021, Jessica Temporal. | - Powered by Sphinx 4.1.1 - & Alabaster 0.7.12 + Powered by Sphinx 7.2.6 + & Alabaster 0.7.13 | a:before{ - content: "["; -} - -a.brackets:after, -span.brackets > a:after { - content: "]"; +a:visited { + color: #551A8B; } h1:hover > a.headerlink, @@ -335,12 +329,16 @@ p.sidebar-title { font-weight: bold; } +nav.contents, +aside.topic, div.admonition, div.topic, blockquote { clear: left; } /* -- topics ---------------------------------------------------------------- */ +nav.contents, +aside.topic, div.topic { border: 1px solid #ccc; padding: 7px; @@ -379,6 +377,8 @@ div.body p.centered { div.sidebar > :last-child, aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, div.topic > :last-child, div.admonition > :last-child { margin-bottom: 0; @@ -386,6 +386,8 @@ div.admonition > :last-child { div.sidebar::after, aside.sidebar::after, +nav.contents::after, +aside.topic::after, div.topic::after, div.admonition::after, blockquote::after { @@ -428,10 +430,6 @@ table.docutils td, table.docutils th { border-bottom: 1px solid #aaa; } -table.footnote td, table.footnote th { - border: 0 !important; -} - th { text-align: left; padding-right: 5px; @@ -615,19 +613,26 @@ ul.simple p { margin-bottom: 0; } -dl.footnote > dt, -dl.citation > dt { +aside.footnote > span, +div.citation > span { float: left; - margin-right: 0.5em; } - -dl.footnote > dd, -dl.citation > dd { +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { margin-bottom: 0em; } - -dl.footnote > dd:after, -dl.citation > dd:after { +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { content: ""; clear: both; } @@ -644,10 +649,6 @@ dl.field-list > dt { padding-right: 5px; } -dl.field-list > dt:after { - content: ":"; -} - dl.field-list > dd { padding-left: 0.5em; margin-top: 0em; @@ -673,6 +674,16 @@ dd { margin-left: 30px; } +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + dl > dd:last-child, dl > dd:last-child > :last-child { margin-bottom: 0; @@ -731,8 +742,9 @@ dl.glossary dt { .classifier:before { font-style: normal; - margin: 0.5em; + margin: 0 0.5em; content: ":"; + display: inline-block; } abbr, acronym { @@ -740,6 +752,14 @@ abbr, acronym { cursor: help; } +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + /* -- code displays --------------------------------------------------------- */ pre { @@ -756,6 +776,7 @@ span.pre { -ms-hyphens: none; -webkit-hyphens: none; hyphens: none; + white-space: nowrap; } div[class*="highlight-"] { diff --git a/docs/build/html/_static/doctools.js b/docs/build/html/_static/doctools.js index 8cbf1b1..d06a71d 100644 --- a/docs/build/html/_static/doctools.js +++ b/docs/build/html/_static/doctools.js @@ -2,322 +2,155 @@ * doctools.js * ~~~~~~~~~~~ * - * Sphinx JavaScript utilities for all documentation. + * Base JavaScript utilities for all Sphinx HTML documentation. * - * :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ - -/** - * select a different prefix for underscore - */ -$u = _.noConflict(); - -/** - * make the code below compatible with browsers without - * an installed firebug like debugger -if (!window.console || !console.firebug) { - var names = ["log", "debug", "info", "warn", "error", "assert", "dir", - "dirxml", "group", "groupEnd", "time", "timeEnd", "count", "trace", - "profile", "profileEnd"]; - window.console = {}; - for (var i = 0; i < names.length; ++i) - window.console[names[i]] = function() {}; -} - */ - -/** - * small helper function to urldecode strings - * - * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL - */ -jQuery.urldecode = function(x) { - if (!x) { - return x - } - return decodeURIComponent(x.replace(/\+/g, ' ')); -}; - -/** - * small helper function to urlencode strings - */ -jQuery.urlencode = encodeURIComponent; - -/** - * This function returns the parsed url parameters of the - * current request. Multiple values per key are supported, - * it will always return arrays of strings for the value parts. - */ -jQuery.getQueryParameters = function(s) { - if (typeof s === 'undefined') - s = document.location.search; - var parts = s.substr(s.indexOf('?') + 1).split('&'); - var result = {}; - for (var i = 0; i < parts.length; i++) { - var tmp = parts[i].split('=', 2); - var key = jQuery.urldecode(tmp[0]); - var value = jQuery.urldecode(tmp[1]); - if (key in result) - result[key].push(value); - else - result[key] = [value]; +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); } - return result; }; -/** - * highlight a given string on a jquery object by wrapping it in - * span elements with the given class name. - */ -jQuery.fn.highlightText = function(text, className) { - function highlight(node, addItems) { - if (node.nodeType === 3) { - var val = node.nodeValue; - var pos = val.toLowerCase().indexOf(text); - if (pos >= 0 && - !jQuery(node.parentNode).hasClass(className) && - !jQuery(node.parentNode).hasClass("nohighlight")) { - var span; - var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg"); - if (isInSVG) { - span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); - } else { - span = document.createElement("span"); - span.className = className; - } - span.appendChild(document.createTextNode(val.substr(pos, text.length))); - node.parentNode.insertBefore(span, node.parentNode.insertBefore( - document.createTextNode(val.substr(pos + text.length)), - node.nextSibling)); - node.nodeValue = val.substr(0, pos); - if (isInSVG) { - var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); - var bbox = node.parentElement.getBBox(); - rect.x.baseVal.value = bbox.x; - rect.y.baseVal.value = bbox.y; - rect.width.baseVal.value = bbox.width; - rect.height.baseVal.value = bbox.height; - rect.setAttribute('class', className); - addItems.push({ - "parent": node.parentNode, - "target": rect}); - } - } - } - else if (!jQuery(node).is("button, select, textarea")) { - jQuery.each(node.childNodes, function() { - highlight(this, addItems); - }); - } - } - var addItems = []; - var result = this.each(function() { - highlight(this, addItems); - }); - for (var i = 0; i < addItems.length; ++i) { - jQuery(addItems[i].parent).before(addItems[i].target); - } - return result; -}; - -/* - * backward compatibility for jQuery.browser - * This will be supported until firefox bug is fixed. - */ -if (!jQuery.browser) { - jQuery.uaMatch = function(ua) { - ua = ua.toLowerCase(); - - var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || - /(webkit)[ \/]([\w.]+)/.exec(ua) || - /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || - /(msie) ([\w.]+)/.exec(ua) || - ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || - []; - - return { - browser: match[ 1 ] || "", - version: match[ 2 ] || "0" - }; - }; - jQuery.browser = {}; - jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true; -} - /** * Small JavaScript module for the documentation. */ -var Documentation = { - - init : function() { - this.fixFirefoxAnchorBug(); - this.highlightSearchWords(); - this.initIndexTable(); - if (DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) { - this.initOnKeyListeners(); - } +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); }, /** * i18n support */ - TRANSLATIONS : {}, - PLURAL_EXPR : function(n) { return n === 1 ? 0 : 1; }, - LOCALE : 'unknown', + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", // gettext and ngettext don't access this so that the functions // can safely bound to a different name (_ = Documentation.gettext) - gettext : function(string) { - var translated = Documentation.TRANSLATIONS[string]; - if (typeof translated === 'undefined') - return string; - return (typeof translated === 'string') ? translated : translated[0]; + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } }, - ngettext : function(singular, plural, n) { - var translated = Documentation.TRANSLATIONS[singular]; - if (typeof translated === 'undefined') - return (n == 1) ? singular : plural; - return translated[Documentation.PLURALEXPR(n)]; + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; }, - addTranslations : function(catalog) { - for (var key in catalog.messages) - this.TRANSLATIONS[key] = catalog.messages[key]; - this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')'); - this.LOCALE = catalog.locale; + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; }, /** - * add context elements like header anchor links + * helper function to focus on search bar */ - addContextElements : function() { - $('div[id] > :header:first').each(function() { - $('\u00B6'). - attr('href', '#' + this.id). - attr('title', _('Permalink to this headline')). - appendTo(this); - }); - $('dt[id]').each(function() { - $('\u00B6'). - attr('href', '#' + this.id). - attr('title', _('Permalink to this definition')). - appendTo(this); - }); + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); }, /** - * workaround a firefox stupidity - * see: https://bugzilla.mozilla.org/show_bug.cgi?id=645075 + * Initialise the domain index toggle buttons */ - fixFirefoxAnchorBug : function() { - if (document.location.hash && $.browser.mozilla) - window.setTimeout(function() { - document.location.href += ''; - }, 10); - }, - - /** - * highlight the search words provided in the url in the text - */ - highlightSearchWords : function() { - var params = $.getQueryParameters(); - var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : []; - if (terms.length) { - var body = $('div.body'); - if (!body.length) { - body = $('body'); + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); } - window.setTimeout(function() { - $.each(terms, function() { - body.highlightText(this.toLowerCase(), 'highlighted'); - }); - }, 10); - $('') - .appendTo($('#searchbox')); - } - }, - - /** - * init the domain index toggle buttons - */ - initIndexTable : function() { - var togglers = $('img.toggler').click(function() { - var src = $(this).attr('src'); - var idnum = $(this).attr('id').substr(7); - $('tr.cg-' + idnum).toggle(); - if (src.substr(-9) === 'minus.png') - $(this).attr('src', src.substr(0, src.length-9) + 'plus.png'); - else - $(this).attr('src', src.substr(0, src.length-8) + 'minus.png'); - }).css('display', ''); - if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) { - togglers.click(); - } - }, + }; - /** - * helper function to hide the search marks again - */ - hideSearchWords : function() { - $('#searchbox .highlight-link').fadeOut(300); - $('span.highlighted').removeClass('highlighted'); + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); }, - /** - * make the url absolute - */ - makeURL : function(relativeURL) { - return DOCUMENTATION_OPTIONS.URL_ROOT + '/' + relativeURL; - }, - - /** - * get the current relative url - */ - getCurrentURL : function() { - var path = document.location.pathname; - var parts = path.split(/\//); - $.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() { - if (this === '..') - parts.pop(); - }); - var url = parts.join('/'); - return path.substring(url.lastIndexOf('/') + 1, path.length - 1); - }, - - initOnKeyListeners: function() { - $(document).keydown(function(event) { - var activeElementType = document.activeElement.tagName; - // don't navigate when in search box, textarea, dropdown or button - if (activeElementType !== 'TEXTAREA' && activeElementType !== 'INPUT' && activeElementType !== 'SELECT' - && activeElementType !== 'BUTTON' && !event.altKey && !event.ctrlKey && !event.metaKey - && !event.shiftKey) { - switch (event.keyCode) { - case 37: // left - var prevHref = $('link[rel="prev"]').prop('href'); - if (prevHref) { - window.location.href = prevHref; - return false; + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); } break; - case 39: // right - var nextHref = $('link[rel="next"]').prop('href'); - if (nextHref) { - window.location.href = nextHref; - return false; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); } break; } } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } }); - } + }, }; // quick alias for translations -_ = Documentation.gettext; +const _ = Documentation.gettext; -$(document).ready(function() { - Documentation.init(); -}); +_ready(Documentation.init); diff --git a/docs/build/html/_static/documentation_options.js b/docs/build/html/_static/documentation_options.js index d417331..095e0ad 100644 --- a/docs/build/html/_static/documentation_options.js +++ b/docs/build/html/_static/documentation_options.js @@ -1,12 +1,13 @@ -var DOCUMENTATION_OPTIONS = { - URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'), +const DOCUMENTATION_OPTIONS = { VERSION: '0.0.4', - LANGUAGE: 'None', + LANGUAGE: 'en', COLLAPSE_INDEX: false, BUILDER: 'html', FILE_SUFFIX: '.html', LINK_SUFFIX: '.html', HAS_SOURCE: true, SOURCELINK_SUFFIX: '.txt', - NAVIGATION_WITH_KEYS: false + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, }; \ No newline at end of file diff --git a/docs/build/html/_static/language_data.js b/docs/build/html/_static/language_data.js index 863704b..250f566 100644 --- a/docs/build/html/_static/language_data.js +++ b/docs/build/html/_static/language_data.js @@ -5,12 +5,12 @@ * This script contains the language-specific data used by searchtools.js, * namely the list of stopwords, stemmer, scorer and splitter. * - * :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ -var stopwords = ["a","and","are","as","at","be","but","by","for","if","in","into","is","it","near","no","not","of","on","or","such","that","the","their","then","there","these","they","this","to","was","will","with"]; +var stopwords = ["a", "and", "are", "as", "at", "be", "but", "by", "for", "if", "in", "into", "is", "it", "near", "no", "not", "of", "on", "or", "such", "that", "the", "their", "then", "there", "these", "they", "this", "to", "was", "will", "with"]; /* Non-minified version is copied as a separate JS file, is available */ @@ -197,101 +197,3 @@ var Stemmer = function() { } } - - - -var splitChars = (function() { - var result = {}; - var singles = [96, 180, 187, 191, 215, 247, 749, 885, 903, 907, 909, 930, 1014, 1648, - 1748, 1809, 2416, 2473, 2481, 2526, 2601, 2609, 2612, 2615, 2653, 2702, - 2706, 2729, 2737, 2740, 2857, 2865, 2868, 2910, 2928, 2948, 2961, 2971, - 2973, 3085, 3089, 3113, 3124, 3213, 3217, 3241, 3252, 3295, 3341, 3345, - 3369, 3506, 3516, 3633, 3715, 3721, 3736, 3744, 3748, 3750, 3756, 3761, - 3781, 3912, 4239, 4347, 4681, 4695, 4697, 4745, 4785, 4799, 4801, 4823, - 4881, 5760, 5901, 5997, 6313, 7405, 8024, 8026, 8028, 8030, 8117, 8125, - 8133, 8181, 8468, 8485, 8487, 8489, 8494, 8527, 11311, 11359, 11687, 11695, - 11703, 11711, 11719, 11727, 11735, 12448, 12539, 43010, 43014, 43019, 43587, - 43696, 43713, 64286, 64297, 64311, 64317, 64319, 64322, 64325, 65141]; - var i, j, start, end; - for (i = 0; i < singles.length; i++) { - result[singles[i]] = true; - } - var ranges = [[0, 47], [58, 64], [91, 94], [123, 169], [171, 177], [182, 184], [706, 709], - [722, 735], [741, 747], [751, 879], [888, 889], [894, 901], [1154, 1161], - [1318, 1328], [1367, 1368], [1370, 1376], [1416, 1487], [1515, 1519], [1523, 1568], - [1611, 1631], [1642, 1645], [1750, 1764], [1767, 1773], [1789, 1790], [1792, 1807], - [1840, 1868], [1958, 1968], [1970, 1983], [2027, 2035], [2038, 2041], [2043, 2047], - [2070, 2073], [2075, 2083], [2085, 2087], [2089, 2307], [2362, 2364], [2366, 2383], - [2385, 2391], [2402, 2405], [2419, 2424], [2432, 2436], [2445, 2446], [2449, 2450], - [2483, 2485], [2490, 2492], [2494, 2509], [2511, 2523], [2530, 2533], [2546, 2547], - [2554, 2564], [2571, 2574], [2577, 2578], [2618, 2648], [2655, 2661], [2672, 2673], - [2677, 2692], [2746, 2748], [2750, 2767], [2769, 2783], [2786, 2789], [2800, 2820], - [2829, 2830], [2833, 2834], [2874, 2876], [2878, 2907], [2914, 2917], [2930, 2946], - [2955, 2957], [2966, 2968], [2976, 2978], [2981, 2983], [2987, 2989], [3002, 3023], - [3025, 3045], [3059, 3076], [3130, 3132], [3134, 3159], [3162, 3167], [3170, 3173], - [3184, 3191], [3199, 3204], [3258, 3260], [3262, 3293], [3298, 3301], [3312, 3332], - [3386, 3388], [3390, 3423], [3426, 3429], [3446, 3449], [3456, 3460], [3479, 3481], - [3518, 3519], [3527, 3584], [3636, 3647], [3655, 3663], [3674, 3712], [3717, 3718], - [3723, 3724], [3726, 3731], [3752, 3753], [3764, 3772], [3774, 3775], [3783, 3791], - [3802, 3803], [3806, 3839], [3841, 3871], [3892, 3903], [3949, 3975], [3980, 4095], - [4139, 4158], [4170, 4175], [4182, 4185], [4190, 4192], [4194, 4196], [4199, 4205], - [4209, 4212], [4226, 4237], [4250, 4255], [4294, 4303], [4349, 4351], [4686, 4687], - [4702, 4703], [4750, 4751], [4790, 4791], [4806, 4807], [4886, 4887], [4955, 4968], - [4989, 4991], [5008, 5023], [5109, 5120], [5741, 5742], [5787, 5791], [5867, 5869], - [5873, 5887], [5906, 5919], [5938, 5951], [5970, 5983], [6001, 6015], [6068, 6102], - [6104, 6107], [6109, 6111], [6122, 6127], [6138, 6159], [6170, 6175], [6264, 6271], - [6315, 6319], [6390, 6399], [6429, 6469], [6510, 6511], [6517, 6527], [6572, 6592], - [6600, 6607], [6619, 6655], [6679, 6687], [6741, 6783], [6794, 6799], [6810, 6822], - [6824, 6916], [6964, 6980], [6988, 6991], [7002, 7042], [7073, 7085], [7098, 7167], - [7204, 7231], [7242, 7244], [7294, 7400], [7410, 7423], [7616, 7679], [7958, 7959], - [7966, 7967], [8006, 8007], [8014, 8015], [8062, 8063], [8127, 8129], [8141, 8143], - [8148, 8149], [8156, 8159], [8173, 8177], [8189, 8303], [8306, 8307], [8314, 8318], - [8330, 8335], [8341, 8449], [8451, 8454], [8456, 8457], [8470, 8472], [8478, 8483], - [8506, 8507], [8512, 8516], [8522, 8525], [8586, 9311], [9372, 9449], [9472, 10101], - [10132, 11263], [11493, 11498], [11503, 11516], [11518, 11519], [11558, 11567], - [11622, 11630], [11632, 11647], [11671, 11679], [11743, 11822], [11824, 12292], - [12296, 12320], [12330, 12336], [12342, 12343], [12349, 12352], [12439, 12444], - [12544, 12548], [12590, 12592], [12687, 12689], [12694, 12703], [12728, 12783], - [12800, 12831], [12842, 12880], [12896, 12927], [12938, 12976], [12992, 13311], - [19894, 19967], [40908, 40959], [42125, 42191], [42238, 42239], [42509, 42511], - [42540, 42559], [42592, 42593], [42607, 42622], [42648, 42655], [42736, 42774], - [42784, 42785], [42889, 42890], [42893, 43002], [43043, 43055], [43062, 43071], - [43124, 43137], [43188, 43215], [43226, 43249], [43256, 43258], [43260, 43263], - [43302, 43311], [43335, 43359], [43389, 43395], [43443, 43470], [43482, 43519], - [43561, 43583], [43596, 43599], [43610, 43615], [43639, 43641], [43643, 43647], - [43698, 43700], [43703, 43704], [43710, 43711], [43715, 43738], [43742, 43967], - [44003, 44015], [44026, 44031], [55204, 55215], [55239, 55242], [55292, 55295], - [57344, 63743], [64046, 64047], [64110, 64111], [64218, 64255], [64263, 64274], - [64280, 64284], [64434, 64466], [64830, 64847], [64912, 64913], [64968, 65007], - [65020, 65135], [65277, 65295], [65306, 65312], [65339, 65344], [65371, 65381], - [65471, 65473], [65480, 65481], [65488, 65489], [65496, 65497]]; - for (i = 0; i < ranges.length; i++) { - start = ranges[i][0]; - end = ranges[i][1]; - for (j = start; j <= end; j++) { - result[j] = true; - } - } - return result; -})(); - -function splitQuery(query) { - var result = []; - var start = -1; - for (var i = 0; i < query.length; i++) { - if (splitChars[query.charCodeAt(i)]) { - if (start !== -1) { - result.push(query.slice(start, i)); - start = -1; - } - } else if (start === -1) { - start = i; - } - } - if (start !== -1) { - result.push(query.slice(start)); - } - return result; -} - - diff --git a/docs/build/html/_static/pygments.css b/docs/build/html/_static/pygments.css index 87f8bd1..57c7df3 100644 --- a/docs/build/html/_static/pygments.css +++ b/docs/build/html/_static/pygments.css @@ -22,6 +22,7 @@ span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: .highlight .cs { color: #8f5902; font-style: italic } /* Comment.Special */ .highlight .gd { color: #a40000 } /* Generic.Deleted */ .highlight .ge { color: #000000; font-style: italic } /* Generic.Emph */ +.highlight .ges { color: #000000 } /* Generic.EmphStrong */ .highlight .gr { color: #ef2929 } /* Generic.Error */ .highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ .highlight .gi { color: #00A000 } /* Generic.Inserted */ @@ -54,6 +55,7 @@ span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: .highlight .nt { color: #004461; font-weight: bold } /* Name.Tag */ .highlight .nv { color: #000000 } /* Name.Variable */ .highlight .ow { color: #004461; font-weight: bold } /* Operator.Word */ +.highlight .pm { color: #000000; font-weight: bold } /* Punctuation.Marker */ .highlight .w { color: #f8f8f8; text-decoration: underline } /* Text.Whitespace */ .highlight .mb { color: #990000 } /* Literal.Number.Bin */ .highlight .mf { color: #990000 } /* Literal.Number.Float */ diff --git a/docs/build/html/_static/searchtools.js b/docs/build/html/_static/searchtools.js index 8eb1421..7918c3f 100644 --- a/docs/build/html/_static/searchtools.js +++ b/docs/build/html/_static/searchtools.js @@ -4,22 +4,24 @@ * * Sphinx JavaScript utilities for the full-text search. * - * :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ +"use strict"; -if (!Scorer) { - /** - * Simple result scoring code. - */ +/** + * Simple result scoring code. + */ +if (typeof Scorer === "undefined") { var Scorer = { // Implement the following function to further tweak the score for each result - // The function takes a result array [filename, title, anchor, descr, score] + // The function takes a result array [docname, title, anchor, descr, score, filename] // and returns the new score. /* - score: function(result) { - return result[4]; + score: result => { + const [docname, title, anchor, descr, score, filename] = result + return score }, */ @@ -28,9 +30,11 @@ if (!Scorer) { // or matches in the last dotted part of the object name objPartialMatch: 6, // Additive scores depending on the priority of the object - objPrio: {0: 15, // used to be importantResults - 1: 5, // used to be objectResults - 2: -5}, // used to be unimportantResults + objPrio: { + 0: 15, // used to be importantResults + 1: 5, // used to be objectResults + 2: -5, // used to be unimportantResults + }, // Used when the priority is not in the mapping. objPrioDefault: 0, @@ -39,446 +43,503 @@ if (!Scorer) { partialTitle: 7, // query found in terms term: 5, - partialTerm: 2 + partialTerm: 2, }; } -if (!splitQuery) { - function splitQuery(query) { - return query.split(/\s+/); +const _removeChildren = (element) => { + while (element && element.lastChild) element.removeChild(element.lastChild); +}; + +/** + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping + */ +const _escapeRegExp = (string) => + string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string + +const _displayItem = (item, searchTerms, highlightTerms) => { + const docBuilder = DOCUMENTATION_OPTIONS.BUILDER; + const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX; + const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX; + const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY; + const contentRoot = document.documentElement.dataset.content_root; + + const [docName, title, anchor, descr, score, _filename] = item; + + let listItem = document.createElement("li"); + let requestUrl; + let linkUrl; + if (docBuilder === "dirhtml") { + // dirhtml builder + let dirname = docName + "/"; + if (dirname.match(/\/index\/$/)) + dirname = dirname.substring(0, dirname.length - 6); + else if (dirname === "index/") dirname = ""; + requestUrl = contentRoot + dirname; + linkUrl = requestUrl; + } else { + // normal html builders + requestUrl = contentRoot + docName + docFileSuffix; + linkUrl = docName + docLinkSuffix; } + let linkEl = listItem.appendChild(document.createElement("a")); + linkEl.href = linkUrl + anchor; + linkEl.dataset.score = score; + linkEl.innerHTML = title; + if (descr) { + listItem.appendChild(document.createElement("span")).innerHTML = + " (" + descr + ")"; + // highlight search terms in the description + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + } + else if (showSearchSummary) + fetch(requestUrl) + .then((responseData) => responseData.text()) + .then((data) => { + if (data) + listItem.appendChild( + Search.makeSearchSummary(data, searchTerms) + ); + // highlight search terms in the summary + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + }); + Search.output.appendChild(listItem); +}; +const _finishSearch = (resultCount) => { + Search.stopPulse(); + Search.title.innerText = _("Search Results"); + if (!resultCount) + Search.status.innerText = Documentation.gettext( + "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories." + ); + else + Search.status.innerText = _( + `Search finished, found ${resultCount} page(s) matching the search query.` + ); +}; +const _displayNextItem = ( + results, + resultCount, + searchTerms, + highlightTerms, +) => { + // results left, load the summary and display it + // this is intended to be dynamic (don't sub resultsCount) + if (results.length) { + _displayItem(results.pop(), searchTerms, highlightTerms); + setTimeout( + () => _displayNextItem(results, resultCount, searchTerms, highlightTerms), + 5 + ); + } + // search finished, update title and status message + else _finishSearch(resultCount); +}; + +/** + * Default splitQuery function. Can be overridden in ``sphinx.search`` with a + * custom function per language. + * + * The regular expression works by splitting the string on consecutive characters + * that are not Unicode letters, numbers, underscores, or emoji characters. + * This is the same as ``\W+`` in Python, preserving the surrogate pair area. + */ +if (typeof splitQuery === "undefined") { + var splitQuery = (query) => query + .split(/[^\p{Letter}\p{Number}_\p{Emoji_Presentation}]+/gu) + .filter(term => term) // remove remaining empty strings } /** * Search Module */ -var Search = { - - _index : null, - _queued_query : null, - _pulse_status : -1, - - htmlToText : function(htmlString) { - var virtualDocument = document.implementation.createHTMLDocument('virtual'); - var htmlElement = $(htmlString, virtualDocument); - htmlElement.find('.headerlink').remove(); - docContent = htmlElement.find('[role=main]')[0]; - if(docContent === undefined) { - console.warn("Content block not found. Sphinx search tries to obtain it " + - "via '[role=main]'. Could you check your theme or template."); - return ""; - } - return docContent.textContent || docContent.innerText; +const Search = { + _index: null, + _queued_query: null, + _pulse_status: -1, + + htmlToText: (htmlString) => { + const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html'); + htmlElement.querySelectorAll(".headerlink").forEach((el) => { el.remove() }); + const docContent = htmlElement.querySelector('[role="main"]'); + if (docContent !== undefined) return docContent.textContent; + console.warn( + "Content block not found. Sphinx search tries to obtain it via '[role=main]'. Could you check your theme or template." + ); + return ""; }, - init : function() { - var params = $.getQueryParameters(); - if (params.q) { - var query = params.q[0]; - $('input[name="q"]')[0].value = query; - this.performSearch(query); - } + init: () => { + const query = new URLSearchParams(window.location.search).get("q"); + document + .querySelectorAll('input[name="q"]') + .forEach((el) => (el.value = query)); + if (query) Search.performSearch(query); }, - loadIndex : function(url) { - $.ajax({type: "GET", url: url, data: null, - dataType: "script", cache: true, - complete: function(jqxhr, textstatus) { - if (textstatus != "success") { - document.getElementById("searchindexloader").src = url; - } - }}); - }, + loadIndex: (url) => + (document.body.appendChild(document.createElement("script")).src = url), - setIndex : function(index) { - var q; - this._index = index; - if ((q = this._queued_query) !== null) { - this._queued_query = null; - Search.query(q); + setIndex: (index) => { + Search._index = index; + if (Search._queued_query !== null) { + const query = Search._queued_query; + Search._queued_query = null; + Search.query(query); } }, - hasIndex : function() { - return this._index !== null; - }, + hasIndex: () => Search._index !== null, - deferQuery : function(query) { - this._queued_query = query; - }, + deferQuery: (query) => (Search._queued_query = query), - stopPulse : function() { - this._pulse_status = 0; - }, + stopPulse: () => (Search._pulse_status = -1), - startPulse : function() { - if (this._pulse_status >= 0) - return; - function pulse() { - var i; + startPulse: () => { + if (Search._pulse_status >= 0) return; + + const pulse = () => { Search._pulse_status = (Search._pulse_status + 1) % 4; - var dotString = ''; - for (i = 0; i < Search._pulse_status; i++) - dotString += '.'; - Search.dots.text(dotString); - if (Search._pulse_status > -1) - window.setTimeout(pulse, 500); - } + Search.dots.innerText = ".".repeat(Search._pulse_status); + if (Search._pulse_status >= 0) window.setTimeout(pulse, 500); + }; pulse(); }, /** * perform a search for something (or wait until index is loaded) */ - performSearch : function(query) { + performSearch: (query) => { // create the required interface elements - this.out = $('#search-results'); - this.title = $('

' + _('Searching') + '

').appendTo(this.out); - this.dots = $('').appendTo(this.title); - this.status = $('

 

').appendTo(this.out); - this.output = $('