From ad0779c4fd654323d7788c1352219bc0337756f4 Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Thu, 25 Apr 2019 21:05:06 -0400 Subject: [PATCH] Build GStreamer modules API documentation as part of our build Adding a nice landing page. And update emoticons. Using meson subprojects --- images/distribute.svg | 76 ++ markdown/api.md | 1 + markdown/doc_index.md | 86 +++ markdown/gst_index.md | 7 + markdown/index.md | 120 +--- markdown/libs.md | 5 + markdown/plugins_doc.md | 5 + markdown/simple-index.md | 11 + meson.build | 56 +- meson_options.txt | 6 + scripts/generate_sitemap.py | 26 + sitemap.txt | 18 +- theme/extra/images/api-reference.svg | 35 + theme/extra/images/deploy.png | Bin 0 -> 2564 bytes theme/extra/images/design-guidelines.svg | 32 + theme/extra/images/tutorials.png | Bin 0 -> 3247 bytes theme/extra/templates/navbar_links.html | 25 + theme/less/variables.less | 875 ----------------------- 18 files changed, 413 insertions(+), 971 deletions(-) create mode 100644 images/distribute.svg create mode 100644 markdown/api.md create mode 100644 markdown/doc_index.md create mode 100644 markdown/gst_index.md create mode 100644 markdown/libs.md create mode 100644 markdown/plugins_doc.md create mode 100644 markdown/simple-index.md create mode 100644 meson_options.txt create mode 100755 scripts/generate_sitemap.py create mode 100644 theme/extra/images/api-reference.svg create mode 100644 theme/extra/images/deploy.png create mode 100644 theme/extra/images/design-guidelines.svg create mode 100644 theme/extra/images/tutorials.png create mode 100644 theme/extra/templates/navbar_links.html delete mode 100644 theme/less/variables.less diff --git a/images/distribute.svg b/images/distribute.svg new file mode 100644 index 0000000000..adca56c446 --- /dev/null +++ b/images/distribute.svg @@ -0,0 +1,76 @@ + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/markdown/api.md b/markdown/api.md new file mode 100644 index 0000000000..71c531a3b8 --- /dev/null +++ b/markdown/api.md @@ -0,0 +1 @@ +# API reference diff --git a/markdown/doc_index.md b/markdown/doc_index.md new file mode 100644 index 0000000000..fb183b5c77 --- /dev/null +++ b/markdown/doc_index.md @@ -0,0 +1,86 @@ +--- +short-description: Tutorials and Manuals +render-subpages: false +... + +# Documentation and Tutorials + +Feel free to jump straight to the download section, start practicing +with the tutorials, or read the F.A.Q. if you don’t know what this is +all about. + +## General + + * [Application Development Manual (Read this first)](application-development/index.md) + * [Frequently Asked Questions](frequently-asked-questions/index.md) + * [Plugin Writer's Guide](plugin-development/index.md) + * Core Reference + * Core Libraries Reference + * [Core Design Documentation](design/index.md) + * [GStreamer 0.10 to 1.0 porting guide](https://gitlab.freedesktop.org/gstreamer/gstreamer/raw/master/docs/random/porting-to-1.0.txt) + + + + +## GStreamer APIs References + +* [GStreamer Core library](gstreamer) +* [GStreamer Libraries Reference](libs.html) +* [GStreamer Plugins Reference](plugins_doc.html) + +> ![Warning](images/icons/emoticons/warning.svg) Only the API in libraries from +> GStreamer core and gst-plugins-base are guaranteed to be API and ABI stable + + +## Other modules + + * [GStreamer Editing Services Reference](gst-editing-services) + * [GStreamer RTSP Server Reference](gst-rtsp-server) + * [GStreamer VAAPI Reference](vaapi) + * [GStreamer Validate](gst-devtools) + * Orc - Optimized inner loop Runtime Compiler + +## GStreamer Conference Videos and Slides + +* [GStreamer Conference 2016: Videos and Slides] [(PDF slides)] +* [GStreamer Conference 2015: Videos and Slides] [(PDF slides)][1] +* [GStreamer Conference 2014: Videos and Slides] [(PDF slides)][2] +* [GStreamer Conference 2013: Videos and Slides] [(PDF slides)][3] +* [GStreamer Conference 2012: Videos and Slides] [(PDF slides)][4] +* [GStreamer Conference 2011: Videos and Slides] [(PDF slides)][5] +* [GStreamer Conference 2010: Videos and Slides] [(PDF slides)][6] + + [GStreamer Conference 2016: Videos and Slides]: http://gstconf.ubicast.tv/channels/#gstreamer-conference-2016 + [GStreamer Conference 2015: Videos and Slides]: http://gstconf.ubicast.tv/channels/#gstreamer-conference-2015 + [GStreamer Conference 2014: Videos and Slides]: http://gstconf.ubicast.tv/channels/#gstreamer-conference-2014 + [GStreamer Conference 2013: Videos and Slides]: http://gstconf.ubicast.tv/channels/#gstreamer-conference-2013 + [GStreamer Conference 2012: Videos and Slides]: http://gstconf.ubicast.tv/channels/#gstreamer-conference-2012 + [GStreamer Conference 2011: Videos and Slides]: http://gstconf.ubicast.tv/channels/#conferences-2011 + [GStreamer Conference 2010: Videos and Slides]: http://gstconf.ubicast.tv/channels/#conferences-2010 + [(PDF slides)]: https://gstreamer.freedesktop.org/data/events/gstreamer-conference/2016/ + [1]: https://gstreamer.freedesktop.org/data/events/gstreamer-conference/2015/ + [2]: https://gstreamer.freedesktop.org/data/events/gstreamer-conference/2014/ + [3]: https://gstreamer.freedesktop.org/data/events/gstreamer-conference/2013/ + [4]: https://gstreamer.freedesktop.org/data/events/gstreamer-conference/2012/ + [5]: https://gstreamer.freedesktop.org/data/events/gstreamer-conference/2011/ + [6]: https://gstreamer.freedesktop.org/data/events/gstreamer-conference/2010/ + + +## GStreamer licensing advisory + +The GStreamer community provides the following licensing advisory for +developers planing on or already using GStreamer for their applications: + + * [GStreamer Licensing Advisory](licensing.md) + + +## GStreamer plugin module split-up + +[An explanation of the various plugin modules and how they were split up](splitup.md) + +## RTP and RTSP support in GStreamer + + * [RTSP and RTP component overview](rtp.md) diff --git a/markdown/gst_index.md b/markdown/gst_index.md new file mode 100644 index 0000000000..100b249243 --- /dev/null +++ b/markdown/gst_index.md @@ -0,0 +1,7 @@ +# GStreamer + +This is the main GStreamer documentation. It contains two sections +the first one contains manuals, tutorials and misc answers to +questions people have concerning how to use/get involved in +the GStreamer project. The second section is the GStreamer API +reference. diff --git a/markdown/index.md b/markdown/index.md index 35748de6fe..a1d7319354 100644 --- a/markdown/index.md +++ b/markdown/index.md @@ -1,85 +1,41 @@ -# GStreamer documentation - -Feel free to jump straight to the download section, start practicing -with the tutorials, or read the F.A.Q. if you don’t know what this is -all about. +--- +full-width: true +title: GStreamer +render-subpages: false +... +
+ +
-## General - - * [Application Development Manual (Read this first)](application-development/index.md) - * [Frequently Asked Questions](frequently-asked-questions/index.md) - * [Plugin Writer's Guide](plugin-development/index.md) - * Core Reference - * Core Libraries Reference - * [Core Design Documentation](design/index.md) - * [GStreamer 0.10 to 1.0 porting guide](https://gitlab.freedesktop.org/gstreamer/gstreamer/raw/master/docs/random/porting-to-1.0.txt) - - - - -## GStreamer Plugins-Base Module Libraries Reference - - * GStreamer Base Plugins Libraries Reference - -## GStreamer Plugins-Bad Module Libraries Reference - -Note: The API from these gst-plugins-bad libraries is unstable and can -change between releases. - -Only the API in libraries from GStreamer core and -gst-plugins-base are guaranteed to be API and ABI stable - - * GStreamer Bad Plugins Libraries Reference - -## Plugin Modules - - * Overview of all Plug-ins - * GStreamer Core Plugins Reference - * GStreamer Base Plugins Reference - * GStreamer Good Plugins Reference - * GStreamer Ugly Plugins Reference - * GStreamer Bad Plugins Reference - -## Other modules - - * GStreamer Editing Services Reference - * GStreamer RTSP Server Reference - * GStreamer VAAPI Reference - * QtGStreamer Reference - * GstValidate Reference - * Orc - Optimized inner loop Runtime Compiler - * GStreamer Non-Linear Multimedia Editing Plugins Reference (deprecated, use GStreamer Editing Services instead) - -## GStreamer Conference Videos and Slides - -* GStreamer Conference 2018: Videos and Slides (PDF slides) -* GStreamer Conference 2017: Videos and Slides (PDF slides) -* GStreamer Conference 2016: Videos and Slides (PDF slides) -* GStreamer Conference 2015: Videos and Slides (PDF slides) - * GStreamer Conference 2014: Videos and Slides (PDF slides) - * GStreamer Conference 2013: Videos and Slides (PDF slides) - * GStreamer Conference 2012: Videos and Slides (PDF slides) - * GStreamer Conference 2011: Videos and Slides (PDF slides) -* GStreamer Conference 2010: Videos and Slides (PDF slides) - - -## GStreamer licensing advisory - -The GStreamer community provides the following licensing advisory for -developers planing on or already using GStreamer for their applications: - - * GStreamer Licensing Advisory - - -## GStreamer plugin module split-up - -[An explanation of the various plugin modules and how they were split up](splitup.md) - -## RTP and RTSP support in GStreamer - - * [RTSP and RTP component overview](rtp.md) +
+ + + + +
diff --git a/markdown/libs.md b/markdown/libs.md new file mode 100644 index 0000000000..27ccc4a654 --- /dev/null +++ b/markdown/libs.md @@ -0,0 +1,5 @@ +--- +short-description: All the GStreamer libraries from the various components +... + +# GStreamer libraries diff --git a/markdown/plugins_doc.md b/markdown/plugins_doc.md new file mode 100644 index 0000000000..657c1204e2 --- /dev/null +++ b/markdown/plugins_doc.md @@ -0,0 +1,5 @@ +--- +short-description: All the GStreamer plugins from its various components +... + +# GStreamer plugins diff --git a/markdown/simple-index.md b/markdown/simple-index.md new file mode 100644 index 0000000000..b5a824579f --- /dev/null +++ b/markdown/simple-index.md @@ -0,0 +1,11 @@ +--- +title: GStreamer +... + +# GStreamer: a flexible, fast and multiplatform multimedia framework + +GStreamer is an extremely powerful and versatile framework for creating +streaming media applications. Many of the virtues of the GStreamer +framework come from its modularity: GStreamer can seamlessly incorporate +new plugin modules. But because modularity and power often come at a +cost of greater complexity, writing new applications is not always easy. \ No newline at end of file diff --git a/meson.build b/meson.build index ae90589167..ea6b34d841 100644 --- a/meson.build +++ b/meson.build @@ -3,24 +3,70 @@ project('GStreamer manuals and tutorials', 'c', meson_version: '>=0.48.0') hotdoc = import('hotdoc') +hotdoc_subprojects = [] apiversion = '1.0' +if host_machine.system() == 'windows' + pathsep = ';' +else + pathsep = ':' +endif + +libs = '' +plugins_doc = '' +deps = [] +plugins_sitemap = '' +if get_option('built_subprojects') != '' + foreach project_name: get_option('built_subprojects').split(',') + sub = subproject(project_name) + if sub.get_variable('build_hotdoc') + message('Building @0@ documentation'.format(project_name)) + + foreach lib: sub.get_variable('libs_doc') + hotdoc_subprojects += [lib] + libs += lib.full_path() + pathsep + deps += [lib] + endforeach + + foreach plugin_doc: sub.get_variable('plugins_doc') + plugins_doc += plugin_doc.full_path() + pathsep + hotdoc_subprojects += [plugin_doc] + deps += [plugin_doc] + endforeach + else + message('@0@ did not build hotdoc documentation, can\'t build API doc'.format(project_name)) + endif + endforeach +endif + +if get_option('use_portal_index') + index = 'markdown/index.md' +else + index = 'markdown/simple-index.md' +endif +sitemap_gen = find_program('scripts/generate_sitemap.py') +sitemap = configure_file(command: [sitemap_gen, '@INPUT@', '@OUTPUT@', + index.split('/')[1], libs, plugins_doc], + input: 'sitemap.txt', + output: 'sitemap.txt') html_theme = 'https://github.com/hotdoc/hotdoc_lumen_theme/releases/download/0.9/hotdoc_lumen_theme-0.9.tar.xz?sha256=ec3807f13eda2d4914fcf251b7e9607e90f33430725a2b1d433a90c9210a52fc' gstreamer_doc = hotdoc.generate_doc('GStreamer', project_version: apiversion, - sitemap: 'sitemap.txt', - index: 'markdown/index.md', - build_by_default: true, + sitemap: sitemap, + index: index, install: true, extra_assets: [join_paths(meson.current_source_dir(), 'images')], syntax_highlighting_activate: true, html_theme: html_theme, include_paths: join_paths(meson.current_source_dir(), 'examples'), html_extra_theme: join_paths(meson.current_source_dir(), 'theme/extra'), - edit_on_github_repository: 'https://gitlab.freedesktop.org/gstreamer/gst-docs/', - edit_on_github_branch: 'master', + dependencies: deps, + subprojects: hotdoc_subprojects, disable_incremental_build: true, + gst_list_plugins_page: 'plugins_doc.md', devhelp_activate: true, + build_always_stale: true, + edit_on_github_repository: 'https://gitlab.freedesktop.org/gstreamer/gst-docs/', ) diff --git a/meson_options.txt b/meson_options.txt new file mode 100644 index 0000000000..06f5ecf7ba --- /dev/null +++ b/meson_options.txt @@ -0,0 +1,6 @@ +# Special option to tell `gst-docs` what subprojects with +# API documentation can be used. +option('built_subprojects', type : 'string', value : '') +# Special entry to make `gst-docs` usable as part of a bigger +# portal (gnome-portal for example). +option('use_portal_index', type : 'boolean', value : true) diff --git a/scripts/generate_sitemap.py b/scripts/generate_sitemap.py new file mode 100755 index 0000000000..ebb6b916c1 --- /dev/null +++ b/scripts/generate_sitemap.py @@ -0,0 +1,26 @@ +#!/usr/bin/env python3 +import os +import sys + + +if __name__ == "__main__": + in_, out, index_md = sys.argv[1], sys.argv[2], sys.argv[3] + with open(in_) as f: + index = f.read() + if sys.argv[4]: + index = '\n'.join('\t' + l for l in index.splitlines()) + libs, plugins = sys.argv[4].split(os.pathsep), sorted( + sys.argv[5].split(os.pathsep), key=lambda x: os.path.basename(x)) + index += '\n api.md\n libs.md' + for lib in libs: + if not lib: + continue + index += "\n " + lib + '.json' + index += '\n plugins_doc.md' + for plugin in plugins: + if not plugin: + continue + index += "\n " + plugin + '.json' + index = '%s\n%s' % (index_md, index) + with open(out, 'w') as fw: + fw.write(index) diff --git a/sitemap.txt b/sitemap.txt index 0d84078ebb..93a097850f 100644 --- a/sitemap.txt +++ b/sitemap.txt @@ -1,11 +1,11 @@ -index.md - installing/index.md - installing/for-android-development.md - installing/for-ios-development.md - installing/on-mac-osx.md - installing/on-windows.md +doc_index.md + installing/index.md + installing/for-android-development.md + installing/for-ios-development.md + installing/on-mac-osx.md + installing/on-windows.md installing/on-linux.md - installing/building-from-source-using-cerbero.md + installing/building-from-source-using-cerbero.md frequently-asked-questions/index.md frequently-asked-questions/general.md frequently-asked-questions/dependencies.md @@ -50,7 +50,7 @@ index.md application-development/appendix/integration.md application-development/appendix/licensing.md application-development/appendix/quotes.md - tutorials/index.md + tutorials/index.md tutorials/basic/index.md tutorials/basic/hello-world.md tutorials/basic/concepts.md @@ -206,4 +206,4 @@ index.md design/draft-tagreading.md design/toc.md design/tracing.md - design/trickmodes.md \ No newline at end of file + design/trickmodes.md diff --git a/theme/extra/images/api-reference.svg b/theme/extra/images/api-reference.svg new file mode 100644 index 0000000000..f25f43d8af --- /dev/null +++ b/theme/extra/images/api-reference.svg @@ -0,0 +1,35 @@ + + + + + + + + image/svg+xml + + Gnome Symbolic Icon Theme + + + + + + + Gnome Symbolic Icon Theme + + + + + + + + + + + + + + + + + + diff --git a/theme/extra/images/deploy.png b/theme/extra/images/deploy.png new file mode 100644 index 0000000000000000000000000000000000000000..6f45592c7e9d418a8e2edb2b69bab24ac6dd463e GIT binary patch literal 2564 zcmcgu4NOy46uz~^S0Fx%gvm@RF9IgIfL3Rug=rs_Az?+?reQ!qtIjCG_^FD*926Z@ z6skBywn-sDGz^DZ5DLOTelw~xfguyn;<{216oXTiiR`@hfTEk*vTO!g&iU^7yWc(c z9uBV$@}Ffl&ki9pD`2hkU4&SVs1J80Ag!IZkHDXqia>uU8mE4=)kWEW*v78?AORtJ zN9w~uxnDQ~h$#bPepnyJ#^JR^nsCEmFgqR~CEriHIn-Mh*S(Y{30_d&WUvu$k_{rc z_Dz#1VAGK^O;DCE zUVAyZ=4Vec$O;Oa6f#6em6^jPENT#750!WMh{O;_(EfsscuFKOw2%BMdTuYENbI&< z?~2S^m07=`Ct}>=$*rVI1GVzDy3l*^+qJd=GzUCsXBHC~f=|=wWD~l?Flq9Cx=>ZT zkTs=n@Dz~_h1*5#D3KMXRTuYaRC14Ed~c6ceT^pS0O}t8m}U((I#4 z8dGz!H?6*z%@uojJ$&1d#M0fnia>FzJK$%i>*GH5P~o`WU?gle*xyh`avv`PKmxgk z7dnv`<^tRquPp}5hbgID)YU)LL8Z~3ci*R5C?{lsv6kp^4%#~0n{~a(dG_j!C1qT3 z;4ahlN4GMZu#k+f`%GiiFGxQ6Vk2G{Rq&^}?sQzYfIg49lQ>}^2AK0ar-UMcF`kmQ zn-(|%sX$^NJ6Md+r#o-&4c3FuC0Fs`qTV^RWt+#xZkLqp*nr6Nt*QOXKiY4c7o%e< za1~CN2}?>2TZOAdl#r%nt3_NfVTM!+oD!fI%8ps4?YLsvj#;Md{y~^n$13-h{3j7# z&0w?{?vE&t)(-c|uGfv1${StQoLpAtBLLXQbCMj)SGe(Llz-JdFsu1rT&t?)Ge z0RR%rFT>R$RgA4f-^jny?ZHy(auS;JjtQIUvo=J@W7gSLuDQj!E6xzP8Bck`A`_qD zCj-b)i>R~^coJahP-KE#8f`JHFaUHwJ0_e<@3N6kZAggG02~?=Fa`MQNg9BIr7ar5 zX}|#-DWFDC&LK>Y`o6|#DaF}wiXM3jsZSjxUAE{ubBnpKI)8=9Q=k?N2UbLeIVSKD zh(tppzk$!4uM}cJOohqy;9w-7oEMf(yhAlYYFdogYUc)5iD?DZv!Iyrv>f(AI4aU0 z>;Kyppj*YX-W>kZ1Knu-GQ#}E&Jx)T@1hYOnI)wj+IrfN%ad+I7+9EivK4hJ*d(_3 z>Z;P&96_uaA{l2n!0Eo-We>gQyugAI*QlUT3;K`2w<};P3Al}Mu8YhnTrwPTM5kr* zd~y|@7R1Ra%CQ%tbyDRa4GnvpFTRp*tlkrdVn6N(i)xojjII}9~%3yB4hNs zx4yZ&gITYA3~-=IwS3Z)hBu^*tC8RRXyw!y(?vXvH4zaP$ z$vZaHode&ls?fBxkpO96f^fdDHZc7oG; z5?A1EXAFLV2L4)}G8nGi368u2uBRJ0uC6SF+m<)vkoU;HquIILUE0D@jo%C{Df2Q` z1hx$ACVCG(E5A@!_MxI#3gJuB)NJ8rqO#ejV5BIL^=js`@zVn{uI7*EjQRdT_ + + + + + + + image/svg+xml + + Gnome Symbolic Icon Theme + + + + + + + Gnome Symbolic Icon Theme + + + + + + + + + + + + + + + diff --git a/theme/extra/images/tutorials.png b/theme/extra/images/tutorials.png new file mode 100644 index 0000000000000000000000000000000000000000..ae69a25dc9a6254439a9b5b599e99626db6cc908 GIT binary patch literal 3247 zcmd5;d0Z1o7Jl7HAc zwMifW;fQwEo_%~w4dj6Xiu?3YF4E2BCV8OsM4VR95uc8!MM?dr!^#PTTEENLAVK(A zBi&@?XgkIZ#o4HdL%ynY-cQCPaD`VDNA4|ocj&}u@mFkLAiQ-Ym%okWF*^D5vI?#Q z2&+AeVaZ%IP!CvYAh-)Alaus=2|Vukcu8*$%ema4YoWjrg#6@+(s#dKnQrtVTToy_ z;V3v1PNlK>Jj*uZ^+$8aqKQxEjbWTK`bY&^MTU&~=)8L3^rvSk?$0f~@#126ZIuNm z;X_nDAo53#I zXHML~f6T*BrK_PXB5FHzPB)p2Mzhz z&hZ2t3EY9|Qn5Wo^;bG(M53ZVv5^*ZtHp90#-&qpZ1AaKDae!S z7M$R6lRPtGS#!XCfKV@76Dq|;pxm46z)vnP6@f%8gt(z42y3HPKq?bJiUC2W=-GV< z_6e(xA^4bv2qt1>l#hnq*L`P#cUQ=7;iq?(#NMCZd2FK@hYFrX_tJZMY#ci_T&CAg zh+MT{<{^-$aA)H$WfxTRmcM8!JD2{8Q`~%Ma{1e}2__nwGrHGxaT62nMAy7bx|>+5 z%5IE%Lm!E*9#sB!9_))1?!WhPMqps@&+dlxcYm4^YlFLgrSJvGvXonq554QpR5f;QezVh|u<4XweOa1r?CM`lgxeEw=2 z@;#N~etYNR@Zp6``dv*m*SQ>07f?BA!)Z>5b_PZ?lfsB6JK9vC^*eEj7~?!=59ITZ zEI$`#=2kJACuuIU)z5~4t_BzF5WYeLw`h%j}lO?kobK)Wk#u(1N-&L3W;r5+m(R^R8;x_`^lq8%-7OxRB@c&_d`1OmzBMr zH*HaB$sTu1WAo$MI}t6Zbo`~$Md$c@;Cf7b7G6qcoR1DYrNrgoD_fqFj~|ryW)P$8 zE;l}wugEPp&#qL5FD#PoyOC5A)vzXmwLllL z$OP10OT{RQ>doJ^4Fs(U zwpj%!#i*m!k3~BmS@w1<11DI|&@DZP^5mqN+2WPmok}NEoliW2Jdf~^r3Wr|R!M-; z2-eumeE5igQ}X7KY%0(G?bw~=sGq3W+DL6b`nxWH=DmIxp*}W>eCYVTp`k(L2^W4L1rlh^3|wm zWME*F4>;fjtvvyoqK0m+zbfuRI^qVKxYXHwq>4|K+}F&E{PD#}U0$K}t^KX>rW*F= zyT8x?C|UOvSHxi(^NlV-U3)(K@-;>xN`;9ERbj=Bn-!Sf96Vv>Sc(;Nd$|(_=G!z~ zTX^1lzK*44v&R^Tnvh~bJtBh!Z3t@6+O&Bgb6~5JnWq8cD0Ay;}&F>XAygwft8B3 zgyPeC!_a}_tpq#NOVpb~S2{I2X{*+hD)!bqc16Z(^b12n>1EX&FCHiqk3(^h0SdN7 zl>~M^=b;p#9Ou8?tMNcyURyP`YFDL?{9^Cn4kf2PpG_7g9_g6cC-olbz(368b{u3I z-}dHqEb5aImo8pU>O#hBoqH_GYzRBc3$9nE_@ZPCnaq{tM&*6O&Sa)`2Q6Gi=<}?v zH`swt_C$ooD{kfgY;cplxRi`#vt+KfzuW&KA zv9F&yyB;H*3sJnWk+Ao3F8D%zz~`qHl)(SJQgNJ20dq%~IT? z5f|8+LV8P62#t46JJ!9 Z-mGz3^yt{K<3)^_ULLdDPfwLA{|#xD{mB3T literal 0 HcmV?d00001 diff --git a/theme/extra/templates/navbar_links.html b/theme/extra/templates/navbar_links.html new file mode 100644 index 0000000000..f510ef33fe --- /dev/null +++ b/theme/extra/templates/navbar_links.html @@ -0,0 +1,25 @@ +@require(page) + +