svn: r22020
This commit is contained in:
Paul Franklin 2013-04-19 16:57:48 +00:00
parent 15f7b45d3f
commit c032fc8dae
30 changed files with 70 additions and 71 deletions

View File

@ -235,7 +235,7 @@ except:
# of the format '20/2/2009', '20/02/2009', '20.2.2009', '20.02.2009', # of the format '20/2/2009', '20/02/2009', '20.2.2009', '20.02.2009',
# '20-2-2009', '20-02-2009', '2009/02/20', '2009.02.20', '2009-02-20', # '20-2-2009', '20-02-2009', '2009/02/20', '2009.02.20', '2009-02-20',
# '09-02-20' hence to reduce the possible values to test, make sure month # '09-02-20' hence to reduce the possible values to test, make sure month
# is double digit also day should be double digit, prefebably greater than # is double digit also day should be double digit, preferably greater than
# 12 for human readablity # 12 for human readablity
timestr = time.strftime('%x',(2005,10,25,1,1,1,1,1,1)) timestr = time.strftime('%x',(2005,10,25,1,1,1,1,1,1))

View File

@ -425,7 +425,7 @@ class BasePluginManager(object):
def get_plugin_data(self, category): def get_plugin_data(self, category):
""" """
Gets all of the data from general plugins of type category. Gets all of the data from general plugins of type category.
plugin.data maybe a single item, an iterable, or a callable. plugin.data may be a single item, an iterable, or a callable.
>>> PLUGMAN.get_plugin_data('CSS') >>> PLUGMAN.get_plugin_data('CSS')
<a list of raw data items> <a list of raw data items>

View File

@ -468,14 +468,14 @@ class Options(object):
def load_previous_values(self): def load_previous_values(self):
""" """
Modifies all options to have the value they were last used as. Call this Modifies all options to have the value they were last used as.
function after all options have been added. Call this function after all options have been added.
""" """
self.handler = OptionHandler(self.name,self.options_dict,self.person_id) self.handler = OptionHandler(self.name,self.options_dict,self.person_id)
def add_user_options(self): def add_user_options(self):
""" """
Set up UI controls (widgets) for the options specific for this modul. Set up UI controls (widgets) for the options specific for this module.
This method MUST be overridden by modules that define new options. This method MUST be overridden by modules that define new options.

View File

@ -299,7 +299,7 @@ class StyleSheet(object):
return ParagraphStyle(self.para_styles[name]) return ParagraphStyle(self.para_styles[name])
def get_paragraph_style_names(self): def get_paragraph_style_names(self):
"Return the the list of paragraph names in the StyleSheet" "Return the list of paragraph names in the StyleSheet"
return list(self.para_styles.keys()) return list(self.para_styles.keys())
def add_draw_style(self, name, style): def add_draw_style(self, name, style):
@ -320,7 +320,7 @@ class StyleSheet(object):
return GraphicsStyle(self.draw_styles[name]) return GraphicsStyle(self.draw_styles[name])
def get_draw_style_names(self): def get_draw_style_names(self):
"Return the the list of draw style names in the StyleSheet" "Return the list of draw style names in the StyleSheet"
return list(self.draw_styles.keys()) return list(self.draw_styles.keys())
def add_table_style(self, name, style): def add_table_style(self, name, style):
@ -341,7 +341,7 @@ class StyleSheet(object):
return TableStyle(self.table_styles[name]) return TableStyle(self.table_styles[name])
def get_table_style_names(self): def get_table_style_names(self):
"Return the the list of table style names in the StyleSheet" "Return the list of table style names in the StyleSheet"
return list(self.table_styles.keys()) return list(self.table_styles.keys())
def add_cell_style(self, name, style): def add_cell_style(self, name, style):
@ -362,7 +362,7 @@ class StyleSheet(object):
return TableCellStyle(self.cell_styles[name]) return TableCellStyle(self.cell_styles[name])
def get_cell_style_names(self): def get_cell_style_names(self):
"Return the the list of cell style names in the StyleSheet" "Return the list of cell style names in the StyleSheet"
return list(self.cell_styles.keys()) return list(self.cell_styles.keys())
#------------------------------------------------------------------------- #-------------------------------------------------------------------------

View File

