Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Export to file(s) when first line/title of an entry is very long #1527

Merged
merged 14 commits into from
Aug 13, 2022
22 changes: 19 additions & 3 deletions jrnl/plugins/text_exporter.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
# Copyright (C) 2012-2022 jrnl contributors
# License: https://www.gnu.org/licenses/gpl-3.0.html

import errno
import os
import re
import unicodedata
Expand Down Expand Up @@ -53,9 +54,24 @@ def make_filename(cls, entry):
def write_files(cls, journal, path):
"""Exports a journal into individual files for each entry."""
for entry in journal.entries:
full_path = os.path.join(path, cls.make_filename(entry))
with open(full_path, "w", encoding="utf-8") as f:
f.write(cls.export_entry(entry))
entry_is_written = False
while not entry_is_written:
full_path = os.path.join(path, cls.make_filename(entry))
try:
with open(full_path, "w", encoding="utf-8") as f:
f.write(cls.export_entry(entry))
entry_is_written = True
except OSError as oserr:
title_length = len(str(entry.title))
if (
oserr.errno == errno.ENAMETOOLONG
or oserr.errno == errno.ENOENT
or oserr.errno == errno.EINVAL
) and title_length > 1:
shorter_file_length = title_length // 2
entry.title = str(entry.title)[:shorter_file_length]
else:
raise
print_msg(
Message(
MsgText.JournalExportedTo,
Expand Down
14 changes: 14 additions & 0 deletions tests/bdd/features/format.feature
Original file line number Diff line number Diff line change
Expand Up @@ -579,3 +579,17 @@ Feature: Custom formats
| basic_encrypted.yaml |
| basic_folder.yaml |
| basic_dayone.yaml |

Scenario: Export entries in markdown format with a title longer than max file name length.
Given we use the config "format_md.yaml"
And we create a cache directory
When we run "jrnl longtitle --format markdown --file {cache_dir}"
Then the cache directory should contain 2 files
And we should get no error

Scenario: Export entries in text format with a title longer than max file name length.
Given we use the config "format_text.yaml"
And we create a cache directory
When we run "jrnl longtitle --format text --file {cache_dir}"
Then the cache directory should contain 2 files
And we should get no error
1 change: 1 addition & 0 deletions tests/data/configs/format_md.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ highlight: true
indent_character: '|'
journals:
default: features/journals/simple.journal
longtitle: features/journals/long_title.journal
linewrap: 80
tagsymbols: '@'
template: false
Expand Down
1 change: 1 addition & 0 deletions tests/data/configs/format_text.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ highlight: true
indent_character: '|'
journals:
default: features/journals/simple.journal
longtitle: features/journals/long_title.journal
linewrap: 80
tagsymbols: '@'
template: false
Expand Down
9 changes: 9 additions & 0 deletions tests/data/journals/long_title.journal
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
[2022-07-01 23:40] Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Laoreet id donec ultrices tincidunt arcu. Dolor sit amet consectetur adipiscing elit duis tristique sollicitudin. Ut pharetra sit amet aliquam id diam maecenas. Habitasse platea dictumst quisque sagittis. Aliquam purus sit amet luctus venenatis lectus magna. Aenean sed adipiscing diam donec adipiscing tristique risus nec feugiat. Diam vel quam elementum pulvinar etiam non. Odio ut enim blandit volutpat maecenas volutpat. Lacus vestibulum sed arcu non odio euismod lacinia at quis.

Pretium nibh ipsum consequat nisl. Turpis massa sed elementum tempus egestas. Egestas maecenas pharetra convallis posuere morbi. Urna nunc id cursus metus. Enim blandit volutpat maecenas volutpat blandit. Neque viverra justo nec ultrices dui sapien eget. At tempor commodo ullamcorper a lacus vestibulum sed arcu. Tristique et egestas quis ipsum suspendisse ultrices gravida dictum. Pharetra diam sit amet nisl suscipit. Viverra ipsum nunc aliquet bibendum enim facilisis gravida neque. Massa tempor nec feugiat nisl pretium fusce id. Eget duis at tellus at urna condimentum mattis pellentesque. In vitae turpis massa sed elementum tempus egestas. Sed euismod nisi porta lorem mollis aliquam ut porttitor. Aliquet bibendum enim facilisis gravida neque convallis.
Venenatis tellus in metus vulputate eu scelerisque felis imperdiet. Nunc mi ipsum faucibus vitae aliquet nec. Tellus pellentesque eu tincidunt tortor. Et egestas quis ipsum suspendisse ultrices gravida dictum fusce ut. Est ullamcorper eget nulla facilisi etiam dignissim diam quis. Libero id faucibus nisl tincidunt eget nullam. Consectetur adipiscing elit ut aliquam purus. Nunc sed augue lacus viverra vitae congue eu consequat. Feugiat vivamus at augue eget arcu. Vitae purus faucibus ornare suspendisse sed nisi lacus sed viverra. Volutpat maecenas volutpat blandit aliquam. Nulla facilisi cras fermentum odio eu. Ornare arcu odio ut sem nulla pharetra diam sit amet. Est sit amet facilisis magna etiam tempor. Et molestie ac feugiat sed. Imperdiet sed euismod nisi porta lorem mollis aliquam ut porttitor.

[2022-07-02 00:10] Magna fermentum iaculis eu non diam phasellus. Non pulvinar neque laoreet suspendisse interdum consectetur libero id. Scelerisque felis imperdiet proin fermentum leo. Eu ultrices vitae auctor eu augue ut lectus. Bibendum arcu vitae elementum curabitur vitae nunc sed. Tincidunt tortor aliquam nulla facilisi cras fermentum. Malesuada nunc vel risus commodo viverra maecenas accumsan lacus vel. Non sodales neque sodales ut. Enim nulla aliquet porttitor lacus luctus accumsan. Volutpat blandit aliquam etiam erat velit scelerisque in dictum non. Egestas fringilla phasellus faucibus scelerisque. At risus viverra adipiscing at in tellus integer feugiat scelerisque. Eget velit aliquet sagittis id consectetur purus ut. Imperdiet nulla malesuada pellentesque elit eget gravida cum sociis. Lacus vestibulum sed arcu non odio euismod lacinia at. Elit pellentesque habitant morbi tristique. Vestibulum lorem sed risus ultricies. Integer eget aliquet nibh praesent tristique magna sit amet purus. Quisque id diam vel quam elementum pulvinar etiam non quam. Nisi scelerisque eu ultrices vitae auctor eu augue.

Malesuada fames ac turpis egestas integer eget aliquet. Feugiat scelerisque varius morbi enim nunc faucibus a. At lectus urna duis convallis convallis tellus id interdum velit. Convallis convallis tellus id interdum velit laoreet. Odio eu feugiat pretium nibh ipsum consequat. Potenti nullam ac tortor vitae purus faucibus ornare. Ac auctor augue mauris augue neque gravida in. Quam adipiscing vitae proin sagittis nisl rhoncus mattis. Tempor nec feugiat nisl pretium. Scelerisque in dictum non consectetur a erat. Lacus suspendisse faucibus interdum posuere lorem. Ultricies mi quis hendrerit dolor magna. Morbi tincidunt ornare massa eget egestas purus viverra. Magna fermentum iaculis eu non diam phasellus vestibulum lorem sed. Mauris a diam maecenas sed enim ut sem viverra aliquet. Sollicitudin nibh sit amet commodo nulla facilisi nullam vehicula.
Nec dui nunc mattis enim ut tellus elementum sagittis vitae. Id porta nibh venenatis cras sed felis. Id leo in vitae turpis. Lorem ipsum dolor sit amet consectetur adipiscing elit pellentesque. Dignissim enim sit amet venenatis urna cursus eget nunc scelerisque. Donec ac odio tempor orci dapibus ultrices in iaculis nunc. Velit laoreet id donec ultrices tincidunt arcu non. Egestas diam in arcu cursus euismod quis. Dolor morbi non arcu risus quis. Nisi lacus sed viverra tellus in hac habitasse platea. Mattis enim ut tellus elementum sagittis vitae et leo. Non pulvinar neque laoreet suspendisse interdum. Libero volutpat sed cras ornare arcu dui vivamus.
11 changes: 11 additions & 0 deletions tests/lib/helpers.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
# Copyright (C) 2012-2022 jrnl contributors
# License: https://www.gnu.org/licenses/gpl-3.0.html

import fnmatch
import functools
import os

Expand All @@ -17,6 +18,16 @@ def does_directory_contain_files(file_list, directory_path):
return True


def does_directory_contain_n_files(directory_path, number):
count = 0
if not os.path.isdir(directory_path):
return False

count = len(fnmatch.filter(os.listdir(directory_path), "*.*"))

return int(number) == count


def parse_should_or_should_not(should_or_should_not):
if should_or_should_not == "should":
return True
Expand Down
6 changes: 6 additions & 0 deletions tests/lib/then_steps.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
from jrnl.config import scope_config
from tests.lib.helpers import assert_equal_tags_ignoring_order
from tests.lib.helpers import does_directory_contain_files
from tests.lib.helpers import does_directory_contain_n_files
from tests.lib.helpers import get_nested_val
from tests.lib.helpers import parse_should_or_should_not

Expand Down Expand Up @@ -201,6 +202,11 @@ def assert_dir_contains_files(file_list, cache_dir):
assert does_directory_contain_files(file_list, cache_dir["path"])


@then(parse("the cache directory should contain {number} files"))
def assert_dir_contains_n_files(cache_dir, number):
assert does_directory_contain_n_files(cache_dir["path"], number)


@then(parse("the journal directory should contain\n{file_list}"))
def journal_directory_should_contain(config_on_disk, file_list):
scoped_config = scope_config(config_on_disk, "default")
Expand Down