{"id":13595814,"url":"https://github.com/novoid/lazyblorg","last_synced_at":"2025-04-05T07:03:00.977Z","repository":{"id":11292295,"uuid":"13704896","full_name":"novoid/lazyblorg","owner":"novoid","description":"Blogging with Org-mode for very lazy people","archived":false,"fork":false,"pushed_at":"2024-03-31T01:44:58.000Z","size":4901,"stargazers_count":419,"open_issues_count":55,"forks_count":35,"subscribers_count":12,"default_branch":"master","last_synced_at":"2025-03-29T06:02:54.022Z","etag":null,"topics":["blog","blog-engine","blogging","emacs","lazy","minimalistic","orgdown","orgmode","python","simple","simplicity","simplistic"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/novoid.png","metadata":{"files":{"readme":"README.org","changelog":null,"contributing":null,"funding":null,"license":"license.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2013-10-19T16:59:49.000Z","updated_at":"2025-03-21T22:34:58.000Z","dependencies_parsed_at":"2024-01-16T22:20:03.633Z","dependency_job_id":"1ee0744c-5a85-4a6d-bc3c-2ca63d064d64","html_url":"https://github.com/novoid/lazyblorg","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/novoid%2Flazyblorg","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/novoid%2Flazyblorg/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/novoid%2Flazyblorg/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/novoid%2Flazyblorg/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/novoid","download_url":"https://codeload.github.com/novoid/lazyblorg/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247299831,"owners_count":20916190,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["blog","blog-engine","blogging","emacs","lazy","minimalistic","orgdown","orgmode","python","simple","simplicity","simplistic"],"created_at":"2024-08-01T16:01:58.235Z","updated_at":"2025-04-05T07:03:00.947Z","avatar_url":"https://github.com/novoid.png","language":"Python","funding_links":[],"categories":["Python"],"sub_categories":[],"readme":"## -*- coding: utf-8;mode: org;  -*-\n## This file is best viewed with GNU Emacs Org-mode: http://orgmode.org/\n\n#+BEGIN_QUOTE\n«A designer knows he has achieved perfection not when there is nothing\nleft to add, but when there is nothing left to take away.» ([[https://en.wikipedia.org/wiki/Antoine_de_Saint-Exup%25C3%25A9ry][Antoine de\nSaint-Exupéry]])\n#+END_QUOTE\n\n* lazyblorg -- blogging with Org-mode for very lazy people\n\nThis is a web log (blog) environment for [[http://en.wikipedia.org/wiki/Emacs][GNU Emacs]] with [[http://orgmode.org/][Org-mode]]\nwhich generates static HTML5 web pages. It is much more superior to\nany other Org-mode-to-blog-solution I have seen so far!\n\n: \u003c(All?) your Org-mode files\u003e  --lazyblorg--\u003e  static HTML pages\n:                                                       |\n:                                                       v\n:                                  optional upload (shell) script\n:                                                       |\n:                                                       v\n:                                                  your web space\n\nThere is [[http://orgmode.org/worg/org-blog-wiki.html][a list of similar/alternative Org-mode blogging projects]]\nwhose workflows seem really tedious to me.\n\nSee [[http://article.gmane.org/gmane.emacs.orgmode/49747/][my original post to the Org-mode ML]] for how this idea of lazyblorg\nstarted in 2011.\n\nThis awesome piece of software is a sheer beauty with regard to:\n- simplicity of creating a new blog entry\n  - *I mean it*: there is no step which can be skipped!\n    - add heading+content anywhere, add ID, tag, invoke lazyblorg\n- integration into [[http://karl-voit.at/tags/pim/][my personal, published workflows]]\n  - here, you have to either adapt my totally awesome workflows or you\n    have to find alternative ways of doing following things:\n    - linking/including image files or attachments in general (I use [[https://github.com/novoid/Memacs/blob/master/docs/memacs_filenametimestamps.org][this Memacs module]])\n      - advantage of my method: I simply add an image file by typing\n        ~tsfile:2014-03-03-this-is-my-file-name.jpg~ in\n        double-brackets and I really don't care in which folder the\n        file is currently located on my system\n    - copying resulting HTML files to web-space (I do it using [[http://www.cis.upenn.edu/~bcpierce/unison/][unison]]/rsync)\n    - probably more to come\n\n** DISCLAIMER: This is a personal project\n\nI wrote lazyblorg to get a blogging system that works for me exactly\nthe way I need it. I did not write lazyblorg for the pleasure on the\ncoding process - I just wanted to get the resulting thing working in\norder to be able to blog the way I want to blog.\n\nTherefore, it's mostly *a works-for-me project*. *I won't add anything\nthat I don't use myself*.\n\nFor the same reason, *I won't accept pull requests for things like*:\n\n- Features I don't use myself.\n- Added complexity I don't want.\n- Features or dependencies I don't understand completely.\n- Stuff that might interfere with the way I'm using lazyblorg.\n\nIf you do want to adapt lazyblorg and implement your own features that\nconflict with the things listed above, I'd like to see you creating a\nfork of this project. If you drop me a line with a description how\nyour fork differs from the original, I'm glad to add it to this README\nfile.\n\nIf you think that your idea might be also a good one for me, you can\nalways hand in a pull request and I'll have a look if I'm willing to\nadd it. However, don't be disappointed if I don't. I want to keep the\ntime spent on lazyblorg at a minimum. My personal priority is visible\nin [[https://github.com/novoid/lazyblorg/issues][the lazyblorg issues]] where I introduced tags for [[https://github.com/novoid/lazyblorg/issues?q=is%3Aissue+is%3Aopen+label%3Apriohigh][high]] and [[https://github.com/novoid/lazyblorg/issues?q=is%3Aissue+is%3Aopen+label%3Apriolow][low\npriority]] things to implement.\n\n** Target group\n\nLazy users of [[http://orgmode.org/][Org-mode]] who want to do blogging very easily and totally\ncool.\n\nOr simply wannabes. I'm perfectly fine with this as long as they use\nlazyblorg.\n\n** Other people using lazyblorg\n\nPages using lazyblorg are listed [[https://karl-voit.at/tags/lazyblorg/][on my personal tag page on\n\"lazyblorg\"]]. Please do drop me a line when you want to get your page\nadded to the list.\n\nQuote from [[https://seppjansen.com/2018/04/24/site-using-lazyblorg/][Sepp Jansen]]:\n\n#+BEGIN_QUOTE\n[...]\n\nBut when I revisited lazyblorg after studying the other packages, it\nsuddenly seemed like a better solution. After only a short time of\nreading I figured out the entire templating and post generation\nsystem. Although not the most elegant, it is super simple and easy to\nunderstand. And those are my most important points.\n\nThe developer states that it is easy to configure and start building,\nand is absolutely right.\n\nIn just a few hours I went from installing dependencies to having a\nfully working website, including some layout and CSS customization.\nThe included HTML and CSS is easy to modify so I could (lazily) make\nthe site look like I wanted it to without too much digging in many\nlittle files. I even managed to make it look a lot like my old site\nwithout too much effort! Lazyblorg really lives up to its name!\n\n[...]\n\nI really like lazyblorg, and I'll happily manage [[https://seppjansen.com/][this website]] with it\nfor as long as possible.\n#+END_QUOTE\n\n** Skills necessary\n\n- modifying configuration settings, e.g., in script files\n- optional: creating scheduled tasks (cronjob, ...) if you\n  are a *really* lazy one (and if you trust lazyblorg to do its job in\n  the background)\n\n** System requirements\n:PROPERTIES:\n:CREATED:  [2014-03-14 Fr 13:24]\n:END:\n\nlazyblorg is written in *Python 3*.\n\nDevelopment platform is Debian GNU/Linux.\nSo with any decent GNU/Linux you should be fine.\n\nIt might work on OS X but I never tried it so far.\n\nI definitely does not work with Microsoft Windows.\nAlthough a programmer can add a couple of ~os.path.thisorthat()~ here and there\nand it should be good to go.\nPlease consider sending a pull-request if you are fixing this issue.\nThanks!\n\n** Version and Changelog\n:PROPERTIES:\n:CREATED:  [2014-03-14 Fr 13:28]\n:END:\n\nCurrently (2019-10-23), I consider lazyblorg in beta-status with\nversion 0.96 or so.\n\nI don't maintain a specific changelog. However, when there are\nsubstantial changes to lazyblorg, you will find [[https://karl-voit.at/tags/lazyblorg/][a blog article tagged\nwith \"lazyblorg\"]]. Use an RSS/Atom aggregator to follow the blog.\n\n** Why lazyblorg?\n\n*Minimum effort* for blogging.\n\nAnd: your blog entries can be written *anywhere in your Org-mode\nfiles*. They will be found by lazyblorg. :-)\n\nFurther advantages are listed below.\n\n** Example workflow for creating a blog entry\n\n1. write a blog entry *anywhere* in your Org-mode files\n   - With lazyblorg, you can, e.g., write a blog article about an\n     event as a sub-heading of the event itself!\n2. tag your entry with ~:blog:~\n3. add an unique ID in the PROPERTIES drawer\n   - You might want to use a package that automatically generates\n     unique IDs to your headings (I don't).\n   - You might want to take a look [[http://article.gmane.org/gmane.emacs.orgmode/16199][at this solution using file or\n     directory variables]].\n4. set the state of your entry to ~DONE~\n   - make sure that a ~:LOGBOOK:~ drawer entry will be created that\n     contains the time-stamp\n\nAn example blog entry looks like this:\n\n: ** DONE An Example Blog Post           :blog:lazyblorg:software:\n: CLOSED: [2017-06-18 Sun 00:16]\n: :PROPERTIES:\n: :ID: 2017-07-17-example-posting\n: :CREATED:  [2017-06-17 Sat 23:45]\n: :END:\n: :LOGBOOK:\n: - State \"DONE\"       from \"NEXT\"       [2017-06-18 Sun 00:16]\n: :END:\n:        […]\n: Today, I found out that…\n\nThat's it. lazyblorg does the rest. It feels like magic, doesn't it? :-)\n\n** Advantages\n\nThese things make a blogger a happy one:\n\n*No other Org-mode blogging system* I know of is able to process blog\nentries which are *scattered across all your Org-mode documents*\nexcept the usual org-export-based approaches.\n\n*No other Org-mode blogging system* I know of is able to generate a\nblog entry with that *minimum effort* to the author.\n\nYou do not need to maintain a specific Org-mode file that contains you\nblog posts only. [[http://www.tbray.org/ongoing/When/201x/2011/03/07/BNotes][*Create* blog posts]] *anywhere* in between your notes,\ntodos, contacts, ...\n\n\nAnd there are some technological advantages you might consider as well:\n\n- You don't need to write or correct HTML code by yourself.\n- produces static, state-of-the-art HTML5\n  - it's super-fast on delivery to browsers\n  - very low computing requirements on your web server: minimum of server load\n- No in-between format or tool.\n  - Direct conversion from Org-mode to HTML/CSS.\n  - dependencies have the tendency to cause problems when the\n    dependent tools change over time\n  - lazyblorg should be running fine for a long time after it is set\n    up properly\n- Decide by yourself how and where you are hosting your blog files\n  and log files.\n- you will find more advantages when running and using lazyblorg - I\n  am very confident about that ;-)\n\n** Disadvantages\n\nYes, there are some disadvantages. I am totally honest with you since we\nare becoming close friends right now:\n\n- lazyblorg *re-generates the complete set of output pages on every run*\n  - this will probably changed in a future release (to me: no high priority)\n  - most of the time this is not an issue at all\n    - if pages are generated on a different system as the web server\n      runs on, performance is a minor issue\n    - if you don't have thousands of pages, this will not take long\n\n- lazyblorg is implemented in Python:\n  - Its Org-mode parser supports *only a (large) sub-set of Org-mode syntax*\n    and features.\n    - Basic rule: use *an empty line between two different syntax\n      elements* such as paragraphs, lists, tables, and so on.\n    - Whenever I think that an additional Org-mode syntax element is\n      needed for my blog, I start thinking of implementing it\n    - I am using Pandoc as a fall-back for all other Org-mode syntax\n      elements which works pretty fine\n    - For a list of general Org-mode parsers please [[http://orgmode.org/worg/org-tools/][read this page]]\n\n- lazyblorg is using state-of-the art HTML5 and CSS3\n  - No old HTML4.01 transitional stuff or similar\n  - Results might not be compatible with browsers such as Internet\n    Explorer or mobile devices.\n    - tell your Internet Explorer friends that they should do\n      themselves a favor and switch to a real browser\n\n- You have to accept the one-time setup effort which requires\n  knowledge of:\n  - using command-line tools\n  - modifying configuration files\n  - summary: getting this beautiful thing to work in your environment\n\n** Features\n\n#+BEGIN_QUOTE\n«Technology develops from the primitive via the complex to the\nsimple.»\n#+END_QUOTE\n([[https://en.wikipedia.org/wiki/Antoine_de_Saint-Exup%25C3%25A9ry][Antoine de Saint-Exupéry]]; note: lazyblorg is currently \"primitive\"\nbut with a great outlook up to the status of being simple)\n\nHere is a selection of features of lazyblorg which helps you to blog\nefficiently:\n\n- Converts Org-mode To HTML5: lazyblorg supports [[https://github.com/novoid/lazyblorg/wiki/Orgmode-Elements][a (large sub-)set of\n  syntax elements of Org-mode]]\n  - also see FAQs for \"What Org-mode elements are supported by\n    lazyblorg?\"\n\n- Different [[https://github.com/novoid/lazyblorg/wiki/Page-Types][page types]] allow you to create:\n  1. articles related to a specific date ([[https://github.com/novoid/lazyblorg/wiki/Temporal-Pages][temporal pages]])\n     - Those articles are published and hardly updated.\n  2. articles not related to a specific date ([[https://github.com/novoid/lazyblorg/wiki/Persistent-Pages][persistent pages]])\n     - Frequent updates or the absence of any day-relation makes this\n       page type very sexy to use.\n  3. articles describing a tag you are using ([[https://github.com/novoid/lazyblorg/wiki/Tag-Pages][tag pages]])\n     - Yes, with lazyblorg, you are (optionally) able to explain how\n       you are using a certain tag. You can link your most important\n       tag-related articles and so forth. Most systems don't offer any\n       possibility to communicate the meaning of the tags used.\n  4. the [[https://github.com/novoid/lazyblorg/wiki/Entry-Page][entry page]] of your blog\n     - You gotta give them a starting page ;-)\n  5. the [[https://github.com/novoid/lazyblorg/wiki/Templates][templates]] which are used to generate your blog pages\n     - Hooray, you are able to define all templates of your blog\n       within Org-mode as well. No need to edit source code here.\n       Isn't this great?\n\n- To efficiently notify users of new articles or changes to existing\n  articles, lazyblorg generates [[https://github.com/novoid/lazyblorg/wiki/Feeds][RSS/ATOM feeds]].\n\n- Really fast to use [[https://github.com/novoid/lazyblorg/wiki/Links#linking-other-blog-articles-internal-links][linking to other blog articles]] using their ID property.\n\n- At the bottom of each article, there is a list of related articles\n  that back-link to here.\n\n- You can very easily [[https://github.com/novoid/lazyblorg/wiki/Images][embed image files]] with automatically scaling to\n  their desired width\n  - This feature is hardened against image file renaming and broken\n    links because of moving images files to different folders\n  - Users of [[https://github.com/novoid/Memacs][Memacs]] do have advanced possibilities here as well\n  - An optional image cache directory holds previously resized image\n    file and therefore prevents resizing effort for each run.\n\n- For navigating through the blog articles I do recommend using the\n  [[https://github.com/novoid/lazyblorg/wiki/Tag-Pages][tags]]. Articles related to one topic share common tags whereas a\n  date-oriented archive has only very limited use. The tag cloud which\n  is on the [[http://karl-voit.at/tags/][tag overview page]] offers a quick overview of your most used\n  tags.\n\n- There is a search feature which brings you to the content by\n  searching for keywords or phrases.\n\n- Easy embedding of [[https://github.com/novoid/lazyblorg/wiki/Embedding-External-Content][external content]] such as Tweets or YouTube videos.\n\n- You can exclude content from being published with various features:\n  1. [[https://github.com/novoid/lazyblorg/wiki/Comments][Comment lines]]\n  2. Mark an article/heading as hidden [[https://github.com/novoid/lazyblorg/wiki/Headings#headings-within-a-blog-article][using the tag NOEXPORT]]\n  3. The [[https://github.com/novoid/lazyblorg/wiki/Headings#tag-hidden][hidden tag]] does publish an article but hides it from\n     the entry page, navigational pages, and the feeds. This way, you\n     can publish pages who can only be access by people knowing its URL.\n\n- Reading time estimations (multi-language) following [[https://github.com/novoid/lazyblorg/issues/47][this feature request]]\n\n** FAQs\n\nSee https://github.com/novoid/lazyblorg/wiki/FAQs\n\n* Installing and Starting with lazyblorg\n\nI am using it for [[http://Karl-Voit.at][my own blog]] and therefore it gets more and more\nready to use as I add new features.\n\nWhat's working so far:\n- parsing a large sub-set of Org-mode\n  - most important: the parser requires a blank line between different\n    Org mode elements\n- parsing the HTML templates\n- generating HTML5 pages with [[https://github.com/novoid/lazyblorg/wiki/Org-mode-Elements][a sub-set of the sub-set of the Org-mode\n  syntax elements]]\n\n** External dependencies\n\nThe number of external dependencies is kept at a minimum.\n\nThis is a list of the most important dependencies:\n- [[http://werkzeug.pocoo.org/][Werkzeug]]\n  - for sanitizing path components\n  - I installed it on Debian GNU/Linux with ~sudo apt-get install python3-werkzeug~\n- pickle\n  - object serialization\n  - most likely: should be part of your Python distribution\n- pypandoc\n  - some Org-mode syntax elements are being converted using [[http://pandoc.org/][Pandoc]] and\n    its Python binding [[https://github.com/bebraw/pypandoc][pypandoc]]\n  - you can get it via ~sudo apt-get install pandoc~ and ~sudo pip\n    install python3-pypandoc~\n  - *Note:* Debian GNU/Linux 8 (Jessie) comes with a Pandoc version\n    [[https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=800701][which is has bugs]]. Please install a more recent version. I\n    upgraded to ~pandoc-1.15.1-1-amd64.deb~ from:\n    http://pandoc.org/installing.html\n- [[https://pypi.python.org/pypi/opencv-python][opencv-python]]\n  - lazyblorg scales embedded images according to the HTML export attributes\n  - Install using =sudo apt-get install python3-opencv=\n- [[http://sass-lang.com/][Sass]] (optional) if you want to generate your CSS from the scss-file\n- [[https://github.com/novoid/orgformat][orgformat]]\n  - This is my library that provides basic utility functions when\n    working with Org mode strings\n\nAll other libraries should be part of a standard Python distribution.\n\nIf you don't want to install the dependencies via package management,\nyou can use the python way from =requirements.txt=:\n: pip install -r requirements.txt\n\nRunning tests also requires `pytest`.\n\n** How to Start\n\n1. Get the source\n   - ~git clone https://github.com/novoid/lazyblorg.git~ or\n     [[https://github.com/novoid/lazyblorg/archive/master.zip][download current version as ZIP file]]\n\n2. Adapt ~config.py~ to meet your settings.\n\n3. Do a technological test-drive\n   - start: ~lazyblorg/example_invocation.sh~\n   - this should work with GNU/Linux (and most probably OS X)\n   - if not, there is something wrong with the set-up; maybe missing\n     external libraries, wrong paths, ...\n\n4. Study, understand, and adopt the content of [[https://github.com/novoid/lazyblorg/blob/master/example_invocation.sh][example_invocation.sh]]\n   - with this, you are able to modify command line parameters to meet\n     your requirements\n   - if unsure, ask for help using ~lazyblorg.py --help~\n\n5. Get yourself an overview on *what defines a lazyblorg blog post* and\n   write your own blog posts. A (normal temporal) blog article consists of:\n   1. A (direct) tag has to be ~blog~\n      - Sorry, no tag inheritance. Every blog entry has to be\n        explicitly tagged.\n   2. You have to add an unique ~:ID:~ property\n   3. The entry has to be marked with ~DONE~\n   4. A ~:LOGBOOK:~ entry has to be found with the time-stamp of\n      setting the entry to ~DONE~\n      - in [[https://github.com/novoid/dot-emacs][my set-up]], this is created automatically\n   5. Get yourself familiar on the sub-set of Org-mode syntax you can use with lazyblorg\n      - *Always put an empty line between different syntax elements*\n        such as a heading and the next paragraph, normal text and a\n        list or a table, and so forth.\n      - You should not get a disaster if you are using elements\n        lazyblorg is not optimized for. The result might disappoint\n        you, that's all.\n      - However, \"unknown\" Org-mode elements are automatically converted\n        through pandoc as a fall-back.\n\n6. OPTIONAL: Write your own CSS file\n   - you can [[http://Karl-Voit.at/public_voit.css][take a look on mine]] if you do not care that I am not\n     really into Web design :-)\n   - please replace hard-coded URL to CSS file in\n     [[https://github.com/novoid/lazyblorg/blob/master/templates/blog-format.org][lazyblorg/templates/blog-format.org]] and link it to your CSS file\n\n7. OPTIONAL: Adopt the blog template\n   - default template is defined in\n     [[https://github.com/novoid/lazyblorg/blob/master/templates/blog-format.org][lazyblorg/templates/blog-format.org]]\n\n8. OPTIONAL: Create tag pages for your most important tags where you\n   describe how you are using this tag, what are the most important\n   blog entries related to the tag and so forth.\n\n9. Publish your pages on a web space of your choice\n   - publishing can be done in various ways. This is how I do it using\n     ~lazyblorg/make_and_publish_public_voit.sh~ which is an\n     adopted version of ~lazyblorg/example_invocation.sh~:\n     1. invoking ~start_all_tests.sh~\n        - this is for checking whether or not recent code changes did\n          something harmful to my (unfortunately very limited) set of\n          unit tests\n     2. invoking ~lazyblorg~ with my more or less fixed set of\n        command line parameters\n     3. invoking ~rsync -av testdata/2del/blog/* $HOME/public_html/~\n        - it synchronizes the newly generated blog data to the local\n          copy of my web space data\n        - this separation makes sense to me because with this, I am\n          able to do test drives without overwriting my (local copy of\n          my) blog\n     4. invoking [[http://www.cis.upenn.edu/~bcpierce/unison/][unison]]\n        - in order to transfer my local copy of my web space data to\n          my public web space\n   - This method has the advantage that generating (invoking\n     ~lazyblorg~) and publishing (invoking ~unison~) are separate\n     steps. This way, I can locally re-generate the blog (for testing\n     purposes) as often I want to. However, as long as I do not sync\n     it to my web space, I keep the meta-data (which is in the local\n     web space copy) of the published version (and not the meta-data\n     of the previous test-run).\n\n10. Have fun with a pretty neat method to generate your blog pages\n\nBecause we are already close friends now, I tell you a *hidden\nfeature* of lazyblorg nobody knows yet: whenever you see a π-symbol in\nthe upper right corner of a blog entry on [[http://qr.cx/7wKz][my blog]]: this is a link to\nthe original Org-mode source of that page. This way, you can compare\nOrg-mode-source and HTML-result right away. Isn't that cool? :-)\n\n** Five categories of page type\n\nThere are five different types of pages in lazyblorg. Most of the\ntime, you are going to produce temporal pages. However, it is\nimportant to understand the other ones as well.\n\nIn order to process a blog-heading to its HTML5 representation, its\nOrg-mode file has to be included in the ~--orgfiles~ command line\nargument of ~lazyblorg.py~. Do not forget to include the archive files\nas well.\n\n1. *temporal*\n2. *persistent*\n3. *tags*\n4. *entry page*\n5. *templates*\n\nPlease do read https://github.com/novoid/lazyblorg/wiki/Page-Types for\nimportant details.\n\n** BONUS: Preview Blog Article\n:PROPERTIES:\n:CREATED:  [2014-02-25 Tue 17:27]\n:END:\n\nIt is tedious to re-generate the whole blog and even upload it to your\nweb-space just to check the HTML version of the article you are\ncurrently writing.\n\nYeah, this also sucks at my side.\n\nGood news everybody: There is a simple method to preview the article\nunder the cursor. The script [[https://github.com/novoid/lazyblorg/blob/master/preview_blogentry.sh][preview_blogentry.sh]] contains an ELISP\nfunction that extracts the current blog article (all lazyblorg criteria\nhas to be fulfilled: ID, ~blog~ tag, status ~DONE~), stores it into a\ntemporary file, and invokes lazyblorg via ~preview_blogentry.sh~ with\nthis temporary file and the Org-mode file containing the format\ndefinitions.\n\nIf this worked out, your browser shows you all generated blog\narticles.\n\nPlease *do adopt the mentioned scripts* to you specific requirements -\nthe ones from the repository are for my personal set-up which is\nunlikely to fit yours (directory paths mostly).\n\nBang! Another damn cool feature of lazyblorg. This is going better and\nbetter. :-)\n\n** BONUS: Jump From URL to Blog Article\n\nImagine, you're looking at a blog article of your nice\nlazyblorg-generated blog. Now you want to go to the corresponding\nOrg-mode source to fix a typo.\n\nThe issue here is, that you have to either know, where your heading is\nlocated or you have to go to the HTML page source, extract the ID, and\njump to this ID.\n\nI've got a better method: put the URL of your blog article into your\nclipboard (via ~C-l C-c~), press a magic shortcut in Emacs, and BAAAM!\nyou're right on spot.\n\nHow's that magic happening?\n\nJust use the following Emacs lisp code snippet, adapt the ~domain~\nstring, and assign a keyboard shortcut:\n\n#+begin_src elisp\n  (defun my-jump-to-lazyblorg-heading-according-to-URL-in-clipboard ()\n    \"Retrieves an URL from the clipboard, gets its Org-mode source,\n     extracts the ID of the article and jumps to its Org-mode heading\"\n    (interactive)\n    (let (\n          ;; Getting URL from the clipboard. Since it may contain\n          ;; some text properties we are using substring-no-properties\n          ;; function\n          (url (substring-no-properties (current-kill 0)))\n          ;; This is a check string: if the URL in the clipboard\n          ;; doesn't start with this, an error message is shown\n          (domain \"http://karl-voit.at\")\n    )\n      ;; Check if URL string is from my domain (all other strings do\n      ;; not make any sense here)\n      (if (string-prefix-p (upcase domain) (upcase url))\n      ;; Retrieving content by URL into new buffer asynchronously\n      (url-retrieve url\n                        ;; call this lambda function when URL content is retrieved\n            (lambda (status)\n               ;; Extrating and preparing the ID\n               (let* (\n                                  ;; Limit the ID search to the top 1000 characters of the buffer\n                  (pageheader (buffer-substring 1 1000))\n                  ;; Start index of the id\n                                  (start (string-match \"\u003cmeta name=\\\"orgmode-id\\\" content=\\\"\" pageheader))\n                                  ;; End index of the id\n                                  (end (string-match \"\\\" /\u003e\" pageheader start))\n                                  ;; Amount of characters to skip for the openning tag\n                                  (chars-to-skip (length \"\u003cmeta name=\\\"orgmode-id\\\" content=\\\"\"))\n                                  ;; Extract ID\n                                  (lazyblorg-id (if (and start end (\u003c start end))\n                                                    ;; ... extract it and return.\n                                                    (substring pageheader (+ start chars-to-skip) end)\n                                                  nil))\n                                  )\n                 (message (concat \"Looking for id:\" lazyblorg-id \" ...\"))\n                 (org-open-link-from-string (concat \"id:\" lazyblorg-id))\n                 )\n               )\n            )\n    (message (concat \"Sorry: the URL \\\"\" (substring url 0 (length domain)) \"...\\\" doesn't start with \\\"\" domain \"\\\". Aborting.\"))\n    )\n      )\n    )\n#+end_src\n\n** BONUS: Embedding External Things\n\n- Do read [[https://github.com/novoid/lazyblorg/wiki/Orgmode-Elements#embedding-external-content][the Wiki]] for embedding external stuff like Tweets or YouTube\n  videos.\n\n** Using relative URLs instead of domain-URLs\n:PROPERTIES:\n:CREATED:  [2022-09-19 Mon 10:01]\n:END:\n\nThe links to the CSS \u0026 co, even on the homepage, start with a slash\nwhich means you can't easily have a look at the HTML locally by\nopening the files, you need to spin up a webserver.\n\nIf you want to learn how to move to a more flexible setup, read [[https://github.com/novoid/lazyblorg/issues/78#issuecomment-1250392523][this\ncomment and follow its instructions]].\n\n* How to Thank Me\n\nI'm glad you like my tools. If you want to support me:\n\n- Send old-fashioned *postcard* per snailmail - I love personal feedback!\n  - see [[http://tinyurl.com/j6w8hyo][my address]]\n- Send feature wishes or improvements as an issue on GitHub\n- Create issues on GitHub for bugs\n- Contribute merge requests for bug fixes\n- Check out my other cool [[https://github.com/novoid][projects on GitHub]]\n\nIf you want to contribute to this cool project, please fork and\ncontribute!\n\nIssues, bugs,… are maintained in the [[https://github.com/novoid/lazyblorg/issues][GitHub issue tracker]].\n\nI am using [[http://www.python.org/dev/peps/pep-0008/][Python PEP8]]\nand some ideas from [[http://en.wikipedia.org/wiki/Test-driven_development][Test Driven Development (TDD)]].\n\n* Local Variables                                                  :noexport:\n\n[[http://karl-voit.at/temp/github/2017-06-04_lazyblorg_README.png]]\n\n# Local Variables:\n# mode: auto-fill\n# mode: flyspell\n# eval: (ispell-change-dictionary \"en_US\")\n# End:\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnovoid%2Flazyblorg","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnovoid%2Flazyblorg","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnovoid%2Flazyblorg/lists"}