@ -281,7 +281,7 @@ class TextDoc(object):
def stop_link(self): def stop_link(self):
""" """
Stop the link section. Defaults to stoppping the underlining Stop the link section. Defaults to stopping the underlining
for docgen types that don't support links. for docgen types that don't support links.
""" """
self.stop_underline() self.stop_underline()

View File

@ -29,8 +29,6 @@ Option class representing an enumerated list of possible values.
# gramps modules # gramps modules
# #
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
from __future__ import print_function
from . import Option from . import Option
from gramps.gen.const import GRAMPS_LOCALE as glocale from gramps.gen.const import GRAMPS_LOCALE as glocale
_ = glocale.translation.sgettext _ = glocale.translation.sgettext

View File

@ -286,7 +286,7 @@ class OptionListCollection(_options.OptionListCollection):
def set_last_paper_metric(self, paper_metric): def set_last_paper_metric(self, paper_metric):
""" """
Set the last paper metric used for the any report in this collection. Set the last paper metric used for any report in this collection.
@param paper_metric: whether to use metric. @param paper_metric: whether to use metric.
@type paper_name: boolean @type paper_name: boolean
""" """
@ -294,7 +294,7 @@ class OptionListCollection(_options.OptionListCollection):
def get_last_paper_metric(self): def get_last_paper_metric(self):
""" """
Return the last paper metric used for the any report in this collection. Return the last paper metric used for any report in this collection.
@returns: returns whether or not to use metric @returns: returns whether or not to use metric
@rtype: boolean @rtype: boolean
""" """
@ -302,7 +302,7 @@ class OptionListCollection(_options.OptionListCollection):
def set_last_paper_name(self, paper_name): def set_last_paper_name(self, paper_name):
""" """
Set the last paper name used for the any report in this collection. Set the last paper name used for any report in this collection.
@param paper_name: name of the paper to set. @param paper_name: name of the paper to set.
@type paper_name: str @type paper_name: str
""" """
@ -310,7 +310,7 @@ class OptionListCollection(_options.OptionListCollection):
def get_last_paper_name(self): def get_last_paper_name(self):
""" """
Return the last paper name used for the any report in this collection. Return the last paper name used for any report in this collection.
@returns: returns the name of the paper @returns: returns the name of the paper
@rtype: str @rtype: str
""" """
@ -318,7 +318,7 @@ class OptionListCollection(_options.OptionListCollection):
def set_last_orientation(self, orientation): def set_last_orientation(self, orientation):
""" """
Set the last orientation used for the any report in this collection. Set the last orientation used for any report in this collection.
@param orientation: orientation to set. @param orientation: orientation to set.
@type orientation: int @type orientation: int
""" """
@ -326,7 +326,7 @@ class OptionListCollection(_options.OptionListCollection):
def get_last_orientation(self): def get_last_orientation(self):
""" """
Return the last orientation used for the any report in this Return the last orientation used for any report in this
collection. collection.
@returns: last orientation used @returns: last orientation used
@rtype: int @rtype: int
@ -335,15 +335,15 @@ class OptionListCollection(_options.OptionListCollection):
def set_last_custom_paper_size(self, custom_paper_size): def set_last_custom_paper_size(self, custom_paper_size):
""" """
Set the last custom paper size used for the any report in this collection. Set the last custom paper size used for any report in this collection.
@param custom_paper_size: size to set in cm (width, height) @param custom_paper_size: size to set in cm (width, height)
@type margins: [float, float] @type custom_paper_size: [float, float]
""" """
self.last_custom_paper_size = copy.copy(custom_paper_size) self.last_custom_paper_size = copy.copy(custom_paper_size)
def get_last_custom_paper_size(self): def get_last_custom_paper_size(self):
""" """
Return the last custom paper size used for the any report in this Return the last custom paper size used for any report in this
collection. collection.
@returns: list of last custom paper size used in cm (width, height) @returns: list of last custom paper size used in cm (width, height)
@rtype: [float, float] @rtype: [float, float]
@ -352,7 +352,7 @@ class OptionListCollection(_options.OptionListCollection):
def set_last_margins(self, margins): def set_last_margins(self, margins):
""" """
Set the last margins used for the any report in this collection. Set the last margins used for any report in this collection.
@param margins: margins to set in cm (left, right, top, bottom) @param margins: margins to set in cm (left, right, top, bottom)
@type margins: [float, float, float, float] @type margins: [float, float, float, float]
""" """
@ -360,7 +360,7 @@ class OptionListCollection(_options.OptionListCollection):
def get_last_margins(self): def get_last_margins(self):
""" """
Return the last margins used for the any report in this Return the last margins used for any report in this
collection. collection.
@returns: list of last margins used in cm (left, right, top, bottom) @returns: list of last margins used in cm (left, right, top, bottom)
@rtype: [float, float, float, float] @rtype: [float, float, float, float]
@ -369,7 +369,7 @@ class OptionListCollection(_options.OptionListCollection):
def set_last_margin(self, pos, value): def set_last_margin(self, pos, value):
""" """
Set the last margin used for the any report in this collection. Set the last margin used for any report in this collection.
@param pos: pos to set (0-4) (left, right, top, bottom) @param pos: pos to set (0-4) (left, right, top, bottom)
@type pos: int @type pos: int
@param value: value to set the margin to in cm @param value: value to set the margin to in cm
@ -379,7 +379,7 @@ class OptionListCollection(_options.OptionListCollection):
def get_last_margin(self, pos): def get_last_margin(self, pos):
""" """
Return the last margins used for the any report in this Return the last margins used for any report in this
collection. collection.
@param pos: position in margins list @param pos: position in margins list
@type pos: int @type pos: int
@ -390,7 +390,7 @@ class OptionListCollection(_options.OptionListCollection):
def set_last_css_filename(self, css_filename): def set_last_css_filename(self, css_filename):
""" """
Set the last css used for the any report in this collection. Set the last css used for any report in this collection.
css_filename: name of the style to set. css_filename: name of the style to set.
""" """
@ -398,13 +398,13 @@ class OptionListCollection(_options.OptionListCollection):
def get_last_css_filename(self): def get_last_css_filename(self):
""" """
Return the last template used for the any report in this collection. Return the last template used for any report in this collection.
""" """
return self.last_css_filename return self.last_css_filename
def set_last_format_name(self, format_name): def set_last_format_name(self, format_name):
""" """
Set the last format used for the any report in this collection. Set the last format used for any report in this collection.
format_name: name of the format to set. format_name: name of the format to set.
""" """
@ -412,7 +412,7 @@ class OptionListCollection(_options.OptionListCollection):
def get_last_format_name(self): def get_last_format_name(self):
""" """
Return the last format used for the any report in this collection. Return the last format used for any report in this collection.
""" """
return self.last_format_name return self.last_format_name
@ -495,7 +495,7 @@ class OptionParser(_options.OptionParser):
""" """
Create a OptionParser class that populates the passed collection. Create a OptionParser class that populates the passed collection.
collection: BookList to be loaded from the file. collection: OptionListCollection to be loaded from the file.
""" """
_options.OptionParser.__init__(self, collection) _options.OptionParser.__init__(self, collection)
self.common = False self.common = False

