टेम्पलेट¶
टेम्पलेट प्रस्तुति तय करता है; स्रोत के पाठ की नकल नहीं करता। Guidedog HTML के लिए Jinja और PDF के लिए Typst इस्तेमाल करता है।
Guidedog के टेम्पलेट परियोजना की सामान्य फ़ाइलें हैं, जिन्हें सीधे देखा और संपादित किया जा सकता है। guidedog quickstart काम में आने वाले टेम्पलेट परियोजना में ही लिखता है:
_templates/layout.htmlमें Jinja से HTML साइट की संरचना तय होती है।_templates/book.typमें Typst से PDF पुस्तक की पृष्ठ-सज्जा, अक्षर-विन्यास और आवरण तय होते हैं।_static/guidedog.cssऔर_static/guidedog.jsडिफ़ॉल्ट स्टाइल और ब्राउज़र के व्यवहार देते हैं।
टेम्पलेट बाहरी पैकेज या बाइनरी कैश में छिपे नहीं रहते; वे परियोजना में होते हैं। उन्हें संपादित करें, guidedog build से दोबारा बनाएँ और guidedog serve से देखें।
HTML टेम्पलेट¶
Guidedog अंतर्निहित Jinja इंजन से मुख्य layout.html टेम्पलेट रेंडर करता है। पूरा लेआउट एक बड़ी फ़ाइल में रखना ज़रूरी नहीं है। इसे छोटे टेम्पलेट, मैक्रो लाइब्रेरी और कई स्तरों की इनहेरिटेंस में बाँट सकते हैं।
मॉड्यूलर टेम्पलेट संरचना¶
templates_path के फ़ोल्डरों में टेम्पलेट को कई फ़ाइलों और उपफ़ोल्डरों में रख सकते हैं। डिफ़ॉल्ट मान ["_templates"] है:
my-docs/
├── conf.toml
├── index.rst
└── _templates/
├── layout.html
├── base.html
├── partials/
│ ├── header.html
│ ├── navigation.html
│ ├── searchbox.html
│ └── footer.html
└── macros/
└── components.html
Guidedog templates_path के सभी फ़ाइल और उपफ़ोल्डर खोजता है। शामिल या इम्पोर्ट करने का पथ इन्हीं फ़ोल्डरों के सापेक्ष होता है:
{% extends "base.html" %}
{% block header %}
{% include "partials/header.html" %}
{% endblock %}
{% block footer %}
{% include "partials/footer.html" %}
{% endblock %}
Jinja मैक्रो भी अलग फ़ाइलों में परिभाषित करके ज़रूरत की जगह इम्पोर्ट कर सकते हैं:
{% macro badge(label, type="info") %}
<span class="badge badge-{{ type }}">{{ label }}</span>
{% endmacro %}
{% import "macros/components.html" as ui %}
{{ ui.badge("New", type="success") }}
!layout.html से थीम इनहेरिट करना¶
डिफ़ॉल्ट थीम के कुछ हिस्से बदलने के लिए पूरा पृष्ठ दोबारा लिखना ज़रूरी नहीं है। Sphinx वाली विस्मयादिबोधक सिंटैक्स से अंतर्निहित लेआउट इनहेरिट कर सकते हैं:
{# Inherit Guidedog's built-in layout #}
{% extends "!layout.html" %}
{# Inject custom metadata or web fonts into the document head #}
{% block extrahead %}
{{ super() }}
<link rel="stylesheet" href="{{ pathto('_static/custom.css', 1) }}">
{% endblock %}
{# Replace or extend the footer with custom content #}
{% block footer %}
{% include "partials/footer.html" %}
{% endblock %}
{% extends "!layout.html" %} या {% extends "basic/layout.html" %} से लोडर मूल थीम का टेम्पलेट पढ़ता है, परियोजना की _templates/layout.html को बार-बार नहीं पढ़ता।
बदले गए ब्लॉक में {{ super() }} बुलाने से मूल ब्लॉक का पाठ मिलता है। उसकी नकल किए बिना पहले या बाद में सामग्री जोड़ सकते हैं।
लेआउट ब्लॉक¶
अंतर्निहित layout.html में Sphinx की परंपरा के अनुसार ब्लॉक परिभाषित हैं:
| ब्लॉक | उद्देश्य |
|---|---|
doctype |
दस्तावेज़ प्रकार की घोषणा। डिफ़ॉल्ट <!DOCTYPE html> है। |
htmltitle |
<head> के भीतर <title> तत्व। |
linktags |
नेविगेशन और मेटा लिंक: favicon, index, search, prev, next। |
css |
स्टाइलशीट लिंक और इनलाइन CSS के मूल चर। |
scripts |
खोज इंडेक्स और इंटरैक्टिव सुविधाओं वाले JavaScript टैग। |
extrahead |
फ़ॉन्ट, विश्लेषण या अपने मेटा टैग जोड़ने के लिए <head> के अंत की जगह। |
header |
मुख्य नेविगेशन से ठीक पहले का हेडर स्थान। |
relbar1 |
नाम, संस्करण, खोज और थीम बदलने वाली ऊपरी नेविगेशन पट्टी। |
rootrellink |
संबंधित लिंक से पहले नेविगेशन में जोड़ने की जगह। |
relbaritems |
नेविगेशन पट्टी में अपने अतिरिक्त आइटम। |
sidebar1 |
बाईं नेविगेशन पट्टी का कंटेनर। |
sidebartoc |
sidebar1 के भीतर विषय-सूची का नेविगेशन ट्री। |
breadcrumbs |
मुख्य पाठ के ऊपर क्रमबद्ध नेविगेशन पथ। |
document |
मुख्य पाठ को घेरने वाला कंटेनर। |
body |
वर्तमान दस्तावेज़ का रेंडर किया HTML पाठ, {{ body }}। |
relbar2 |
पिछले और अगले अध्याय के लिंक वाला निचला नेविगेशन। |
footer |
कॉपीराइट, अद्यतन समय और स्रोत लिंक वाला पादलेख। |
sidebar2 |
वर्तमान पृष्ठ की रूपरेखा दिखाने वाली दाईं पट्टी। |
टेम्पलेट खोजना¶
Guidedog conf.toml के templates_path वाले फ़ोल्डर क्रम से खोजता है, फिर अंतर्निहित टेम्पलेट देखता है। नाम इन फ़ोल्डरों के सापेक्ष होते हैं; .. से बाहर नहीं जा सकते।
templates_path की हर फ़ाइल और उपफ़ोल्डर बिल्ड की निर्भरता है। टेम्पलेट जोड़ने, बदलने या हटाने पर guidedog build और guidedog serve बदलाव पहचानकर साइट दोबारा रेंडर करते हैं।
पृष्ठ के वेरिएबल¶
Sphinx के मौजूदा वेरिएबल नाम Guidedog भी रखता है, जिससे थीम के कुछ हिस्से लाए जा सकते हैं।
| वेरिएबल | मान |
|---|---|
body |
HTML में दस्तावेज़। |
title |
दस्तावेज़ का शीर्षक। |
pagename, docname |
दस्तावेज़ का नाम, जैसे usage/install। दस्तावेज़ न होने वाले पेज पर docname खाली और pagename पेज नाम है: Sphinx की तरह genindex, py-modindex, search या टेम्पलेट पेज का नाम। |
toc |
विषय-सूची वृक्ष से बना HTML नेविगेशन। |
outline |
दस्तावेज़ के खंड HTML में; खंड न हों तो खाली। |
prev, next |
पढ़ने के क्रम में पड़ोसी पृष्ठ, url (या link) और title सहित; आरंभ और अंत में पड़ोसी नहीं होता। |
project, version, release, copyright, language |
इसी नाम के विकल्प। |
html_title, docstitle |
html_title; डिफ़ॉल्ट “<project> <release> documentation”। |
html_short_title, shorttitle |
html_short_title. |
root_doc, master_doc |
रूट दस्तावेज़ का नाम। |
pathto_root |
पृष्ठ से साइट के रूट का पथ, जैसे ../। |
root_url, search_url, genindex_url |
रूट पृष्ठ, खोज पृष्ठ और सामान्य इंडेक्स के लिंक। |
css_files, js_files |
url वाली फ़ाइलों की सूची: पहले Guidedog की, फिर html_css_files और html_js_files। |
logo_url, favicon_url |
_static के भीतर html_logo और html_favicon; न दिए हों तो खाली। |
accent |
थीम का रंग html_theme_options.accent। |
sourcelink_url |
स्रोत दिखाने पर _sources के भीतर दस्तावेज़ का स्रोत; अन्यथा खाली। |
last_updated |
html_last_updated_fmt हो तो उस रूप में बिल्ड की तारीख़; अन्यथा खाली। |
show_copyright, show_sphinx, show_guidedog, has_source, show_source |
html_show_* और html_copy_source विकल्प। |
builder, file_suffix |
बिल्डर का नाम, जैसे html, और पृष्ठ का प्रत्यय। |
html_context की हर कुंजी |
मान और उसका प्रकार Sphinx के Python मानों जैसा है: false {% if %} में असत्य, संख्या संख्या, ऐरे सूची, और टेबल conf.toml के कुंजी क्रम वाला शब्दकोश है। guidedog migrate conf.py के html_context की लिटरल प्रविष्टियाँ लाता है। गणना से प्राप्त मान अपरिभाषित रहते हैं, जिन्हें टेम्पलेट असत्य पढ़ता है। |
pathto Sphinx का टेम्पलेट फ़ंक्शन है। pathto("usage/install") दस्तावेज़ पेज और pathto("_static/logo.svg", 1) साइट के नीचे फ़ाइल का URL देता है, वर्तमान पेज के सापेक्ष। singlehtml में दस्तावेज़ एक पेज का खंड है: पहला कॉल वहाँ #document-usage-install और खोज व सूचकांक पर index.html#document-usage-install देता है। genindex या टेम्पलेट पेज जैसे गैर-दस्तावेज़ नाम हर बिल्डर में साइट के मूल पेज हैं।
टेम्पलेट से बने पृष्ठ¶
html_additional_pages Sphinx की तरह केवल टेम्पलेट से पेज बनाता है। कुंजी पेज नाम है और मान templates_path का टेम्पलेट:
root_doc = "contents"
[html_additional_pages]
index = "indexcontent.html"
download = "download.html"
पेज टेम्पलेट आम तौर पर layout.html extend करके उसके ब्लॉक भरता है, ताकि रूप बाकी पेजों जैसा हो:
{% extends "layout.html" %}
{% block htmltitle %}<title>{{ shorttitle }}</title>{% endblock %}
{% block body %}
<h1>{{ docstitle|e }}</h1>
<p><a href="{{ pathto("tutorial/index") }}">Tutorial</a></p>
{% endblock %}
टेम्पलेट गैर-दस्तावेज़ पेज के चर पाता है: pagename पेज नाम (index), title और body खाली हैं। pathto, toc, toctree() और html_context वैसे ही काम करते हैं। html, dirhtml और singlehtml हर बिल्ड में मूल पर <name>.html (html_file_suffix) लिखते हैं। टेम्पलेट या templates_path की किसी फ़ाइल का बदलाव सभी पेज फिर बनाता है।
पृष्ठ कहाँ जाता है और Sphinx से कहाँ अलग है:
- समान नाम का पेज दस्तावेज़ की जगह लेता है, जैसे Sphinx में अंत में लिखा जाता है।
index = "landing.html"सेindex.htmlलैंडिंग पेज होता है; विषय-सूची फिर भीindex.rstसे आती है। singlehtml में मूल एकल पेज रहता है, टेम्पलेट पेज नहीं लिखा जाता और चेतावनी आती है। dirhtmlपेजgenindex.htmlऔरsearch.htmlके पासdownload.htmlमें लिखता है; Sphinxdownload/index.htmlलिखता है।pathto("download")उसी फ़ाइल का पथ देता है।- नाम साइट के मूल का फ़ाइल नाम हो। लिंक मूल से बनते हैं, इसलिए
"sub/page"चेतावनी (build.additional_page) के साथ अस्वीकार है।genindexजैसा मौजूद नाम भी अस्वीकार है; Sphinx वहाँ एक पेज पर दूसरा लिख देता है। guidedog migrateconf.pyसेhtml_additional_pagesलाता है।
त्रुटियाँ¶
टेम्पलेट की गलती बिल्ड रोकती है और फ़ाइल, पंक्ति संख्या, पंक्ति तथा सुझाव दिखाती है:
TEMPLATE ERROR template.error
_templates/base.html:1
No filter named 'defualt'.
Did you mean the filter 'default'?
अपरिभाषित वेरिएबल Jinja की तरह खाली दिखता है।
अनियंत्रित टेम्पलेट भी क्रैश नहीं, त्रुटि से रुकते हैं: 100 से अधिक syntax स्तर (कोष्ठक, टैग, ऑपरेटर, फ़िल्टर या elif कड़ी), 200 से अधिक मैक्रो, include या recursive लूप स्तर, अथवा 512 KiB से अधिक recursion स्टैक। खुद को रखने वाली सूची Python की तरह [...] दिखती है।
PDF टेम्पलेट¶
PDF पुस्तक Typst से सजती है। _templates/book.typ सामान्य Typst फ़ाइल है जो book फ़ंक्शन देती है। Guidedog पुस्तक सोर्स इस रूप में लिखता है:
#import "/_templates/book.typ": book
#show: book.with(title: ..., author: ..., version: ..., date: ...,
lang: ..., paper: ..., numbering: ..., logo: ...)
// the chapters, one per document of the root toctree
इसलिए किताब का रूप तय करने वाली हर चीज़ उसी फ़ाइल में है: फ़ॉन्ट, पृष्ठ और हाशिए, शीर्षक, शीर्षक पृष्ठ, पृष्ठ शीर्ष और विषय-सूची।
पैरामीटर¶
| पैरामीटर | मान |
|---|---|
title |
pdf_documents का title; अन्यथा project। |
author |
किताब का author; अन्यथा author विकल्प। |
version |
release. |
date |
|today|: दिया गया today; अन्यथा today_fmt में बिल्ड की तारीख़। |
lang |
language. |
paper |
"a4"; pdf_paper_size letter हो तो "us-letter"। |
numbering |
toctree में numbered हो तो true। |
logo |
pdf_logo का पथ; न दिया हो तो अनुपस्थित। |
copyright |
अंतिम प्रकाशन टिप्पणी के लिए copyright; इसे स्वीकारने वाले टेम्पलेट को ही दिया जाता है। |
body |
अध्यायों की सामग्री। |
टेम्पलेट डिफ़ॉल्ट वाले नए पैरामीटर जोड़ सकता है। quickstart में accent, फ़ॉन्ट serif, sans, mono, पाठ size और page-ref हैं। अंतिम को n => [p. #n] जैसे फ़ंक्शन से सेट करने पर दूसरे पेज के संदर्भ के साथ पेज नंबर आता है।
मॉड्यूलर Typst टेम्पलेट¶
Typst में भी एक ही फ़ाइल की सीमा नहीं है। शैली, मैक्रो और आवरण को _templates/ की अलग .typ फ़ाइलों में बाँटें और #import तथा #include से जोड़ें:
#import "cover.typ": title-page
#import "typography.typ": apply-styles
#let book(
title: "",
author: "",
version: "",
date: "",
lang: "en",
paper: "a4",
numbering: false,
logo: none,
body,
) = {
apply-styles()
title-page(title: title, author: author, version: version, logo: logo)
body
}
टेम्पलेट क्या इस्तेमाल कर सकता है¶
- Typst पैकेज
-
#import "@preview/cetz:0.4.2"जैसे पैकेज चलते हैं और पहली बार डाउनलोड होते हैं। केवल डिस्क के पैकेज से बनाने के लिएpdf_packages = "offline"सेट करें। - फ़ॉन्ट
-
typstकी तरह सिस्टम फ़ॉन्ट उपलब्ध हैं।pdf_font_pathsसे फ़ोल्डर जोड़ें, याpdf_fonts = "embedded"से केवल Typst के अंतर्निहित फ़ॉन्ट चुनें, ताकि पुस्तक बाइट-दर-बाइट दोहराई जा सके। - प्रीऐम्बल
-
pdf_preambleउस Typst फ़ाइल का नाम है जो#show: bookके बाद आती है। अपना टेम्पलेट बनाए बिना कुछsetऔरshowनियम देने के लिए ठीक है। - दस्तावेज़ में Typst
-
दस्तावेज़ reStructuredText और Markdown हैं; Typst फ़ाइलें दस्तावेज़ नहीं। पुस्तक में Typst मार्कअप देने के लिए raw ब्लॉक लिखें, जिसे वेब पेज छोड़ देते हैं:
.. raw:: typst #align(center)[#text(size: 14pt)[Only in the book]]
.. only:: pdfभी सामान्य सामग्री केवल किताब में रखता है।
Typst की त्रुटि पर बिल्ड फ़ाइल और पंक्ति बताता है, चाहे टेम्पलेट में हो या बनी पुस्तक में। हर PDF का सोर्स _build/pdf/sources/<pdf-filename>.typ है; reference-en.pdf का sources/reference-en.pdf.typ। एक पुस्तक वाला बिल्ड _build/pdf/book-<language>.typ की जाँच प्रति भी रखता है। विफलता कुछ प्रकाशित नहीं करती; सोर्स त्रुटि में बताए _build/.doctrees/failed पथ पर रहता है। कई पुस्तकों के विफल सोर्स अलग हैं।
नया टेम्पलेट लिखना¶
quickstart के टेम्पलेट से शुरू करें; उनमें हर हिस्से का उपयोग है:
- डिफ़ॉल्ट स्टाइलशीट वाला
layout.htmlमार्कअप रखें या उसके साथ_static/guidedog.cssभी बदलें। - दोहराए हिस्से अलग फ़ाइल में ले जाकर
includeकरें, याbase.htmlबनाकरlayout.htmlमेंextendsकरें। - किताब के लिए
bookके नियम बदलें या उसी नाम और पैरामीटर का नया फ़ंक्शन लिखें।
संपादन में guidedog serve से प्रीव्यू देखें। स्रोत सहेजकर ब्राउज़र रिफ़्रेश करें; सर्वर बदले इनपुट फिर बिल्ड करके पृष्ठ भेजता है।