Use first line of sourcedoc as title

This commit is contained in:
Edward Betts 2018-08-20 13:33:18 +01:00
parent ea1fa43d5b
commit 12f36e938d
3 changed files with 44 additions and 6 deletions

View file

@ -1,6 +1,7 @@
from flask import url_for from flask import url_for
from .database import session from .database import session
from .parse import parse_link, parse_sourcedoc_facet, parse_span 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.ext.declarative import declarative_base
from sqlalchemy import Column, ForeignKey from sqlalchemy import Column, ForeignKey
from sqlalchemy.types import String, Unicode, Integer, DateTime, Boolean, UnicodeText, Enum from sqlalchemy.types import String, Unicode, Integer, DateTime, Boolean, UnicodeText, Enum
@ -203,18 +204,18 @@ class Item(TimeStampedModel):
def set_title_url(self): def set_title_url(self):
return self.view_url('set_title') return self.view_url('set_title')
def title(self, titles=None): def title_from_link(self, titles=None):
if not titles: if not titles:
titles = XanaLink.get_all_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): def has_title(self):
titles = XanaLink.get_all_titles() titles = XanaLink.get_all_titles()
return self in titles return self in titles
def title_from_link(self):
return XanaLink.get_all_titles().get(self)
def set_title(self, title, user): def set_title(self, title, user):
title_source_doc = SourceDoc(text=title, user=user) title_source_doc = SourceDoc(text=title, user=user)
session.add(title_source_doc) session.add(title_source_doc)
@ -278,7 +279,7 @@ class XanaLink(Item):
if titles is None: if titles is None:
titles = XanaLink.get_all_titles() titles = XanaLink.get_all_titles()
if self in titles: if self in titles:
return self.type + ": " + titles[self] return self.type + ': ' + titles[self]
parsed = self.parse() parsed = self.parse()
@ -348,5 +349,15 @@ class SourceDoc(Item):
result = s[:length - len(end)].rsplit(' ', 1)[0] result = s[:length - len(end)].rsplit(' ', 1)[0]
return result + end 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() configure_mappers()

View file

@ -39,3 +39,9 @@ def add_highlight(text, span_start, span_length):
cur.append({'text': after}) cur.append({'text': after})
yield start, cur yield start, cur
def first_non_empty_line(text):
for start, cur in iter_lines(text):
tidy = cur.strip()
if tidy:
return tidy

21
tests/test_text.py Normal file
View file

@ -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