View File

@ -80,7 +80,7 @@ class PageSizeParser(handler.ContentHandler):
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
# #
# Parse XML file. If failed, used default # Parse XML file. If it fails, use the default
# #
#------------------------------------------------------------------------- #-------------------------------------------------------------------------
try: try:

View File

@ -179,7 +179,7 @@ def get_person_mark(db, person):
Return a IndexMark that can be used to index a person in a report Return a IndexMark that can be used to index a person in a report
@param db: the GRAMPS database instance @param db: the GRAMPS database instance
@param person: the the key is for @param person: the key is for
""" """
if not person: if not person:
return None return None

View File

@ -438,7 +438,7 @@ class GrampsLocale(object):
def __init__(self, localedir=None, lang=None, domain=None, languages=None): def __init__(self, localedir=None, lang=None, domain=None, languages=None):
""" """
Init a GrampsLocale. Run __init_first_instance() to set up the Init a GrampsLocale. Run __init_first_instance() to set up the
environement if this is the first run. Return __first_instance environment if this is the first run. Return __first_instance
otherwise if called without arguments. otherwise if called without arguments.
""" """
global _hdlr global _hdlr

View File

@ -1483,7 +1483,7 @@ class GuiSurnameColorOption(Gtk.HBox):
def __add_clicked(self, obj): # IGNORE:W0613 - obj is unused def __add_clicked(self, obj): # IGNORE:W0613 - obj is unused
""" """
Handle the the add surname button. Handle the add surname button.
""" """
skip_list = set() skip_list = set()
i = self.__model.get_iter_first() i = self.__model.get_iter_first()
@ -1501,7 +1501,7 @@ class GuiSurnameColorOption(Gtk.HBox):
def __del_clicked(self, obj): # IGNORE:W0613 - obj is unused def __del_clicked(self, obj): # IGNORE:W0613 - obj is unused
""" """
Handle the the delete surname button. Handle the delete surname button.
""" """
(path, column) = self.__tree_view.get_cursor() (path, column) = self.__tree_view.get_cursor()
if (path): if (path):

