From 12f36e938d32c3648e7636cea861d0a59333d007 Mon Sep 17 00:00:00 2001 From: Edward Betts Date: Mon, 20 Aug 2018 13:33:18 +0100 Subject: [PATCH] Use first line of sourcedoc as title --- sourcing/model.py | 23 +++++++++++++++++------ sourcing/text.py | 6 ++++++ tests/test_text.py | 21 +++++++++++++++++++++ 3 files changed, 44 insertions(+), 6 deletions(-) create mode 100644 tests/test_text.py diff --git a/sourcing/model.py b/sourcing/model.py index f5366bf..5e9286d 100644 --- a/sourcing/model.py +++ b/sourcing/model.py @@ -1,6 +1,7 @@ from flask import url_for from .database import session from .parse import parse_link, parse_sourcedoc_facet, parse_span +from .text import first_non_empty_line from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, ForeignKey from sqlalchemy.types import String, Unicode, Integer, DateTime, Boolean, UnicodeText, Enum @@ -203,18 +204,18 @@ class Item(TimeStampedModel): def set_title_url(self): return self.view_url('set_title') - def title(self, titles=None): + def title_from_link(self, titles=None): if not titles: titles = XanaLink.get_all_titles() - return self.type + ": " + titles.get(self, self.hashid) + return titles.get(self) + + def title(self, titles=None): + return self.type + ': ' + (self.title_from_link(titles) or self.hashid) def has_title(self): titles = XanaLink.get_all_titles() return self in titles - def title_from_link(self): - return XanaLink.get_all_titles().get(self) - def set_title(self, title, user): title_source_doc = SourceDoc(text=title, user=user) session.add(title_source_doc) @@ -278,7 +279,7 @@ class XanaLink(Item): if titles is None: titles = XanaLink.get_all_titles() if self in titles: - return self.type + ": " + titles[self] + return self.type + ': ' + titles[self] parsed = self.parse() @@ -348,5 +349,15 @@ class SourceDoc(Item): result = s[:length - len(end)].rsplit(' ', 1)[0] return result + end + def title(self, titles=None): + titles = XanaLink.get_all_titles() + from_link = self.title_from_link(titles=titles) + if from_link: + return self.type + ': ' + from_link + first_line = first_non_empty_line(self.text) + if first_line: + return self.type + ': ' + first_line + return self.type + ': ' + self.hashid + configure_mappers() diff --git a/sourcing/text.py b/sourcing/text.py index b8cb383..51fdaa3 100644 --- a/sourcing/text.py +++ b/sourcing/text.py @@ -39,3 +39,9 @@ def add_highlight(text, span_start, span_length): cur.append({'text': after}) yield start, cur + +def first_non_empty_line(text): + for start, cur in iter_lines(text): + tidy = cur.strip() + if tidy: + return tidy diff --git a/tests/test_text.py b/tests/test_text.py new file mode 100644 index 0000000..e81eb77 --- /dev/null +++ b/tests/test_text.py @@ -0,0 +1,21 @@ +from sourcing import text + +def test_find_newlines(): + sample = '' + assert list(text.find_newlines(sample)) == [] + + sample = 'aaa\nbbb\nccc\n' + assert list(text.find_newlines(sample)) == [4, 8, 12] + +def test_iter_lines(): + sample = '' + result = list(text.iter_lines(sample)) + assert result == [] + + sample = 'aaa\nbbb\nccc\n' + result = list(text.iter_lines(sample)) + assert result == [(0, 'aaa\n'), (4, 'bbb\n'), (8, 'ccc\n')] + +def test_first_non_empty_line(): + assert text.first_non_empty_line('') is None + assert text.first_non_empty_line(' \n \n') is None