Skip to content

Commit

Permalink
Added traceability to index.html.
Browse files Browse the repository at this point in the history
  • Loading branch information
jacebrowning committed Jun 27, 2014
1 parent 5b71e4d commit bfbefcf
Show file tree
Hide file tree
Showing 14 changed files with 405 additions and 352 deletions.
1 change: 1 addition & 0 deletions CHANGES.md
Expand Up @@ -13,6 +13,7 @@ Changelog
- Added `doorstop import FILE PREFIX` to import from the export formats.
- Added `doorstop deleete PREFIX` to delete document directories.
- Renamed `doorstop new ...` to `doorstop create ...`.
- Added tree structure and traceability to `index.html`.

0.6 (2014/5/15)
---------------
Expand Down
3 changes: 3 additions & 0 deletions doorstop/core/document.py
Expand Up @@ -61,6 +61,9 @@ def __str__(self):
else:
return "{} ({})".format(self.prefix, self.relpath)

def __hash__(self):
return hash(self.path)

def __eq__(self, other):
return isinstance(other, self.__class__) and self.path == other.path

Expand Down
13 changes: 12 additions & 1 deletion doorstop/core/files/doorstop.css
Expand Up @@ -94,13 +94,24 @@ blockquote p {
color: #666;
max-width: 460px;
}

hr {
width: 540px;
text-align: left;
margin: 0 auto 0 0;
color: #999;
}

table, th, td {
border:1px solid black;
border:1px solid #DDDDDD;
border-collapse:collapse;
font-weight:normal
}

th {
background-color: #E6E6E6;
}

tr.alt td {
background-color: #F8F8F8;
}
5 changes: 5 additions & 0 deletions doorstop/core/item.py
Expand Up @@ -72,6 +72,9 @@ def __str__(self):
else:
return "{} ({})".format(self.id, self.relpath)

def __hash__(self):
return hash(self.path)

def __eq__(self, other):
return isinstance(other, self.__class__) and self.path == other.path

Expand Down Expand Up @@ -685,6 +688,8 @@ class UnknownItem(object):

UNKNOWN_PATH = '???' # string to represent an unknown path

normative = False # do not include unknown items in traceability

def __init__(self, value, spec=Item):
self._id = ID(value)
self._spec = dir(spec) # list of attribute names for warnings
Expand Down
61 changes: 42 additions & 19 deletions doorstop/core/publisher.py
Expand Up @@ -108,7 +108,8 @@ def _lines_index(filenames, charset='UTF-8', tree=None):
yield ''
with open(CSS) as stream:
for line in stream:
yield line
yield line.strip()
yield ''
yield '</style>'
yield '</head>'
yield '<body>'
Expand Down Expand Up @@ -149,10 +150,22 @@ def _lines_index(filenames, charset='UTF-8', tree=None):
yield '<tr>'
for document in documents:
link = '<a href="{p}.html">{p}</a>'.format(p=document.prefix)
yield ' <td height="25" align="center"> {l} </td>'.format(l=link)
yield ' <th height="25" align="center"> {l} </th>'.format(l=link)
yield '</tr>'
# data
# TODO: add table data
for index, row in enumerate(tree.get_traceability()):
if index % 2:
yield '<tr class="alt">'
else:
yield '<tr>'
for item in row:
if item is None:
link = ''
else:
link = _format_html_item_link(item)
yield ' <td height="25" align="center"> {} </td>'.format(link)
yield '</tr>'

yield '</table>'
yield '</p>'

Expand Down Expand Up @@ -258,14 +271,14 @@ def _lines_markdown(obj, linkify=False):

# Level and Text
standard = "{h} {l} {t}".format(h=heading, l=level, t=item.text)
attr_list = _format_attr_list(item, linkify)
attr_list = _format_md_attr_list(item, linkify)
yield standard + attr_list

else:

# Level and ID
standard = "{h} {l} {i}".format(h=heading, l=level, i=item.id)
attr_list = _format_attr_list(item, linkify)
attr_list = _format_md_attr_list(item, linkify)
yield standard + attr_list

# Text
Expand All @@ -286,8 +299,8 @@ def _lines_markdown(obj, linkify=False):
label = "Parent links:"
else:
label = "Links:"
links = _format_links(items2, linkify)
label_links = _format_label_links(label, links, linkify)
links = _format_md_links(items2, linkify)
label_links = _format_md_label_links(label, links, linkify)
yield label_links

# Child links
Expand All @@ -296,8 +309,8 @@ def _lines_markdown(obj, linkify=False):
if items2:
yield "" # break before links
label = "Child links:"
links = _format_links(items2, linkify)
label_links = _format_label_links(label, links, linkify)
links = _format_md_links(items2, linkify)
label_links = _format_md_label_links(label, links, linkify)
yield label_links

yield "" # break between items
Expand All @@ -311,7 +324,7 @@ def _format_level(level):
return text


def _format_attr_list(item, linkify):
def _format_md_attr_list(item, linkify):
"""Create a Markdown attribute list for a heading."""
return " {{: #{i} }}".format(i=item.id) if linkify else ''

Expand All @@ -326,30 +339,40 @@ def _format_ref(item):
return "Reference: '{r}'".format(r=item.ref)


def _format_links(items, linkify):
def _format_md_links(items, linkify):
"""Format a list of linked items in Markdown."""
links = []
for item in items:
if is_item(item) and linkify:
link = _format_item_link(item)
else:
link = str(item.id) # assume this is an `UnknownItem`
link = _format_md_item_link(item, linkify=linkify)
links.append(link)
return ', '.join(links)


# TODO: delete this function if not used
def _format_document_link(document): # pragma: no cover
def _format_md_document_link(document): # pragma: no cover
"""Format a document link in Markdown."""
return "[{p}]({p}.html)".format(p=document.prefix)


def _format_item_link(item):
def _format_md_item_link(item, linkify=True):
"""Format an item link in Markdown."""
return "[{i}]({p}.html#{i})".format(i=item.id, p=item.document.prefix)
if linkify and is_item(item):
return "[{i}]({p}.html#{i})".format(i=item.id, p=item.document.prefix)
else:
return str(item.id) # if not `Item`, assume this is an `UnknownItem`


def _format_html_item_link(item, linkify=True):
"""Format an item link in HTML."""
if linkify and is_item(item):
link = '<a href="{p}.html#{i}">{i}</a>'.format(i=item.id,
p=item.document.prefix)
return link
else:
return str(item.id) # if not `Item`, assume this is an `UnknownItem`


def _format_label_links(label, links, linkify):
def _format_md_label_links(label, links, linkify):
"""Join a string of label and links with formatting."""
if linkify:
return "*{lb}* {ls}".format(lb=label, ls=links)
Expand Down

0 comments on commit bfbefcf

Please sign in to comment.