View File

@ -43,7 +43,7 @@ from gramps.gen.display.name import displayer as name_displayer
from gramps.gen.filters import GenericFilter, rules from gramps.gen.filters import GenericFilter, rules
from ...utils import ProgressMeter from ...utils import ProgressMeter
from gramps.gen.proxy import (PrivateProxyDb, from gramps.gen.proxy import (PrivateProxyDb,
LivingProxyDb, LivingProxyDb,
FilterProxyDb, FilterProxyDb,
ReferencedBySelectionProxyDb) ReferencedBySelectionProxyDb)

View File

@ -109,11 +109,11 @@ class DocReportDialog(ReportDialog):
def doc_type_changed(self, obj): def doc_type_changed(self, obj):
"""This routine is called when the user selects a new file """This routine is called when the user selects a new file
formats for the report. It adjust the various dialog sections format for the report. It adjusts the various dialog sections
to reflect the appropriate values for the currently selected to reflect the appropriate values for the currently selected
file format. For example, a HTML document doesn't need any file format. For example, an HTML document doesn't need any
paper size/orientation options, but it does need a css paper size/orientation options, but it does need a css
file. Those chances are made here.""" file. Those changes are made here."""
docgen_plugin = obj.get_active_plugin() docgen_plugin = obj.get_active_plugin()
if docgen_plugin.get_extension(): if docgen_plugin.get_extension():
self.open_with_app.set_sensitive(True) self.open_with_app.set_sensitive(True)

View File

@ -193,11 +193,11 @@ class GraphvizReportDialog(ReportDialog):
def doc_type_changed(self, obj): def doc_type_changed(self, obj):
""" """
This routine is called when the user selects a new file This routine is called when the user selects a new file
formats for the report. It adjust the various dialog sections format for the report. It adjusts the various dialog sections
to reflect the appropriate values for the currently selected to reflect the appropriate values for the currently selected
file format. For example, a HTML document doesn't need any file format. For example, a HTML document doesn't need any
paper size/orientation options, but it does need a template paper size/orientation options, but it does need a template
file. Those chances are made here. file. Those changes are made here.
""" """
self.open_with_app.set_sensitive(True) self.open_with_app.set_sensitive(True)

View File

@ -215,7 +215,7 @@ class ReportDialog(ManagedWindow):
# #
#------------------------------------------------------------------------ #------------------------------------------------------------------------
def add_user_options(self): def add_user_options(self):
"""Called to allow subclasses add widgets to the dialog form. """Called to allow subclasses to add widgets to the dialog form.
It is called immediately before the window is displayed. All It is called immediately before the window is displayed. All
calls to add_option or add_frame_option should be called in calls to add_option or add_frame_option should be called in
this task.""" this task."""
@ -297,16 +297,16 @@ class ReportDialog(ManagedWindow):
def setup_style_frame(self): def setup_style_frame(self):
"""Set up the style frame of the dialog. This function relies """Set up the style frame of the dialog. This function relies
on other routines create the default style for this report, on other routines to create the default style for this report,
and to read in any user defined styles for this report. It and to read in any user-defined styles for this report. It
the builds a menu of all the available styles for the user to then builds a menu of all the available styles for the user to
choose from.""" choose from."""
# Build the default style set for this report. # Build the default style set for this report.
self.default_style = StyleSheet() self.default_style = StyleSheet()
self.options.make_default_style(self.default_style) self.options.make_default_style(self.default_style)
if self.default_style.is_empty(): if self.default_style.is_empty():
# Don't display the option of no styles are used # Don't display the option if no styles are used
return return
# Styles Frame # Styles Frame

View File

