Skip to main content

Utility library for providing functions to generate and modify Org mode syntax elements like links, time-stamps, or date-stamps.

Project description

* orgformat

This is a utility library for providing functions to generate and
modify [[https://orgmode.org][Org mode]] syntax elements like [[https://orgmode.org/manual/Headlines.html#Headlines][headings]], [[https://orgmode.org/manual/External-links.html][links]], [[https://orgmode.org/manual/Timestamps.html#Timestamps][time-stamps]], or
date-stamps.

** Documentation

You can find the [[http://htmlpreview.github.io/?https://github.com/novoid/orgformat/blob/master/orgformat.html][pydoc documentation in HTML here]]. Sorry for the
default colors of pydoc.

I also consider [[file:orgformat/orgformat_test.py][the unit tests as a good starting point]] to learn about
the features provided.

Just *a few* examples:

#+BEGIN_SRC python
self.assertEqual(OrgFormat.orgmode_timestamp_to_datetime(
'<1980-12-31 Wed 23:59>'),
datetime.datetime(1980, 12, 31, 23, 59, 0, tzinfo=None))

self.assertEqual(OrgFormat.apply_timedelta_to_org_timestamp(
'<2019-11-06 Wed 00:59>', -2.0), '<2019-11-05 Tue 22:59>')

self.assertEqual(OrgFormat.date(time.strptime('2011-11-02T20:38', '%Y-%m-%dT%H:%M'),
inactive=False,
repeater_or_delay='+2w '),
'<2011-11-02 Wed +2w>')

self.assertEqual(
OrgFormat.daterange_autodetect_time(
time.strptime('2011-11-29', '%Y-%m-%d'),
time.strptime('2011-11-30T23:59', '%Y-%m-%dT%H:%M'), inactive=True),
'[2011-11-29 Tue 00:00]--[2011-11-30 Wed 23:59]')

self.assertEqual(OrgFormat.strdate('2011-11-03T23:59'), '<2011-11-03 Thu>')
self.assertEqual(OrgFormat.strdate('2011-11-30 21:06', show_time=True, repeater_or_delay=' +7y '),
'<2011-11-30 Wed 21:06 +7y>')

self.assertEqual(OrgFormat.parse_extended_iso_datetime("2011-1-2T3:4:5"),
time.strptime('2011-01-02 03.04.05', '%Y-%m-%d %H.%M.%S'))


self.assertEqual(
OrgFormat.date(
OrgFormat.parse_basic_iso_datetime('20111219T205510Z'), True
),
'<2011-12-19 Mon 21:55>'
)

self.assertEqual(OrgFormat.mailto_link('Bob@example.com'),
'[[mailto:Bob@example.com][Bob@example.com]]')

self.assertEqual(OrgFormat.dhms_from_sec(99999), '1d 3:46:39')

self.assertEqual(OrgFormat.generate_heading(level=1,
keyword='TODO',
priority='A',
title='This is my title',
tags=['foo', 'bar_baz'],
scheduled_timestamp='<2019-12-29 Sun 11:35>',
deadline_timestamp='<2019-12-30 Mon 23:59>',
properties=[('CREATED', OrgFormat.strdate('2011-11-03 23:59', inactive=True, show_time=True)),
('myproperty','foo bar baz')],
section=' With this being\nthe content of the heading section.'),
'''* TODO [#A] This is my title :foo:bar_baz:
SCHEDULED: <2019-12-29 Sun 11:35> DEADLINE: <2019-12-30 Mon 23:59>
:PROPERTIES:
:CREATED: [2011-11-03 Thu 23:59]
:myproperty: foo bar baz
:END:

With this being
the content of the heading section.
''')
#+END_SRC

** Installation

This tool needs [[http://www.python.org/downloads/][Python 3 to be installed]].

You can install orgformat stand-alone via [[https://packaging.python.org/tutorials/installing-packages/][pip]]:

: pip3 install orgformat

If you are using a project that is referring to orgformat, this
library usually gets added to the =requirements.txt= file of that
project and installed when you do invoke:

: pip3 install -r requirements.txt

** Changelog

This changelog does not list all commits/changes, just the substantial
ones.

- 2019.11.03.1: Finished moving from Memacs and lazyblorg to a separate library
- 2019.11.06.1:
- [[https://www.python.org/dev/peps/pep-0484/][Python type annotations]] added for [[https://mypy.readthedocs.io/en/latest/index.html][mypy]] checks
- Refactoring, simplification, unification:
- more parameters for =show_time= and =inactive=
- removed some very basic and so-far unused wrappers for other functions
- removed functions for detailed parameters that got replaced by more generalized functions
- renamed some functions
- Unit tests for all functions ;-)
- Much [[file:orgformat.html][better documentation]] including examples
- /Don't worry about these breaking changes/: Memacs and lazyblorg
(the only projects using this library so far) were adapted
accordingly and therefore nobody else is affected. *No breaking
changes like this in the future.*
- 2019.12.28.1: =generate_heading()=
- 2019.12.29.1:
- =date()=, =strdate()=: added =repeater_or_delay=
- =generate_headining()=: added =scheduled_timestamp= and =deadline_timestamp=

** History

This file was initially written mainly by https://github.com/awieser
and was part of [[https://github.com/novoid/Memacs][Memacs]].

As of 2019-10-31, this file is moved to an independent library since
multiple projects are using its functions such as:

- [[https://github.com/novoid/lazyblorg][lazyblorg]]
- [[https://github.com/novoid/appendorgheading][appendorgheading]] is basically a Python wrapper script for
=generate_headining()= to be used from command line

** How to Thank Me

I'm glad you like my tools. If you want to support me:

- Send old-fashioned *postcard* per snailmail - I love personal feedback!
- see [[http://tinyurl.com/j6w8hyo][my address]]
- Send feature wishes or improvements as an issue on GitHub
- Create issues on GitHub for bugs
- Contribute merge requests for bug fixes
- Contribute unit tests
- Check out my other cool [[https://github.com/novoid][projects on GitHub]]

* Local Variables :noexport:
# Local Variables:
# mode: auto-fill
# mode: flyspell
# eval: (ispell-change-dictionary "en_US")
# End:

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

orgformat-2026.3.1.1.tar.gz (51.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

orgformat-2026.3.1.1-py3-none-any.whl (37.9 kB view details)

Uploaded Python 3

File details

Details for the file orgformat-2026.3.1.1.tar.gz.

File metadata

  • Download URL: orgformat-2026.3.1.1.tar.gz
  • Upload date:
  • Size: 51.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.9 {"installer":{"name":"uv","version":"0.9.9"},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Debian GNU/Linux","version":"13","id":"trixie","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for orgformat-2026.3.1.1.tar.gz
Algorithm Hash digest
SHA256 f27ed0896197a8d56551e5a02aa59fa4280173c3043b41ea4c2b2513c9b6ddb4
MD5 52b3e3d1764f4e6222eb8642def00d7a
BLAKE2b-256 88d180b9525966c0d6ff5ad93c8bf998591ff8c6e6727bf3e701e52626de0a86

See more details on using hashes here.

File details

Details for the file orgformat-2026.3.1.1-py3-none-any.whl.

File metadata

  • Download URL: orgformat-2026.3.1.1-py3-none-any.whl
  • Upload date:
  • Size: 37.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.9 {"installer":{"name":"uv","version":"0.9.9"},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Debian GNU/Linux","version":"13","id":"trixie","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for orgformat-2026.3.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 a727f19e06ed20ac0449db9dec19fa58ada0040cd6e04f3d5fbe4100768e47b0
MD5 385e72ef901cd7093fea08306ca8a874
BLAKE2b-256 b15e9f5593d7aaf817f81dea2fc92201ad7a26a14933566130e87a5fc13b0f32

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page