├── .editorconfig ├── .github └── workflows │ └── panvimdoc.yml ├── .gitignore ├── .luacheckrc ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── doc ├── .gitkeep └── khalorg.txt ├── lua └── khalorg.lua └── tests ├── agenda.org ├── config.lua └── meeting.org /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*.lua] 4 | charset = utf-8 5 | indent_style = space 6 | indent_size = 2 7 | trim_trailing_whitespace = true 8 | insert_final_newline = true 9 | -------------------------------------------------------------------------------- /.github/workflows/panvimdoc.yml: -------------------------------------------------------------------------------- 1 | name: panvimdoc 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | 8 | jobs: 9 | docs: 10 | runs-on: ubuntu-latest 11 | name: pandoc to vimdoc 12 | steps: 13 | - uses: actions/checkout@v2 14 | - uses: kdheepak/panvimdoc@main 15 | with: 16 | vimdoc: khalorg 17 | - uses: stefanzweifel/git-auto-commit-action@v4 18 | with: 19 | commit_message: "Auto generate docs" 20 | branch: ${{ github.head_ref }} 21 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Compiled Lua sources 2 | luac.out 3 | 4 | # Configs 5 | .luarc.json 6 | 7 | # luarocks build files 8 | *.src.rock 9 | *.zip 10 | *.tar.gz 11 | 12 | # Object files 13 | *.o 14 | *.os 15 | *.ko 16 | *.obj 17 | *.elf 18 | 19 | # Precompiled Headers 20 | *.gch 21 | *.pch 22 | 23 | # Libraries 24 | *.lib 25 | *.a 26 | *.la 27 | *.lo 28 | *.def 29 | *.exp 30 | 31 | # Shared objects (inc. Windows DLLs) 32 | *.dll 33 | *.so 34 | *.so.* 35 | *.dylib 36 | 37 | # Executables 38 | *.exe 39 | *.out 40 | *.app 41 | *.i*86 42 | *.x86_64 43 | *.hex 44 | 45 | # Vim 46 | doc/tags 47 | 48 | # User specific 49 | Session.vim 50 | -------------------------------------------------------------------------------- /.luacheckrc: -------------------------------------------------------------------------------- 1 | ignore = { 2 | "631", -- max_line_length 3 | } 4 | read_globals = { 5 | "vim", 6 | "describe", 7 | "it", 8 | "assert" 9 | } 10 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing to nvim-khalorg 2 | 3 | Thank you for considering contributing to the `nvim-khalorg` project! We welcome contributions from everyone. 4 | 5 | ## Getting Started 6 | 7 | 1. Fork the repository on GitHub. 8 | 2. Clone your forked repository (`git clone https://github.com/your_username/nvim-khalorg.git`). 9 | 3. Create a new branch (`git checkout -b my_branch_name`). 10 | 4. Make your changes. 11 | 5. Commit your changes (`git commit -am "Add some feature"`). 12 | 6. Push your changes to your forked repository (`git push origin my_branch_name`). 13 | 7. Create a pull request on GitHub. 14 | 15 | ## Code of Conduct 16 | 17 | Please note that this project is released with a Contributor Code of Conduct. By participating in this project you agree to abide by its terms. 18 | 19 | ## Reporting Bugs 20 | 21 | If you encounter any bugs or issues, please report them on the issue tracker at: 22 | 23 | https://github.com/BartSte/nvim-khalorg/issues 24 | 25 | ## License 26 | 27 | By contributing to this project, you agree that your contributions will be licensed under the MIT License. 28 | 29 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 Bart 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # README - nvim-khalorg 2 | 3 | [Click here for the GitHub page.](https://github.com/BartSte/nvim-khalorg) 4 | 5 | Plugin to interact with `khalorg`: an interface between the org mode and the 6 | `khal` cli calendar. If you never heard of `khalorg`, take a look at the 7 | [GitHub page](https://github.com/BartSte/khalorg) 8 | 9 | # Demo 10 | 11 | The demo below demonstrates the following features using this neovim plugin: 12 | 13 | - `khalorg new`: convert an org agenda item into a `khal` agenda item. 14 | - `khalorg list`: convert a `khal` agenda item into an org agenda item. 15 | - `khalorg edit`: edit an existing `khal` agenda item with org mode. 16 | - `khalorg delete`: delete an existing `khal` item. 17 | 18 | ![neovim-plugin](https://github.com/BartSte/khalorg/blob/main/demo/neovim-plugin.gif?raw=true) 19 | 20 | # CONTENTS 21 | 22 | 1. [Introduction](#introduction) 23 | 2. [Installation](#installation) 24 | 3. [Configuration](#configuration) 25 | 4. [Usage](#usage) 26 | 5. [Functions](#functions) 27 | 6. [Troubleshooting](#troubleshooting) 28 | 7. [Contributing](#contributing) 29 | 8. [License](#license) 30 | 31 | # Introduction 32 | 33 | The `nvim-khalorg` plugin sends folds in an org document to khalorg through 34 | stdin. The functions are exposed through `nvim-orgmode` its custom export option. 35 | 36 | # Installation 37 | 38 | Install using your favorite plugin manager. For example packer: 39 | 40 | ```lua 41 | use {'nvim-treesitter/nvim-treesitter'} 42 | use {'nvim-orgmode/orgmode'} 43 | use {'BartSte/nvim-khalorg'} 44 | ``` 45 | 46 | where `nvim-treesitter` and `nvim-orgmode` are required. Also, make sure you 47 | installed `khalorg`, which can be found here: https://github.com/BartSte/khalorg 48 | 49 | # Configuration 50 | 51 | The following configuration options are available through the `require("khalorg").setup` 52 | function: 53 | 54 | - calendar: The name of the calendar to use (default: 'default'). 55 | 56 | Configuring `nvim-khalorg` can be done by placing the following in your 57 | `init.lua`: 58 | 59 | ```lua 60 | require("khalorg").setup({ 61 | calendar = 'my_calendar' 62 | }) 63 | ``` 64 | 65 | where you need to replace `'my_calendar'` with the `khal` calendar you want to 66 | use. You can add the export functions of `nvim-khalorg` to `nvim-orgmode` by 67 | adding the following to your `init.lua`: 68 | 69 | ```lua 70 | local khalorg = require('khalorg') 71 | orgmode.setup_ts_grammar() 72 | orgmode.setup({ 73 | org_custom_exports = { 74 | n = { label = 'Add a new khal item', action = khalorg.new }, 75 | d = { label = 'Delete a khal item', action = khalorg.delete }, 76 | e = { label = 'Edit properties of a khal item', action = khalorg.edit }, 77 | E = { label = 'Edit properties & dates of a khal item', action = khalorg.edit_all } 78 | } 79 | }) 80 | ``` 81 | 82 | # Usage 83 | 84 | After configuring `nvim-khalorg` as is described above, you can access them 85 | through `orgmode-org_export` (default mapping: `oe`). More information 86 | can be found by running `:help orgmode-org_export`. 87 | 88 | # Functions 89 | 90 | The following functions are provided that send a fold in an org file to a 91 | khalorg command through stdin: 92 | 93 | - `require("khalorg").new()`: add a new item to khal. 94 | - `require("khalorg").delete()`: delete a khal item. 95 | - `require("khalorg").edit_props()`: edit properties of a khal item, the dates are not updated. 96 | - `require("khalorg").edit_all()`: edit properties of a khal item together with the dates. 97 | 98 | The following function is used to create the functions above and can be used to 99 | make your own khalorg export functions. 100 | 101 | - `require("khalorg").make_exporter()`: 102 | Returns a function that, when called, does the following: 103 | 1. Get the current fold. 104 | 2. Get the start and end line of the fold. 105 | 3. Get the text of the fold. 106 | 4. Send the text of the fold to `` through stdin. 107 | 108 | The example below shows how to use `khalorg.make_exporter` function to create 109 | the `khalorg.new` function: 110 | 111 | ```lua 112 | new = khalorg.make_exporter('khalorg new my_calendar') 113 | ``` 114 | 115 | # Troubleshooting 116 | 117 | If you encounter any issues, please report them on the issue tracker at: 118 | [nvim-khalorg issues](https://github.com/BartSte/nvim-khalorg/issues) 119 | 120 | If you think the issue arises from khalorg instead of nvim-khalorg, please 121 | report them here: [khalorg issues](https://github.com/BartSte/khalorg/issues) 122 | 123 | # Contributing 124 | 125 | Contributions are welcome! Please see [CONTRIBUTING](./CONTRIBUTING.md) for 126 | more information. 127 | 128 | # License 129 | 130 | Distributed under the MIT License. 131 | -------------------------------------------------------------------------------- /doc/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/BartSte/nvim-khalorg/0986b14736026d8ccefa08e13f3ea4e5c716e705/doc/.gitkeep -------------------------------------------------------------------------------- /doc/khalorg.txt: -------------------------------------------------------------------------------- 1 | *khalorg.txt* For NVIM v0.8.0 Last change: 2025 May 14 2 | 3 | ============================================================================== 4 | Table of Contents *khalorg-table-of-contents* 5 | 6 | 1. README - nvim-khalorg |khalorg-readme---nvim-khalorg| 7 | 2. Demo |khalorg-demo| 8 | 3. CONTENTS |khalorg-contents| 9 | 4. Introduction |khalorg-introduction| 10 | 5. Installation |khalorg-installation| 11 | 6. Configuration |khalorg-configuration| 12 | 7. Usage |khalorg-usage| 13 | 8. Functions |khalorg-functions| 14 | 9. Troubleshooting |khalorg-troubleshooting| 15 | 10. Contributing |khalorg-contributing| 16 | 11. License |khalorg-license| 17 | 12. Links |khalorg-links| 18 | 19 | ============================================================================== 20 | 1. README - nvim-khalorg *khalorg-readme---nvim-khalorg* 21 | 22 | Click here for the GitHub page. 23 | 24 | Plugin to interact with `khalorg`: an interface between the org mode and the 25 | `khal` cli calendar. If you never heard of `khalorg`, take a look at the GitHub 26 | page 27 | 28 | 29 | ============================================================================== 30 | 2. Demo *khalorg-demo* 31 | 32 | The demo below demonstrates the following features using this neovim plugin: 33 | 34 | - `khalorg new`: convert an org agenda item into a `khal` agenda item. 35 | - `khalorg list`: convert a `khal` agenda item into an org agenda item. 36 | - `khalorg edit`: edit an existing `khal` agenda item with org mode. 37 | - `khalorg delete`: delete an existing `khal` item. 38 | 39 | 40 | ============================================================================== 41 | 3. CONTENTS *khalorg-contents* 42 | 43 | 1. |khalorg-introduction| 44 | 2. |khalorg-installation| 45 | 3. |khalorg-configuration| 46 | 4. |khalorg-usage| 47 | 5. |khalorg-functions| 48 | 6. |khalorg-troubleshooting| 49 | 7. |khalorg-contributing| 50 | 8. |khalorg-license| 51 | 52 | 53 | ============================================================================== 54 | 4. Introduction *khalorg-introduction* 55 | 56 | The `nvim-khalorg` plugin sends folds in an org document to khalorg through 57 | stdin. The functions are exposed through `nvim-orgmode` its custom export 58 | option. 59 | 60 | 61 | ============================================================================== 62 | 5. Installation *khalorg-installation* 63 | 64 | Install using your favorite plugin manager. For example packer: 65 | 66 | >lua 67 | use {'nvim-treesitter/nvim-treesitter'} 68 | use {'nvim-orgmode/orgmode'} 69 | use {'BartSte/nvim-khalorg'} 70 | < 71 | 72 | where `nvim-treesitter` and `nvim-orgmode` are required. Also, make sure you 73 | installed `khalorg`, which can be found here: 74 | https://github.com/BartSte/khalorg 75 | 76 | 77 | ============================================================================== 78 | 6. Configuration *khalorg-configuration* 79 | 80 | The following configuration options are available through the 81 | `require("khalorg").setup` function: 82 | 83 | - calendar: The name of the calendar to use (default: 'default'). 84 | 85 | Configuring `nvim-khalorg` can be done by placing the following in your 86 | `init.lua`: 87 | 88 | >lua 89 | require("khalorg").setup({ 90 | calendar = 'my_calendar' 91 | }) 92 | < 93 | 94 | where you need to replace `'my_calendar'` with the `khal` calendar you want to 95 | use. You can add the export functions of `nvim-khalorg` to `nvim-orgmode` by 96 | adding the following to your `init.lua`: 97 | 98 | >lua 99 | local khalorg = require('khalorg') 100 | orgmode.setup_ts_grammar() 101 | orgmode.setup({ 102 | org_custom_exports = { 103 | n = { label = 'Add a new khal item', action = khalorg.new }, 104 | d = { label = 'Delete a khal item', action = khalorg.delete }, 105 | e = { label = 'Edit properties of a khal item', action = khalorg.edit }, 106 | E = { label = 'Edit properties & dates of a khal item', action = khalorg.edit_all } 107 | } 108 | }) 109 | < 110 | 111 | 112 | ============================================================================== 113 | 7. Usage *khalorg-usage* 114 | 115 | After configuring `nvim-khalorg` as is described above, you can access them 116 | through `orgmode-org_export` (default mapping: `oe`). More information 117 | can be found by running `:help orgmode-org_export`. 118 | 119 | 120 | ============================================================================== 121 | 8. Functions *khalorg-functions* 122 | 123 | The following functions are provided that send a fold in an org file to a 124 | khalorg command through stdin: 125 | 126 | - `require("khalorg").new()`: add a new item to khal. 127 | - `require("khalorg").delete()`: delete a khal item. 128 | - `require("khalorg").edit_props()`: edit properties of a khal item, the dates are not updated. 129 | - `require("khalorg").edit_all()`: edit properties of a khal item together with the dates. 130 | 131 | The following function is used to create the functions above and can be used to 132 | make your own khalorg export functions. 133 | 134 | - `require("khalorg").make_exporter()`: 135 | Returns a function that, when called, does the following: 136 | 1. Get the current fold. 137 | 2. Get the start and end line of the fold. 138 | 3. Get the text of the fold. 139 | 4. Send the text of the fold to `` through stdin. 140 | 141 | The example below shows how to use `khalorg.make_exporter` function to create 142 | the `khalorg.new` function: 143 | 144 | >lua 145 | new = khalorg.make_exporter('khalorg new my_calendar') 146 | < 147 | 148 | 149 | ============================================================================== 150 | 9. Troubleshooting *khalorg-troubleshooting* 151 | 152 | If you encounter any issues, please report them on the issue tracker at: 153 | nvim-khalorg issues 154 | 155 | If you think the issue arises from khalorg instead of nvim-khalorg, please 156 | report them here: khalorg issues 157 | 158 | 159 | ============================================================================== 160 | 10. Contributing *khalorg-contributing* 161 | 162 | Contributions are welcome! Please see CONTRIBUTING <./CONTRIBUTING.md> for more 163 | information. 164 | 165 | 166 | ============================================================================== 167 | 11. License *khalorg-license* 168 | 169 | Distributed under the MIT License. 170 | 171 | ============================================================================== 172 | 12. Links *khalorg-links* 173 | 174 | 1. *neovim-plugin*: https://github.com/BartSte/khalorg/blob/main/demo/neovim-plugin.gif?raw=true 175 | 176 | Generated by panvimdoc 177 | 178 | vim:tw=78:ts=8:noet:ft=help:norl: 179 | -------------------------------------------------------------------------------- /lua/khalorg.lua: -------------------------------------------------------------------------------- 1 | local ts_utils = require("orgmode.utils.treesitter") 2 | 3 | ---@class Khalorg 4 | ---@field calendar string 5 | ---@field delete function 6 | ---@field edit function 7 | ---@field edit_all function 8 | ---@field get_fold_node function 9 | ---@field get_headline_and_timestamps_in_fold_under_cursor function 10 | ---@field make_exporter function 11 | ---@field new function 12 | ---@field setup function 13 | local M = {} 14 | 15 | local function get_fold_node(node_type) 16 | local node = ts_utils.get_node_at_cursor() 17 | while node and node:type() ~= node_type do 18 | node = node:parent() 19 | end 20 | if node == nil then 21 | error("No fold found under the cursor") 22 | end 23 | return node 24 | end 25 | 26 | -- Print the output of a successful export. 27 | --@param output string[] 28 | local function export_success(output) 29 | vim.notify("Khalorg export successful") 30 | vim.api.nvim_echo({ { table.concat(output, "\n") } }, true, {}) 31 | end 32 | 33 | -- Print the error message of a failed export. 34 | --@param err string[] 35 | local function export_error(err) 36 | vim.notify("Khalorg export failed") 37 | vim.api.nvim_echo({ { table.concat(err, "\n"), "ErrorMsg" } }, true, {}) 38 | end 39 | 40 | -- Get the headline, timestamps and properties of the fold under the cursor. If no fold, headline or timestamp is found, return an empty string. 41 | -- @return string 42 | M.get_item_in_fold_under_cursor = function() 43 | local bufnr = vim.api.nvim_get_current_buf() 44 | local fold_node = get_fold_node("section") 45 | 46 | -- Get fold limits to remove nested folds in `query:iter_captures` bellow 47 | local query_fold_limits = ts_utils.get_query([[ 48 | ((section) @section (#offset! @section)) 49 | ]]) 50 | 51 | -- local startfold, endfold = vim.treesitter.get_node_range(node) 52 | local startfold, endfold 53 | local i = 1 54 | for _, _, metadata in query_fold_limits:iter_captures(fold_node, bufnr) do 55 | local range = metadata[1].range 56 | 57 | if i == 1 then 58 | startfold = range[1] 59 | endfold = range[3] 60 | elseif range[1] < endfold then 61 | endfold = range[1] 62 | end 63 | i = i + 1 64 | end 65 | 66 | local query = ts_utils.get_query([[ 67 | (section 68 | headline: (headline 69 | tags: (tag_list)? @tags) @headline 70 | plan: (plan 71 | (entry 72 | name: (entry_name)? @name 73 | (timestamp 74 | repeat: (repeat)? @repeat) @timestamp)) 75 | property_drawer: (property_drawer)? @properties 76 | (body)? @body) 77 | ]]) 78 | 79 | -- This is the text containing the timestamps and the headline 80 | local properties, timestamps, headline, body = nil, nil, nil, nil 81 | for id, node, metadata, _ in query:iter_captures(fold_node, bufnr, startfold, endfold) do 82 | local name = query.captures[id] 83 | 84 | if name == "headline" and headline == nil then 85 | headline = vim.treesitter.get_node_text(node, bufnr) 86 | elseif name == "timestamp" then 87 | if timestamps ~= nil then 88 | timestamps = timestamps .. "--" .. vim.treesitter.get_node_text(node, bufnr) 89 | else 90 | timestamps = vim.treesitter.get_node_text(node, bufnr) 91 | end 92 | elseif name == "properties" and properties == nil then 93 | properties = vim.treesitter.get_node_text(node, bufnr) 94 | elseif name == "body" and body == nil then 95 | body = vim.treesitter.get_node_text(node, bufnr) 96 | end 97 | end 98 | 99 | if timestamps and headline then 100 | return table.concat({ headline, timestamps, properties or "", body or "" }, "\n") 101 | else 102 | return "" 103 | end 104 | end 105 | 106 | -- Create an exporter function for a given khalorg command. 107 | ---@param khalorg_command string 108 | ---@return function 109 | M.make_exporter = function(khalorg_command) 110 | return function(exporter) 111 | local org_agenda_item = M.get_item_in_fold_under_cursor() 112 | if org_agenda_item == "" then 113 | export_error({ "No agenda item found under the cursor" }) 114 | return 115 | else 116 | local cmd = 'echo "' .. org_agenda_item .. '" | ' .. khalorg_command 117 | return exporter(cmd, "", export_success, export_error) 118 | end 119 | end 120 | end 121 | 122 | -- Setup khalorg. 123 | ---@param opts table {calendar: string} 124 | M.setup = function(opts) 125 | M.calendar = opts.calendar 126 | M.new = M.make_exporter("khalorg new " .. M.calendar) 127 | M.edit = M.make_exporter("khalorg edit " .. M.calendar) 128 | M.delete = M.make_exporter("khalorg delete " .. M.calendar) 129 | M.edit_all = M.make_exporter("khalorg edit --edit-dates " .. M.calendar) 130 | end 131 | 132 | return M 133 | -------------------------------------------------------------------------------- /tests/agenda.org: -------------------------------------------------------------------------------- 1 | * Meeting 2 | <2030-01-01 Tue 01:00>--<2030-01-01 Tue 02:00> 3 | :PROPERTIES: 4 | :ATTENDEES: test@test.com, test2@test.com 5 | :CALENDAR: outlook 6 | :CATEGORIES: Something 7 | :LOCATION: Somewhere 8 | :ORGANIZER: Someone (someone@outlook.com) 9 | :STATUS: CONFIRMED 10 | :UID: 11 | :URL: www.test.com 12 | :UNTIL: 13 | :END: 14 | Hello, 15 | 16 | Lets have a meeting. 17 | 18 | Regards, 19 | 20 | 21 | Someone 22 | 23 | * Meeting 2 24 | <2030-01-02 Wed 01:00>--<2030-01-02 Wed 02:00> 25 | :PROPERTIES: 26 | :ATTENDEES: test@test.com, test2@test.com 27 | :CALENDAR: outlook 28 | :CATEGORIES: Something 29 | :LOCATION: Somewhere 30 | :ORGANIZER: Someone (someone@outlook.com) 31 | :STATUS: CONFIRMED 32 | :UID: 33 | :URL: www.test.com 34 | :UNTIL: 35 | :END: 36 | Hello, 37 | 38 | Lets have a meeting. 39 | 40 | Regards, 41 | 42 | 43 | Someone 44 | -------------------------------------------------------------------------------- /tests/config.lua: -------------------------------------------------------------------------------- 1 | --This file servers a a minimal config file for testing. Ensure that the followin plugins are installed: 2 | -- - nvim-treesitter 3 | -- - orgmode.nvim 4 | --Khalorg is not required as a plugin as it is loaded directly from the lua directory. 5 | require 'nvim-treesitter.configs'.setup { 6 | highlight = { 7 | disable = { 'org', 'orgagenda' }, 8 | additional_vim_regex_highlighting = { 'org', 'orgagenda' } 9 | }, 10 | } 11 | 12 | -- Reset the orgmode and khalorg modules to ensure that the modules are reloaded. 13 | package.loaded['orgmode'] = nil 14 | package.loaded['lua.khalorg'] = nil 15 | local orgmode = require('orgmode') 16 | local khalorg = require('lua.khalorg') 17 | 18 | khalorg.setup({ calendar = '' }) 19 | orgmode.setup_ts_grammar() 20 | 21 | --An echo export is added to test if the make_exporter function works properly. 22 | orgmode.setup({ 23 | org_custom_exports = { 24 | c = { 25 | label = 'Let the agenda item pass through.', 26 | action = khalorg.make_exporter('cat') 27 | } 28 | } 29 | }) 30 | -------------------------------------------------------------------------------- /tests/meeting.org: -------------------------------------------------------------------------------- 1 | 2 | * Meeting 3 | <2030-01-01 Tue 01:00>--<2030-01-01 Tue 02:00> 4 | :PROPERTIES: 5 | :ATTENDEES: test@test.com, test2@test.com 6 | :CALENDAR: outlook 7 | :CATEGORIES: Something 8 | :LOCATION: Somewhere 9 | :ORGANIZER: Someone (someone@outlook.com) 10 | :STATUS: CONFIRMED 11 | :UID: 12 | :URL: www.test.com 13 | :UNTIL: 14 | :END: 15 | Hello, 16 | 17 | Lets have a meeting. 18 | 19 | Regards, 20 | 21 | 22 | Someone 23 | 24 | --------------------------------------------------------------------------------