@ -243,7 +243,7 @@ class StyleEditor(object):
p = self.current_p p = self.current_p
self.pname.set_text( '<span size="larger" weight="bold">%s</span>' % self.pname.set_text( '<span size="larger" weight="bold">%s</span>' %
self.current_name ) self.current_name)
self.pname.set_use_markup(True) self.pname.set_use_markup(True)
descr = p.get_description() descr = p.get_description()

View File

@ -403,7 +403,7 @@ class PageView(DbGUIElement):
def build_widget(self): def build_widget(self):
""" """
Builds the container widget for the main view pane. Must be overridden Builds the container widget for the main view pane. Must be overridden
by the the base class. Returns a gtk container widget. by the base class. Returns a gtk container widget.
""" """
raise NotImplementedError raise NotImplementedError

View File

@ -792,7 +792,7 @@ class GridGramplet(GuiGramplet):
def edit_title(self, widget): def edit_title(self, widget):
""" """
Edit the the title in the GUI. Edit the title in the GUI.
""" """
parent = widget.get_parent() parent = widget.get_parent()
widget.hide() widget.hide()

View File

@ -346,7 +346,8 @@ class AsciiDoc(BaseDoc, TextDoc):
#-------------------------------------------------------------------- #--------------------------------------------------------------------
# #
# Start a cell. Set the self.in_cell flag, increment the curren cell number. # Start a cell. Set the self.in_cell flag,
# increment the current cell number.
# #
#-------------------------------------------------------------------- #--------------------------------------------------------------------
def start_cell(self, style_name, span=1): def start_cell(self, style_name, span=1):

View File

@ -835,7 +835,7 @@ class ODFDoc(BaseDoc, TextDoc, DrawDoc):
wrt1 = self.cntnt1.write wrt1 = self.cntnt1.write
for style in self.StyleList_notes: for style in self.StyleList_notes:
if style[1] == "FontFace": if style[1] == "FontFace":
# Restore any spaced that were replaced by hyphens in # Restore any spaces that were replaced by hyphens in
# libodfbackend # libodfbackend
wrt1( wrt1(
'<style:font-face ' + '<style:font-face ' +
@ -887,7 +887,7 @@ class ODFDoc(BaseDoc, TextDoc, DrawDoc):
) )
elif style[1] == "FontFace": elif style[1] == "FontFace":
# Restore any spaced that were replaced by hyphens in # Restore any spaces that were replaced by hyphens in
# libodfbackend # libodfbackend
wrt2( wrt2(
'<style:style ' + '<style:style ' +

View File

@ -126,7 +126,7 @@ class PSDrawDoc(BaseDoc, DrawDoc):
'%%EndComments\n' '%%EndComments\n'
'/cm { 28.34 mul } def\n' '/cm { 28.34 mul } def\n'
'% build iso-latin-1 version of a font\n' '% build iso-latin-1 version of a font\n'
'/font-to-iso-latin-1 { % <font> font-to-iso-latin-1 <font>\n' '/font-to-iso-latin-1 { % <font> font-to-iso-latin-1 <font>\n'
'%% reencode for iso latin1; from the 2nd edition red book, sec 5.6.1\n' '%% reencode for iso latin1; from the 2nd edition red book, sec 5.6.1\n'
'dup length dict begin {1 index /FID ne {def} {pop pop} ifelse} forall\n' 'dup length dict begin {1 index /FID ne {def} {pop pop} ifelse} forall\n'
'/Encoding ISOLatin1Encoding def currentdict end\n' '/Encoding ISOLatin1Encoding def currentdict end\n'
@ -134,7 +134,7 @@ class PSDrawDoc(BaseDoc, DrawDoc):
'exch definefont\n' 'exch definefont\n'
'} def\n' '} def\n'
'\n' '\n'
'/find-latin-font { % <name> find-latin-font <font>\n' '/find-latin-font { % <name> find-latin-font <font>\n'
'findfont font-to-iso-latin-1\n' 'findfont font-to-iso-latin-1\n'
'} def\n' '} def\n'
) )

View File

