مولد الموقع الثابت الصغير الذي يتم إعادة تحميله من الصدفة. يفترض باش 4.4+.
تحذير: هنا يكون الياك!
مهمة shite
هي مساعدتي في إنشاء موقع الويب الخاص بي: https://evalapply.org وبالتالي، فإن نطاق shite
ومجموعة الميزات (الخاطئة) والتلميع سيكون دائمًا على مستوى الإنتاج، حيث يكون الإنتاج "يعمل على أجهزتي (أجهزتي) )" :)
جدول المحتويات
حسنا، يهدف shite
إلى إنشاء مواقع الويب.
إنه نظام نشر أولي مصنوع من مسارات عمل متدفقة، مدفوعًا بشكل اختياري بتدفقات من أحداث الملف (للبتات الساخنة لإعادة التحميل).
لن يكون ذلك مفاجئًا لقراصنة لغة Perl/PHP النبيل من القرن الماضي.
إنه موجود لأن المرء يطلق صفيرًا بألحان سخيفة ويحلق ثيران الياك.
هذا هو ما تفعله بشكل أساسي (المرجع: وظيفة shite_templating_publish_sources
).
cat " ${watch_dir} /sources/ ${url_slug} " |
__shite_templating_compile_source_to_html ${file_type} |
__shite_templating_wrap_content_html ${content_type} |
__shite_templating_wrap_page_html |
${html_formatter_fn} |
tee " ${watch_dir} /public/ ${slug} .html "
# The complete "business logic" is 300-ish lines as of this comment,
# counted as all lines except comments and blank lines.
grep -E -v " s?#|^$ "
./bin/{events,metadata,templating,utils,hotreload}.sh |
wc -l
قبل أن تصبح متحمسًا للغاية، هل لي أن أحذرك من أن ترخيص معهد ماساتشوستس للتكنولوجيا يعني أنني لن أهتم إذا فشل صانع الهراء الصغير هذا في تنفيذ أعمالك الهراء. المساهمة مليئة بمزيد من التحذيرات.
وأخيرًا وليس آخرًا، أقرر بموجب هذا أن تتم قراءة جميع النصوص الواردة هنا بلغة شون كونري.
في أحلامي shite
أرغب...
قبل كل شيء، يجب أن نبقيه ("منطق الأعمال") صغيرًا . صغير بما يكفي للتخزين المؤقت والتصحيح وإعادة البناء في رأسي.
للتثبيت والاستخدام دون إذن المستخدم المتميز.
لتجنب سلاسل الأدوات للغاية وبناء التبعيات. لا توجد جواهر / npms / venvs / ماذا لديك. وهكذا فإن باش هي اللغة، لأن باش موجود في كل مكان. والحزم القياسية مثل pandoc
أو tidy
، عندما يحتاج المرء إلى وظائف متقدمة محددة .
قوالب خالية من التبعية مع مجموعة HTML عادية في مستندات جيدة.
نظام بسيط للبيانات الوصفية، ومساحة اسم المحتوى، وتنظيم الأصول الثابتة وما إلى ذلك.
خادم الويب اختياري (أو أي نوع من عمليات الخادم في هذا الشأن). نحن نهدف إلى المواقع الثابتة، التي تعمل بشكل جيد مع file://
navigation.
لبنائها من أجزاء صغيرة، قابلة للتركيب، وظيفية بحتة، تشبه أداة يونكس، لأنني أحب هذا النوع من الأشياء كثيرًا.
لأمنح نفسي سير عمل سلسًا يشبه REPL، التحرير والحفظ والإنشاء والمعاينة.
لقد قمت بإعادة تشغيل التدوين عن طريق الخطأ بعد انقطاع طويل. قبل أن أتمكن من إدخال الكلمات إلى السحابة، كنت أتعامل مع مولدات المواقع الثابتة "الحديثة". لأن WordPress ينتمي إلى القرن الماضي (أو هكذا قلت لنفسي). ثم انزعجت من تصميم SSG Jamstack المصمم حسب الطلب وما إلى ذلك من السحر. الآن أنا على الطريق المظلم للقيام بذلك. يتم التدوين عنه على: Shite: مواقع ثابتة من Shell: الجزء 1/2
أستخدم برنامج "shite" بشكل أساسي في وضع "hotreload"، وذلك بشكل أساسي لكتابة المنشورات (في الوضع التنظيمي) ومعاينتها المباشرة (في Firefox). بشكل أقل أهمية، للمعاينة السريعة لتعديلات الأنماط و/أو قوالب الصفحات. على الأقل، بعد العمل على منشور ما بشكل لا نهائي، أستخدمه في وضع "عدم إعادة التحميل السريع" لإجراء إعادة بناء الموقع بالكامل.
الأمثلة التجريبية القرف أدناه.
هذا يعني بشكل أساسي أنه إذا قمت بإنشاء أو تحديث أو حذف أي ملف ضمن sources
، فيجب ترجمته تلقائيًا إلى HTML، ونشره محليًا public
، والتسبب في التنقل المناسب للصفحة أو إجراء إعادة التحميل في متصفح الويب، حيث يكون موقعي مفتوحًا.
اتصل بالبرنامج النصي "الرئيسي" في جلسة طرفية جديدة نظيفة أو جزء tmux.
./shite.sh
من المفيد أن يفتح ملف الفهرس في Firefox، وفقًا للإعدادات الافتراضية التي قمت بتعيينها في مصفوفة shite_global_data
في ./shite.sh
.
في Emacs أو Vim، افتح بعض ملفات المحتوى ضمن sources
. قم بتحرير المحتوى وحفظه ومشاهدته وهو يظهر في المتصفح. (نعم، يعد تحديد Emacs/Vim أمرًا غبيًا، لأنني أقوم بتشغيل إجراءات سريعة بناءً على أحداث inotify. ويبدو أن المحررين المختلفين يقومون بتحديث الملفات بشكل مختلف. أنا أستخدم Emacs أو Vim، لذلك أراقب الأحداث التي تسببها، لذلك يعمل على جهازي. : )).
كثيرًا ما يتذكر المتصفح موضع التمرير، وهو أمر أنيق. في بعض الأحيان يكون التحميل الساخن أمرًا سيئًا. لذلك قمت بالضغط على مسافة وحفظ ملف المحتوى لتشغيل عملية التحميل السريع مرة أخرى.
انتقل إلى بعض الأصول الثابتة، مثل ورقة أنماط CSS. تغيير شيء ما، مثل قيمة لون الخلفية. احفظ وشاهد تغير اللون في المتصفح.
قم بتعديل بعض أجزاء القالب في templates.sh
--- على سبيل المثال، قالب منشور المدونة. ثم قم بالتبديل إلى بعض ملفات محتوى منشور المدونة وقم بتعديله لبدء إنشاء الصفحة باستخدام القالب المعدل (على سبيل المثال، اضغط على مسافة واحفظ).
هذا هو الاختراق. تعتبر صفحة Index.org الجذرية ضمن المصادر خاصة. إذا قمت بتعديله، فهذا يعني أنني أريد إعادة إنشاء قوائم المنشورات لصفحة الفهرس، وللعلامات، وكذلك إعادة بناء ملفات التعريف ذات الصلة مثل موجز RSS، وخريطة الموقع، وملف robots.txt وما إلى ذلك.
في جلسة طرفية جديدة ونظيفة، اتصل بـ shite.sh
باستخدام "no"، واختياريًا باستخدام base_url
الخاص ببيئة النشر:
إعادة بناء الموقع الكامل للملف "المحلي":/// navigation. حقا "بدون خادم" :)
./shite.sh " no "
إعادة بناء الموقع بالكامل للنشر ضمن نطاقي.
./shite.sh " no " " https://evalapply.org "
تغير هذه العلامات سلوك النظام.
SHITE_BUILD
على "ساخن" إلى تشغيل نظام الأحداث في وضع "الشاشة"، والذي بدوره يؤدي إلى سلوك إعادة التحميل السريع. سيؤدي تعيينه على "لا" إلى منع التحميل السريع للمتصفح.SHITE_DEBUG_TEMPLATES
إلى "تصحيح الأخطاء" إلى تحديد مصدر القوالب أولاً، قبل نشر أي محتوى مصدر نموذجي. shite
هو Unixy تماما في الداخل. أو هكذا أود أن أفكر.
الكود هو أسلوب برمجة وظيفي Bash. كل شيء هو وظيفة. معظم الوظائف هي وظائف خالصة --- أدوات يونكس صغيرة في حد ذاتها. معظم المنطق موجه نحو خطوط الأنابيب. يعمل هذا بشكل جيد بشكل مدهش، لأن Shell ليست مكانًا سيئًا لـ FP.
أردت أيضًا تجربة تفاعلية حية تشبه تجربة REPL عند الكتابة باستخدام shite
، لأنني أحب العمل في أوقات التشغيل المباشرة/التفاعلية مثل Clojure وEmacs.
لذلك، shite
هذا النظام التفاعلي بالكامل القائم على الأحداث قادرًا على البناء وإعادة التحميل عند الحفظ.
هناك ثلاثة مساحات أسماء للدليل الرئيسي:
sources
التي تحتوي على المحتوى "المصدر"، مثل منشورات المدونة المكتوبة في orgmode، بالإضافة إلى CSS وJavascript والأصول الثابتة الأخرى.public
للمصنوعات اليدوية المترجمة/المبنيةbin
لرمز بناء القرف يتبع نظام تسمية URL بنية الدليل الفرعي ضمن sources
، ويتم نسخه كما هو ضمن بنية الدليل pubilic
. نظرًا لأن هذا عبارة عن نظام تباعد أسماء عناوين URL قياسي، فإنه ينطبق أيضًا مباشرةً على المحتوى المنشور. مثل ذلك:
file:///absolute/path/to/shite/posts/slug/index.html
http://localhost:8080/posts/slug/index.html
https://your-domain-name.com/posts/slug/index.html
يتم وضع مسافة اسم لجميع الوظائف "العامة" كـ shite_the_func_name
. يتم تحديد مساحة الاسم لجميع الوظائف "الخاصة" كـ __shite_the_func_name
.
وظائف موجودة ل:
في جلسة طرفية جديدة ونظيفة:
source ./bin/utils_dev.sh
shitTABTAB
أو __shiTABTAB
في سطر الأوامر للإكمال التلقائي.type -a func_name
لطباعة تعريف الوظيفة وقراءة واجهة برمجة التطبيقات (API) الخاصة بها.shite_global_data
و shite_page_data
حسب الحاجة. توجد قوالب لأجزاء الصفحة (مثل الرأس والتذييل والتنقل) ولتعريفات الصفحة الكاملة (مثل قالب الصفحة الافتراضي). تتم كتابتها بتنسيق HTML عادي ملفوف في المستندات. ./bin/templates.sh
يوفر هذه.
يتم ملء النماذج ببيانات متغيرة من مصادر مختلفة:
shite_global_data
على بيانات تعريف على مستوى الموقع، وتحتوي shite_page_data
على بيانات تعريف خاصة بالصفحة. يجب أن تقوم بعض العمليات الخارجية بضبط هذه المصفوفات مسبقًا قبل معالجة أي صفحة.على سبيل المثال، يمكن إنشاء صفحة كاملة على النحو التالي:
cat ./sample/hello.md |
pandoc -f markdown -t html |
cat << EOF
<!DOCTYPE html>
<html>
<head>
$( shite_template_common_meta )
$( shite_template_common_links )
${shite_page_data[canonical_url]}
</head>
<body ${shite_page_data[page_id]} >
$( shite_template_common_header )
<main>
$( cat - )
</main>
$( shite_template_common_footer )
</body>
</html>
EOF
يتم تعريف نظام البيانات الوصفية الخاص بـ shite
على أنه أزواج قيمة المفتاح. تقوم المفاتيح بتسمية عناصر البيانات التعريفية، وستكون مرتبطة بأي قيمة من هذا النوع. الأمثلة أدناه.
كما ذكرنا سابقًا، يتم نقل بيانات تعريف وقت التشغيل في البيئة بواسطة المصفوفات الترابطية shite_global_data
و shite_page_data
. ربما يتم ملؤها عن طريق البناء المباشر، وكذلك تحديثها من مصادر خارجية.
يجوز لكل صفحة تحديد البيانات الوصفية الخاصة بها في "الموضوع الأمامي" أعلى الصفحة. سيتم استخدام هذا بالإضافة إلى بيانات تعريف الصفحة المستمدة من مصادر أخرى.
يتوقع shite
منا أن نكتب المادة الأمامية باستخدام بناء الجملة المتوافق مع نوع المحتوى المحدد، على النحو التالي.
استخدم أسطر التعليق # SHITE_META
لتحديد البيانات التعريفية لنمط المؤسسة والتي يجب أيضًا shite
كبيانات تعريف خاصة بالصفحة.
# SHITE_META
#+title: This is a Title
#+slug: this/is/a/slug
#+date: Friday 26 August 2022 03:38:01 PM IST
#+tags: foo bar baz quxx
# SHITE_META
#+more_org_metadata: but not processed as shite metadata
#+still_more_org_metadata: and still not processed as shite metadata
* this is a top level heading
this is some orgmode content
#+TOC: headlines 1 local
** this is a sub heading
- this is a point
- this is another point
- a third point
اكتب مادة أمامية YAML بأسلوب Jekyll، محاصرًا بين ---
الفواصل.
---
TITLE : This is a Title
slug : this/is/a/slug
DATE : Friday 26 August 2022 03:38:01 PM IST
TAGS : foo BAR baz QUXX
---
# this is a heading
this is some markdown content
## this is a subheading
- this is a point
- this is another point
- a third point
يمكننا ببساطة استخدام علامات <meta>
القياسية التي تتوافق مع هذه الاتفاقية: <meta name="KEY" content="value">
.
< meta name =" TITLE " content =" This is a Title " >
< meta name =" slug " content =" this/is/a/slug " >
< meta name =" DATE " content =" Friday 26 August 2022 03:38:01 PM IST " >
< meta name =" TAGS " content =" foo BAR baz QUXX " >
< h1 > This is a heading </ h1 >
< p > This is some text </ p >
< h2 > This is a subheading </ h2 >
< p >
< ul >
< li > This is a point </ li >
< li > This is another point. </ li >
< li > This is a third point. </ li >
</ ul >
</ p >
هنا يكون ياك!
نظرًا لكوني مدللًا تمامًا بسير العمل التفاعلي المباشر الممتع بأسلوب Clojure/Lisp/Spreadsheet، فأنا أريد إعادة التحميل السريع والتنقل السريع في صنع الأشياء أيضًا.
ولكن لا يبدو أن هناك خادم/أداة مستقلة لتطوير الويب المباشر ولا تريد مني أيضًا تنزيل نصف الإنترنت المعروف كتبعيات. كما قلت من قبل، وهو الشيء الذي لا أريد أن أفعله على الإطلاق .
قام DuckSearch بتسليم وضع Emacs بفارغ الصبر، وهو أمر ساخن للغاية، لكنني لا أرغب في ربط جهاز Emacs هذا. ولحسن الحظ، فقد قدمت أيضًا هذه الفكرة الرائعة التي تتضمن "inotify-tools" و"xdotool": github.com/traviscross/inotify-refresh
نسخة ساخنة!
لأنه ما الذي يمكن أن يكون أكثر سخونة من جهاز الكمبيوتر الخاص بي الذي يضغط على مفتاح F5 بالنسبة لي؟ كما لو كان يعرف ما أريده حقًا في أعماق قلبي.
النظام الفرعي للحدث متعامد مع كل شيء آخر، ويتكون مع بقية النظام.
التصميم عبارة عن بنية تدفق قياسية مستنقعية ، أي. راقب أحداث نظام الملفات، ثم قم بتصفيتها وإلغاء تكرارها وتحليلها وتوجيهها (نقطة الإنطلاق) إلى معالجات أحداث مختلفة. يوجد حاليًا معالجان فقط من هذا النوع؛ أحدهما لتجميع ونشر الصفحة أو الأصل المرتبط بالحدث، والآخر لإعادة تحميل المتصفح (أو التنقل السريع) اعتمادًا على نفس الحدث.
بشكل أساسي هذا:
# detect file events
__shite_detect_changes ${watch_dir} ' create,modify,close_write,moved_to,delete ' |
__shite_events_gen_csv ${watch_dir} |
# hot-compile-and-publish content, HTML, static, etc.
tee >( shite_templating_publish_sources > /dev/null ) |
# browser hot-reload
tee >( __shite_hot_cmd_public_events ${window_id} ${base_url} |
__shite_hot_cmd_exec )
الأحداث هي ببساطة مجموعة من سجلات CSV منظمة على النحو التالي:
unix_epoch_seconds,event_type,base_dir,sub_dir,url_slug,file_type,content_type `
نستخدم أجزاء مختلفة من سجل الحدث لإحداث أنواع مختلفة من الإجراءات.
يحاول البرنامج النصي inotify-refresh المرتبط مسبقًا تحديث مجموعة من نوافذ المتصفح بشكل دوري . ومع ذلك، نريد أن نكون متحمسين للغاية . يجب أن يقوم أي إجراء تحرير على ملفات المحتوى و/أو الأصول الثابتة الخاصة بنا بتشغيل إجراءات إعادة التحميل/التنقل السريع في علامة تبويب المتصفح التي تعرض موقعنا.
نريد تحديد سيناريوهات إعادة التحميل المميزة: مجموعات حصرية متبادلة وشاملة بشكل جماعي يمكننا من خلالها تعيين أحداث الملف التي نريد مراقبتها.
إذا فعلنا ذلك، فيمكننا تصميم التحديثات كنوع من سجل الكتابة المسبق، وتثقيب الأحداث من خلال مسار التحليل، وربطها بسيناريو المطابقة التامة، ثم التسبب في الإجراء في النهاية. على سبيل المثال:
قم بتحديث علامة التبويب الحالية عندما
العودة إلى المنزل عندما
انتقل إلى المحتوى متى
نظرًا لأننا نجعل الكمبيوتر يحاكي إجراءات لوحة المفاتيح الخاصة بنا، فيمكن أن يعبث بإجراءاتنا الشخصية. إذا التزمنا بكتابة ما نريده في محرر النصوص الخاص بنا، وتركنا الكمبيوتر يقوم بعملية إعادة التحميل الساخنة، فيجب أن نبقى غير منزعجين.
هناك العديد من الياك في العالم.
للحصول على موجو نشر متعدد المواقع منتشر حقًا:
shite
متاحًا على PATH الخاص بيهذا ياك صغير. ربما سأقوم بحلاقة هذا قريبا.
من الواضح أنه يمكن للمرء استخدام وظائف CI لمضيفي git المشهورين لتحفيز إنشاءات shite
. ولكن لماذا نستخدم تكنولوجيا القرن الحالي القديمة، في حين أننا قد تقدمنا بالفعل إلى أحدث ما توصلت إليه التكنولوجيا في أواخر القرن العشرين... البث الكامل والتفاعل الكامل؟
بغض النظر عن السخرية، لا أفهم سبب عدم إمكانية استخدام نفس نظام الأحداث لإضافة دعم النشر السريع على جهاز بعيد أقوم بتشغيله.
على المربع البعيد:
sources
الموقعsources
(مطروحًا منها مشاهدة المتصفح).على صندوقي المحلي:
https://mydomain.com/posts/hello/index.html
افعل شيئًا ما عبر SSH لإعادة تحديث المتصفح إلى المربع المحلي، في حالة النشر السريع إلى خادم بعيد.
ربما بعض سيناريو إعداد/تفكيك وقت "Dev-ing/Drafting"؟ ربما وظيفة "dev_server" التي نستخدمها لبدء جلسة كتابة جديدة؟
إذا قطعت كل هذه المسافة إلى هنا، ومازلت تريد المساهمة...
لماذا؟
لماذا باسم كل ما هو مقدس وصالح، هل تريد أن تفعل ذلك؟ أليس من الواضح بشكل واضح أن هذا هو عمل أبله؟ ألم تسمع أن Bash ليست حتى لغة برمجة حقيقية؟ أليس من الواضح أن العلاقات العامة الخاصة بك سوف تضعف إلى الأبد، وسوف تقع تعليقاتك في فراغ مجهول؟
نعم، إرسال التصحيحات فكرة رهيبة.
ولكن من فضلك أرسل لي آمالك وأحلامك عبر البريد الإلكتروني بشأن صانع القرف الخاص بك! قرأت البريد الإلكتروني على الاسم الأول الخاص بي ونقطة اسم العائلة في Gmail.
معًا يمكننا صفير الألحان السخيفة، والمشاركة في حلاقة ثيران الثيران الخاصة بنا، بطرقنا الخاصة.
نرجو أن يكون المصدر معنا.
هذا العمل مرخص بشكل مزدوج بموجب ترخيص MIT وترخيص CC By-SA 4.0.
معرف ترخيص SPDX: mit OR cc-by-sa-4.0