@ -2,7 +2,7 @@
# #
# Copyright (C) 2000-2007 Donald N. Allingham # Copyright (C) 2000-2007 Donald N. Allingham
# Copyright (C) 2007-2008 Brian G. Matherly # Copyright (C) 2007-2008 Brian G. Matherly
# Copyright (C) 2010 Jakim Friant# # Copyright (C) 2010 Jakim Friant
# Copyright (C) 2010 Craig J. Anderson # Copyright (C) 2010 Craig J. Anderson
# #
# This program is free software; you can redistribute it and/or modify # This program is free software; you can redistribute it and/or modify
@ -920,8 +920,8 @@ class AncestorTreeOptions(MenuReportOptions):
#Spouse_disp = EnumeratedListOption(_("Show spouses of\nthe center " #Spouse_disp = EnumeratedListOption(_("Show spouses of\nthe center "
# "person"), 0) # "person"), 0)
#Spouse_disp.add_item( 0, _("No. Do not show Spouses")) #Spouse_disp.add_item( 0, _("No. Do not show Spouses"))
#Spouse_disp.add_item( 1, _("Yes, and use the the Main Display Format")) #Spouse_disp.add_item( 1, _("Yes, and use the Main Display Format"))
#Spouse_disp.add_item( 2, _("Yes, and use the the Secondary " #Spouse_disp.add_item( 2, _("Yes, and use the Secondary "
# "Display Format")) # "Display Format"))
#Spouse_disp.set_help(_("Show spouses of the center person?")) #Spouse_disp.set_help(_("Show spouses of the center person?"))
#menu.add_option(category_name, "Spouse_disp", Spouse_disp) #menu.add_option(category_name, "Spouse_disp", Spouse_disp)

View File

@ -1054,7 +1054,7 @@ class MakeReport(object):
def __calc_movements(self, left_group, right_group): def __calc_movements(self, left_group, right_group):
""" for a family group, see if parents or children need to be """ for a family group, see if parents or children need to be
moved down so everyone is the the right/left of each other. moved down so everyone is to the right/left of each other.
return a right y_cm and a left y_cm. these points will be used return a right y_cm and a left y_cm. these points will be used
to move parents/children down. to move parents/children down.

View File

@ -4587,13 +4587,13 @@ class GedcomParser(UpdateCallback):
def __person_asso(self, line, state): def __person_asso(self, line, state):
""" """
Parse the ASSO tag, add the the referenced person to the person we Parse the ASSO tag, add the referenced person to the person we
are currently parsing. The GEDCOM spec indicates that valid ASSO tag are currently parsing. The GEDCOM spec indicates that valid ASSO tag
is: is:
n ASSO @<XREF:INDI>@ {0:M} n ASSO @<XREF:INDI>@ {0:M}
And the the sub tags are: And the sub tags are:
ASSOCIATION_STRUCTURE:= ASSOCIATION_STRUCTURE:=
+1 RELA <RELATION_IS_DESCRIPTOR> {1:1} +1 RELA <RELATION_IS_DESCRIPTOR> {1:1}

View File

@ -61,7 +61,7 @@ class FamilyGroup(Report):
def __init__(self, database, options, user): def __init__(self, database, options, user):
""" """
Create the DetAncestorReport object that produces the report. Create the FamilyGroup object that produces the report.
The arguments are: The arguments are:

View File

@ -3690,10 +3690,10 @@ class EventPages(BasePage):
# family event # family event
if int(_type) in _EVENTMAP: if int(_type) in _EVENTMAP:
handle_list = set(self.dbase_.find_backlink_handles(event_handle, handle_list = set(self.dbase_.find_backlink_handles(event_handle,
include_classes = ['Family', 'Person'])) include_classes = ['Family', 'Person']))
else: else:
handle_list = set(self.dbase_.find_backlink_handles(event_handle, handle_list = set(self.dbase_.find_backlink_handles(event_handle,
include_classes = ['Person'])) include_classes = ['Person']))
if handle_list: if handle_list:
trow = Html("tr") trow = Html("tr")

View File

@ -114,7 +114,7 @@ def path_append_parent(path=None):
and return the abspath to the parent as a possible convenience and return the abspath to the parent as a possible convenience
The path parm may be a dir or a file or missing. The path parm may be a dir or a file or missing.
If a file, the the dir of the file is used. If a file, the dir of the file is used.
If missing the test-module caller's dir is used. If missing the test-module caller's dir is used.
And then the parent of that dir is appended (if not already present) And then the parent of that dir is appended (if not already present)