diff --git a/src/data/Web_Visually.css b/src/data/Web_Visually.css
index dca8893e7..f0e2c1e86 100644
--- a/src/data/Web_Visually.css
+++ b/src/data/Web_Visually.css
@@ -32,7 +32,7 @@ see .
--------------------------------------------------------------------------------------------------
Color Palette
--------------------------------------------------------------------------------------------------
-brown dark #542
+brown dark #453619, #542
brown light #C1B398
gray #696969
green dark #228A22
@@ -57,12 +57,6 @@ body {
color: #000;
background-color: #FFF;
}
-body#NarrativeWeb_Horizontal {
- padding: 158px 0px 0px 0px;
-}
-body#NarrativeWeb_Vertical {
- padding: 128px 0px 0px 44px;
-}
/* General Elements
----------------------------------------------------- */
@@ -132,15 +126,17 @@ h3 {
text-align:center;
margin:0;
padding:.5em 20px .2em 20px;
- border-bottom:double 4px #000;
+ border-bottom:double 4px #228A22;
}
h4 {
font:normal 1.2em/1.2em serif;
color: #FFF;
margin-top: .3cm;
padding:.2em 0 .2em 20px;
- background-color: #228A22;
- border-bottom:solid 4px #A97;
+ background-color: #453619;
+ border-width: 4px 0px 4px 0px;
+ border-style: solid;
+ border-color: #5D835F;
}
h5, h6 {
font:normal 1em/1.2em serif;
@@ -174,7 +170,7 @@ ol li a {
text-decoration:none;
}
ol li a:hover {
- text-decoration:underline;
+ text-decoration: none;
}
a {
color: #542;
@@ -185,7 +181,7 @@ a:visited {
a:hover {
color: #000;
background-color: #C1B398;
- text-decoration:underline;
+ text-decoration: none;
}
span.preposition {
padding-left:1em;
@@ -238,7 +234,7 @@ div#footer a, div#footer a:visited {
}
div#footer a:hover {
color: #000;
- text-decoration:underline;
+ text-decoration: none;
}
div#footer img {
border:0;
@@ -300,7 +296,6 @@ div#navigation ul li a, div#subnavigation ul li a {
}
div#navigation ul li a:hover, div#subnavigation ul li a:hover {
background-color: #C1B398;
- color: #000;
}
div#navigation ul li.CurrentSection a, div#subnavigation ul li.CurrentSection a {
font-weight:bold;
@@ -314,7 +309,7 @@ div#navigation ul li.CurrentSection a:hover {
}
div#subnavigation ul li.CurrentSection a {
border-width: 0px 0px 2px 0px;
- border-color: #FFF;
+ border-color: #6AF364;
}
/* Alphabet Navigation
@@ -419,8 +414,6 @@ table.infolist tbody tr td.ColumnPartner a {
padding:.6em 10px;
vertical-align:middle;
}
-table.infolist tbody tr td.ColumnPartner a:hover { }
-
table.infolist tbody tr td.ColumnParents {
font-size:.9em;
}
@@ -434,8 +427,10 @@ table.infolist tbody tr td.ColumnParents span.mother:before {
/* Surnames
----------------------------------------------------- */
-#Surnames { }
-
+#Surnames {
+ margin: 0;
+ padding: 0;
+}
#SurnameDetail p#description {
padding-top:0;
}
@@ -452,11 +447,8 @@ table.surnamelist thead tr th a, table.surnamelist thead tr th a:visited {
text-decoration:none;
padding:.2em 10px;
}
-table.surnamelist tr th:hover { }
-
table.surnamelist thead tr th.ColumnLetter {
- padding-left:20px;
- padding-right:10px;
+ padding: 0px 10px 0px 20px;
}
table.surnamelist tbody tr td {
background-color: #D8F3D6;
@@ -482,14 +474,12 @@ table#SortByName tbody tr td.ColumnSurname a {
display:block;
padding:.1em 10px .3em 10px;
}
-table#SortByCount tbody tr td.ColumnQuantity { }
-
table.surnamelist tbody tr td.ColumnSurname:hover,
table#SortByName tbody tr td.ColumnSurname:hover {
background-color: #C1B398;
}
table.surname {
- border-bottom:solid 1px #000;
+ border-bottom:solid 1px #5D835F;
}
table.surname thead tr th.ColumnName {
width:20%;
@@ -508,8 +498,9 @@ table.surname tbody tr td.ColumnName a {
display:block;
padding:.6em 10px .6em 20px;
}
-table.surname tbody tr td.ColumnName a span.grampsid { }
-
+table.surname tbody tr td.ColumnName a span.grampsid {
+ color: #000;
+}
table.surname tbody tr td.ColumnName:hover {
background-color: #C1B398;
}
@@ -527,8 +518,10 @@ table.surname tbody tr td.ColumnParents {
/* Individuals
----------------------------------------------------- */
-div#Individuals { }
-
+div#Individuals {
+ margin: 0;
+ padding: 0;
+}
div#Individuals table.individuallist {
border-bottom: solid 1px #5D835F;
}
@@ -562,9 +555,10 @@ div#Individuals div table.infolist tr td p {
div#Individuals div table.infolist tr td p a {
display:inline;
}
-
-div#IndividualDetail { }
-
+div#IndividualDetail {
+ padding: 0;
+ margin: 0;
+}
#IndividualDetail div table.infolist tr td {
font:normal .9em/1.2em sans-serif;
vertical-align:top;
@@ -573,7 +567,7 @@ div#IndividualDetail div table.infolist tr td a {
display:inline;
}
div#IndividualDetail table.infolist tr td a:hover {
- text-decoration:underline;
+ text-decoration: none;
}
div#IndividualDetail table.infolist tbody tr td.ColumnAttribute {
width:10%;
@@ -584,13 +578,14 @@ div#IndividualDetail div.subsection table tr td:first-child {
/* Places
----------------------------------------------------- */
-#Places { }
-
+#Places {
+ margin: 0;
+ padding: 0;
+}
#Places table.infolist tbody tr td.ColumnLetter {
background-color: #D8F3D6;
}
#Places table.infolist tbody tr td.ColumnName {
- padding:0;
background-color: #FFF;
}
#Places table.infolist tbody tr td.ColumnName a {
@@ -599,8 +594,10 @@ div#IndividualDetail div.subsection table tr td:first-child {
/* EventList and EventDetail
----------------------------------------------------- */
-div#EventList, div#EventDetail { }
-
+div#EventList, div#EventDetail {
+ margin: 0;
+ padding: 0;
+}
div#events table.eventlist {
margin-top: .3cm;
}
@@ -612,7 +609,7 @@ div#events table.eventlist tbody tr td.ColumnPlace a {
}
table.eventlist tbody tr td {
background-color: #FFF;
- border-bottom: dashed 1px #000;
+ border-bottom: dashed 1px #5D835F;
}
table.eventlist tbody tr td.ColumnEvent {
width: 20%;
@@ -639,12 +636,8 @@ table.eventlist tbody tr td.ColumnPerson {
table.eventlist tbody tr td.ColumnPartner {
width: 35%;
}
-div#families table.eventlist {
- margin: 0;
- padding: 0;
-}
div#EventList table.eventlist tbody tr.BeginName {
- border-top: solid 1px #000;
+ border-top: solid 1px #5D835F;
}
div#EventList table.eventlist tbody tr td {
padding: 4px 0px 4px 0px;
@@ -678,8 +671,10 @@ div#EventDetail table.eventlist tbody tr td.ColumnEvent {
/* Gallery
----------------------------------------------------- */
-#Gallery { }
-
+#Gallery {
+ margin: 0;
+ padding: 0;
+}
#Gallery table.infolist tbody tr td.ColumnRowLabel,
#Gallery table.infolist tbody tr td.ColumnDate {
background-color: #D8F3D6;
@@ -693,7 +688,7 @@ div#EventDetail table.eventlist tbody tr td.ColumnEvent {
padding:.1em 10px .3em 10px;
}
#Gallery table.gallerylist tbody tr td {
- border-bottom: dashed 1px #000;
+ border-bottom: dashed 1px #5D835F;
}
#GalleryNav {
font:normal 1em/1em sans-serif;
@@ -704,10 +699,8 @@ div#EventDetail table.eventlist tbody tr td.ColumnEvent {
#GalleryNav a {
font-weight:bold;
text-decoration:none;
- border:solid 1px #228A22;
+ border:solid 1px #5D835F;
}
-#GalleryNav a:hover { }
-
#GalleryNav a#Previous {
padding:.5em .7em .3em .7em;
}
@@ -747,29 +740,28 @@ div#EventDetail table.eventlist tbody tr td.ColumnEvent {
}
#GalleryDetail div#summaryarea table.gallery {
padding-bottom:0;
- margin-top:1.5em;
- margin-bottom:0;
+ margin: 1.5em 0 0 0;
border-style:solid;
border-width:2px 0 1px 0;
- border-color: #000;
+ border-color: #5D835F;
}
table.exifdata tr td.ColumnAttribute {
- border-top:solid 1px #000;
+ border-top:solid 1px #5D835F;
width:60%;
}
table.exiflist tr td.ColumnValue {
- border-top:solid 1px #000;
+ border-top:solid 1px #5D835F;
width:45%;
}
/* Contact
----------------------------------------------------- */
#Contact #summaryarea {
- background-color: #D8F3D7;
+ background-color: #D8F3D6;
width:500px;
margin:0 auto;
padding:3em;
- border:double 4px #000;
+ border:double 4px #5D835F;
}
#Contact #summaryarea img {
float:right;
@@ -805,9 +797,6 @@ table.exiflist tr td.ColumnValue {
#email a {
text-decoration:none;
}
-#email a:hover {
- text-decoration:underline;
-}
/* Download
----------------------------------------------------- */
diff --git a/src/plugins/webreport/NarrativeWeb.py b/src/plugins/webreport/NarrativeWeb.py
index 93485489f..984e2da61 100644
--- a/src/plugins/webreport/NarrativeWeb.py
+++ b/src/plugins/webreport/NarrativeWeb.py
@@ -128,6 +128,7 @@ COUNTY = _("County")
COUNTRY = _("Country")
DHEAD = _("Date")
DESCRHEAD = _("Description")
+GRAMPSID = _("GRAMPS ID")
LATITUDE = _("Latitude")
LOCATIONS = _("Alternate Locations")
LONGITUDE = _("Longitude")
@@ -303,6 +304,7 @@ class BasePage(object):
self.linkhome = report.options['linkhome']
self.create_media = report.options['gallery']
self.inc_events = report.options['inc_events']
+ self.exiftagsopt = report.options['exiftagsopt']
def get_birth_date(self, db, person):
""" Will return a date object for a person's birthdate """
@@ -500,9 +502,7 @@ class BasePage(object):
else:
self.place_list[place_handle] = [lnk]
- place = self.place_link(place_handle,
- ReportUtils.place_name(db,
- place_handle), up = True)
+ place = self.place_link(place_handle, ReportUtils.place_name(db, place_handle), up = True)
else:
place = ''
@@ -576,8 +576,7 @@ class BasePage(object):
place_hyper = None
if place:
place_name = ReportUtils.place_name(db, place_handle)
- place_hyper = self.place_link(place_handle, place_name,
- place.gramps_id, subdirs)
+ place_hyper = self.place_link(place_handle, place_name, up = subdirs)
# wrap it all up and return to its callers
# position 0 = translatable label, position 1 = column class
@@ -1959,31 +1958,31 @@ class PlacePage(BasePage):
summaryarea += table
if not self.noid:
- trow = [ Html("tr"),
- Html("td", _("GRAMPS ID"), class_ = "ColumnAttribute", inline = True),
+ trow = Html("tr") + (
+ Html("td", GRAMPSID, class_ = "ColumnAttribute", inline = True),
Html("td", place.gramps_id, class_ = "ColumnValue", inline = True)
- ]
+ )
table += trow
if place.main_loc:
ml = place.main_loc
for val in [
- (LATITUDE, place.lat),
- (LONGITUDE, place.long),
- (STREET, ml.street),
- (CITY, ml.city),
- (PARISH, ml.parish),
- (COUNTY, ml.county),
- (STATE, ml.state),
- (POSTAL, ml.postal),
- (COUNTRY, ml.country),
- (LOCATIONS, place.get_alternate_locations()) ]:
+ (LATITUDE, place.lat),
+ (LONGITUDE, place.long),
+ (STREET, ml.street),
+ (CITY, ml.city),
+ (PARISH, ml.parish),
+ (COUNTY, ml.county),
+ (STATE, ml.state),
+ (POSTAL, ml.postal),
+ (COUNTRY, ml.country),
+ (LOCATIONS, place.get_alternate_locations() ) ]:
if val[1]:
- trow = [ Html("tr"),
+ trow = Html("tr") + (
Html("td", val[0], class_ = "ColumnAttribute", inline = True),
Html("td", val[1], class_ = "ColumnValue", inline = True)
- ]
+ )
table += trow
# place gallery
@@ -2003,14 +2002,14 @@ class PlacePage(BasePage):
placedetail += urllinks
# source references
-# sourcerefs = self.get_citation_links(place.get_source_references() )
-# if sourcerefs is not None:
-# placedetail += sourcerefs
+ sourcerefs = self.get_citation_links(place.get_source_references() )
+ if sourcerefs is not None:
+ placedetail += sourcerefs
# place references
- referenceslist = self.display_references(place_list[place.handle])
- if referenceslist is not None:
- placedetail += referenceslist
+ reflist = self.display_references(place_list[place.handle])
+ if reflist is not None:
+ placedetail += reflist
# add clearline for proper styling
# add footer section
@@ -2193,29 +2192,29 @@ class EventPage(BasePage):
samerow = True if (data == " " or (colclass == "Date" or "Event")) \
else False
- trow = [ Html("tr"),
+ trow = Html("tr") + (
Html("td", label, class_ = "ColumnAttribute", inline = True),
Html('td', data, class_ = "Column%s" % colclass, inline = samerow)
- ]
+ )
tbody += trow
# get person hyperlink
url = self.report.build_url_fname_html(person.handle, "ppl", self.up)
person_hyper = self.person_link(url, person, True, gid = person.gramps_id)
- trow = [ Html("tr"),
- Html("td", _('Person'), class_ = "ColumnAttribute", inline = True),
+ trow = Html("tr") + (
+ Html("td", _("Person"), class_ = "ColumnAttribute", inline = True),
Html("td", person_hyper, class_ = "ColumnPerson")
- ]
+ )
tbody += trow
# display partner if type is either Marriage or Divorce
if partner is not None:
url = self.report.build_url_fname_html(partner.handle, "ppl", self.up)
partner_hyper = self.person_link(url, partner, True, gid = partner.gramps_id)
- trow = [ Html("tr"),
- Html("td", _('Partner'), class_ = "ColumnAttribute", inline = True),
+ trow = Html("tr") + (
+ Html("td", _("Partner"), class_ = "ColumnAttribute", inline = True),
Html("td", partner_hyper, class_ = "ColumnPartner")
- ]
+ )
tbody += trow
# Narrative subsection
@@ -2244,9 +2243,9 @@ class MediaPage(BasePage):
(prev, next, page_number, total_pages) = info
db = report.database
- photo = db.get_object_from_handle(handle)
+ media = db.get_object_from_handle(handle)
# TODO. How do we pass my_media_list down for use in BasePage?
- BasePage.__init__(self, report, title, photo.gramps_id)
+ BasePage.__init__(self, report, title, media.gramps_id)
"""
*************************************
@@ -2316,240 +2315,235 @@ class MediaPage(BasePage):
self.bibli = Bibliography()
# get media type to be used primarily with "img" tags
- mime_type = photo.get_mime_type()
+ mime_type = media.get_mime_type()
mtype = Mime.get_description(mime_type)
if mime_type:
note_only = False
- newpath = self.copy_source_file(handle, photo)
+ newpath = self.copy_source_file(handle, media)
target_exists = newpath is not None
else:
note_only = True
target_exists = False
- self.copy_thumbnail(handle, photo)
- self.page_title = photo.get_description()
+ self.copy_thumbnail(handle, media)
+ self.page_title = media.get_description()
mediapage, body = self.write_header("%s - %s" % (_("Media"), self.page_title))
- # begin GalleryDetail division
- mediadetail = Html("div", class_ = "content", id = "GalleryDetail")
- body += mediadetail
+ # begin MediaDetail division
+ with Html("div", class_ = "content", id = "GalleryDetail") as mediadetail:
+ body += mediadetail
- # gallery navigation
- gallerynav = Html("div", id = 'GalleryNav')
- mediadetail += gallerynav
- if prev:
- gallerynav += self.gallery_nav_link(prev, _('Previous'), True)
- data = _('%(page_number)d of '
- '%(total_pages)d' ) % {
- 'page_number' : page_number, 'total_pages' : total_pages }
- gallerynav += Html("span", data, id = 'GalleryPages')
- if next:
- gallerynav += self.gallery_nav_link(next, _('Next'), True)
+ # media navigation
+ with Html("div", id = "GalleryNav") as medianav:
+ mediadetail += medianav
+ if prev:
+ medianav += self.media_nav_link(prev, _("Previous"), True)
+ data = _('%(page_number)d of '
+ '%(total_pages)d' ) % {
+ 'page_number' : page_number, 'total_pages' : total_pages }
+ medianav += Html("span", data, id = "GalleryPages")
+ if next:
+ medianav += self.media_nav_link(next, _("Next"), True)
- # missing media error msg
- errormsg = _('The file has been moved or deleted.')
- missingimage = Html("span", errormsg, class_ = "MissingImage")
+ # missing media error msg
+ errormsg = _("The file has been moved or deleted.")
+ missingimage = Html("span", errormsg, class_ = "MissingImage")
- # begin summaryarea division
- summaryarea = Html("div", id = 'summaryarea')
- mediadetail += summaryarea
- if mime_type:
- if mime_type.startswith("image/"):
- if not target_exists:
- mediadisplay = Html("div", id = 'GalleryDisplay') + \
- missingimage
- summaryarea += mediadisplay
- else:
- # Check how big the image is relative to the requested 'initial'
- # image size. If it's significantly bigger, scale it down to
- # improve the site's responsiveness. We don't want the user to
- # have to await a large download unnecessarily. Either way, set
- # the display image size as requested.
- orig_image_path = Utils.media_path_full(db, photo.get_path())
- (width, height) = ImgManip.image_size(orig_image_path)
- max_width = self.report.options['maxinitialimagewidth']
- max_height = self.report.options['maxinitialimageheight']
- scale_w = (float(max_width)/width) or 1 # the 'or 1' is so that
- # a max of zero is ignored
-
- scale_h = (float(max_height)/height) or 1
- scale = min(scale_w, scale_h)
- new_width = int(width*scale)
- new_height = int(height*scale)
- if scale < 0.8:
- # scale factor is significant enough to warrant making a smaller image
- initial_image_path = '%s_init.jpg' % os.path.splitext(newpath)[0]
- initial_image_data = ImgManip.resize_to_jpeg_buffer(orig_image_path,
- new_width, new_height)
- if self.report.archive:
- filed, dest = tempfile.mkstemp()
- os.write(filed, initial_image_data)
- os.close(filed)
- self.report.archive.add(dest, initial_image_path)
+ # begin summaryarea division
+ with Html("div", id = "summaryarea") as summaryarea:
+ mediadetail += summaryarea
+ if mime_type:
+ if mime_type.startswith("image/"):
+ if not target_exists:
+ with Html("div", missingimage, id = "MediaDisplay") as mediadisplay:
+ summaryarea += mediadisplay
else:
- filed = open(os.path.join(self.html_dir, initial_image_path), 'w')
- filed.write(initial_image_data)
- filed.close()
+ # Check how big the image is relative to the requested 'initial'
+ # image size. If it's significantly bigger, scale it down to
+ # improve the site's responsiveness. We don't want the user to
+ # have to await a large download unnecessarily. Either way, set
+ # the display image size as requested.
+ orig_image_path = Utils.media_path_full(db, media.get_path())
+ (width, height) = ImgManip.image_size(orig_image_path)
+ max_width = self.report.options['maxinitialimagewidth']
+ max_height = self.report.options['maxinitialimageheight']
+ scale_w = (float(max_width)/width) or 1 # the 'or 1' is so that
+ # a max of zero is ignored
+
+ scale_h = (float(max_height)/height) or 1
+ scale = min(scale_w, scale_h)
+ new_width = int(width*scale)
+ new_height = int(height*scale)
+ if scale < 0.8:
+ # scale factor is significant enough to warrant making a smaller image
+ initial_image_path = '%s_init.jpg' % os.path.splitext(newpath)[0]
+ initial_image_data = ImgManip.resize_to_jpeg_buffer(orig_image_path,
+ new_width, new_height)
+ if self.report.archive:
+ filed, dest = tempfile.mkstemp()
+ os.write(filed, initial_image_data)
+ os.close(filed)
+ self.report.archive.add(dest, initial_image_path)
+ else:
+ filed = open(os.path.join(self.html_dir, initial_image_path), 'w')
+ filed.write(initial_image_data)
+ filed.close()
+ else:
+ # not worth actually making a smaller image
+ initial_image_path = newpath
+
+ # TODO. Convert disk path to URL.
+ url = self.report.build_url_fname(initial_image_path, None, self.up)
+ if initial_image_path != newpath:
+ scalemsg = Html("p", "(%d x %d)" % (width, height), inline = True)
+ summaryarea += scalemsg
+ with Html("div", style = 'width: %dpx; height: %dpx' % (new_width, new_height)) as mediadisplay:
+ summaryarea += mediadisplay
+
+ # Feature #2634; display the mouse-selectable regions.
+ # See the large block at the top of this function where
+ # the various regions are stored in _region_items
+ if len(_region_items):
+ ordered = Html("ol", class_ = "RegionBox")
+ mediadisplay += ordered
+ while len(_region_items) > 0:
+ (name, x, y, w, h, linkurl) = _region_items.pop()
+ ordered += Html("li", style = "left:%d%%; top:%d%%; width:%d%%; height:%d%%;"
+ % (x, y, w, h)) +(
+ Html("a", name, href = linkurl)
+ )
+
+ # display the image
+ if initial_image_path != newpath:
+ url = self.report.build_url_fname(newpath, None, self.up)
+ mediadisplay += Html("a", href = url) + (
+ Html("img", width = new_width, height = new_height, src = url,
+ alt = html_escape(self.page_title))
+ )
else:
- # not worth actually making a smaller image
- initial_image_path = newpath
+ dirname = tempfile.mkdtemp()
+ thmb_path = os.path.join(dirname, "temp.png")
+ if ThumbNails.run_thumbnailer(mime_type,
+ Utils.media_path_full(db, media.get_path()),
+ thmb_path, 320):
+ try:
+ path = self.report.build_path("preview", media.handle)
+ npath = os.path.join(path, media.handle) + ".png"
+ self.report.copy_file(thmb_path, npath)
+ path = npath
+ os.unlink(thmb_path)
+ except IOError:
+ path = os.path.join("images", "document.png")
+ else:
+ path = os.path.join("images", "document.png")
+ os.rmdir(dirname)
- # TODO. Convert disk path to URL.
- url = self.report.build_url_fname(initial_image_path, None, self.up)
- if initial_image_path != newpath:
- scalemsg = Html("p", '(%d x %d).' % (width, height), inline = True)
- summaryarea += scalemsg
- mediadisplay = Html("div", style='width:%dpx; height:%dpx;' % (new_width, new_height))
- summaryarea += mediadisplay
-
- # Feature #2634; display the mouse-selectable regions.
- # See the large block at the top of this function where
- # the various regions are stored in _region_items
- if len(_region_items):
- ordered = Html("ol", class_ = "RegionBox")
- mediadisplay += ordered
- while len(_region_items) > 0:
- (name, x, y, w, h, linkurl) = _region_items.pop()
- ordered += Html("li", style='left:%d%%; top:%d%%; width:%d%%; height:%d%%;'
- % (x, y, w, h)) +(
- Html("a", name, href = linkurl)
- )
-
- # display the image
- if initial_image_path != newpath:
- url = self.report.build_url_fname(newpath, None, self.up)
- mediadisplay += (Html("a", href = url) +
- Html("img", width=new_width, height = new_height, src = url,
- alt = html_escape(self.page_title))
- )
- else:
- dirname = tempfile.mkdtemp()
- thmb_path = os.path.join(dirname, "temp.png")
- if ThumbNails.run_thumbnailer(mime_type,
- Utils.media_path_full(db,
- photo.get_path()),
- thmb_path, 320):
- try:
- path = self.report.build_path('preview', photo.handle)
- npath = os.path.join(path, photo.handle) + '.png'
- self.report.copy_file(thmb_path, npath)
- path = npath
- os.unlink(thmb_path)
- except IOError:
- path = os.path.join('images', 'document.png')
+ with Html("div", id = "GalleryDisplay") as mediadisplay:
+ summaryarea += mediadisplay
+ if target_exists:
+ # TODO. Convert disk path to URL
+ url = self.report.build_url_fname(newpath, None, self.up)
+ hyper = Html("a", href = url)
+ # TODO. Mixup url and path
+ # path = convert_disk_path_to_url(path)
+ url = self.report.build_url_fname(path, None, self.up)
+ if hyper:
+ hyper += Html("img", src = url, alt = html_escape(self.page_title))
+ else:
+ hyper = Html("img", src = url, alt = html_escape(self.page_title))
+ if target_exists:
+ mediadisplay += hyper
+ else:
+ mediadisplay += missingimage
else:
- path = os.path.join('images', 'document.png')
- os.rmdir(dirname)
+ with Html("div", id = "GalleryDisplay") as mediadisplay:
+ summaryarea += mediadisplay
+ url = self.report.build_url_image("document.png", "images", self.up)
+ mediadisplay += Html("img", src = url, alt = html_escape(self.page_title))
- mediadisplay = Html("div", id = 'GalleryDisplay')
- summaryarea += mediadisplay
- if target_exists:
- # TODO. Convert disk path to URL
- url = self.report.build_url_fname(newpath, None, self.up)
- hyper = Html("a", href = url)
- # TODO. Mixup url and path
- # path = convert_disk_path_to_url(path)
- url = self.report.build_url_fname(path, None, self.up)
- if hyper:
- hyper += Html("img", src=url, alt = html_escape(self.page_title))
- else:
- hyper = Html("img", src=url, alt = html_escape(self.page_title))
- if target_exists:
- mediadisplay += hyper
- else:
- mediadisplay += missingimage
- else:
- mediadisplay = Html("div", id = 'GalleryDisplay')
- summaryarea += mediadisplay
- url = self.report.build_url_image('document.png', 'images', self.up)
- mediadisplay += Html("img", src=url, alt = html_escape(self.page_title))
+ # media title
+ title = Html("h3", html_escape(self.page_title.strip()), inline = True)
+ summaryarea += title
- # media title
- title = Html("h3", html_escape(self.page_title.strip()), inline = True)
- summaryarea += title
+ # begin media table
+ with Html("table", class_ = "infolist gallery") as table:
+ summaryarea += table
- # begin media table
- with Html("table", class_ = "infolist gallery") as table:
- summaryarea += table
-
- # GRAMPS ID
- media_gid = photo.gramps_id
- if not self.noid and media_gid:
- trow = Html("tr") + (
- Html("td", _('GRAMPS ID'), class_ = "ColumnAttribute", inline = True),
- Html("td", media_gid, class_ = "ColumnValue", inline = True)
- )
- table += trow
-
- # mime type
- if mime_type:
- trow = Html("tr") + (
- Html("td", _("File Type"), class_ = "ColumnAttribute", inline = True),
- Html("td", mime_type, class_ = "ColumnValue", inline = True)
- )
- table += trow
-
- # media date
- date = format_date(photo.get_date_object() )
- if date:
- trow = Html("tr") + (
- Html("td", DHEAD, class_ = "ColumnAttribute", inline = True),
- Html("td", date, class_ = "ColumnValue", inline = True)
- )
- table += trow
-
- # display image Exif tags/ keys if any?
- if (pyexiftaglib and mime_type.startswith('image/')):
- """
- # Determine if the python exif lib is installed on the system?
- # yes, then use it and determine if the photo has anything written inside of it?
- """
-
- image = pyexiv2.Image("%s" % Utils.media_path_full(db, photo.get_path()))
- image.readMetadata()
-
- # exif data does exists
- if len(image.exifKeys()):
-
- # add clearline for better page layout
- mediadetail += fullclear
-
- # add exif title header
- mediadetail += Html("h4", _("Image Exif Tags"), inline = True)
-
- # begin exif table
- with Html("table", class_ = "exifdata") as table:
- mediadetail += table
-
- for keytag in image.exifKeys():
- trow = [ Html("tr"),
- Html("td", keytag, class_ = "ColumnAttribute", inline = True),
- Html("td", image[keytag], class_ = "ColumnValue", inline = True)
- ]
+ # GRAMPS ID
+ media_gid = media.gramps_id
+ if not self.noid and media_gid:
+ trow = Html("tr") + (
+ Html("td", GRAMPSID, class_ = "ColumnAttribute", inline = True),
+ Html("td", media_gid, class_ = "ColumnValue", inline = True)
+ )
table += trow
- #################################################
+ # mime type
+ if mime_type:
+ trow = Html("tr") + (
+ Html("td", _("File Type"), class_ = "ColumnAttribute", inline = True),
+ Html("td", mime_type, class_ = "ColumnValue", inline = True)
+ )
+ table += trow
- # get media notes
- notelist = self.display_note_list(photo.get_note_list() )
- if notelist is not None:
- mediadetail += notelist
+ # media date
+ date = media.get_date_object()
+ if date:
+ trow = Html("tr") + (
+ Html("td", DHEAD, class_ = "ColumnAttribute", inline = True),
+ Html("td", format(date), class_ = "ColumnValue", inline = True)
+ )
+ table += trow
- # get attribute list
- attrlist = self.display_attr_list(photo.get_attribute_list(), False)
- if attrlist is not None:
- mediadetail += attrlist
+ # display image Exif tags/ keys if any?
+ if ((pyexiftaglib and self.exiftagsopt) and mime_type.startswith("image/")):
+ """
+ # Determine if the python exif lib is installed on the system?
+ # yes, then use it and determine if the photo has anything written inside of it?
+ """
- # get media sources
- srclist = self.display_media_sources(photo)
- if srclist is not None:
- mediadetail += srclist
+ image = pyexiv2.Image("%s" % Utils.media_path_full(db, media.get_path()) )
+ image.readMetadata()
- # get media references
- reflist = self.display_references(my_media_list)
- if reflist is not None:
- mediadetail += reflist
+ # exif data does exists
+ if len(image.exifKeys() ):
+
+ # add exif title header
+ mediadetail += Html("h4", _("Image Exif Tags"), inline = True)
+
+ # begin exif table
+ with Html("table", class_ = "exifdata") as table:
+ mediadetail += table
+
+ for keytag in image.exifKeys():
+ trow = Html("tr") + (
+ Html("td", keytag, class_ = "ColumnAttribute"),
+ Html("td", image[keytag], class_ = "ColumnValue")
+ )
+ table += trow
+
+ ##################### End of Exif Tags #####################################################
+
+ # get media notes
+ notelist = self.display_note_list(media.get_note_list() )
+ if notelist is not None:
+ mediadetail += notelist
+
+ # get attribute list
+ attrlist = self.display_attr_list(media.get_attribute_list(), False)
+ if attrlist is not None:
+ mediadetail += attrlist
+
+ # get media sources
+ srclist = self.display_media_sources(media)
+ if srclist is not None:
+ mediadetail += srclist
+
+ # get media references
+ reflist = self.display_references(my_media_list)
+ if reflist is not None:
+ mediadetail += reflist
# add clearline for proper styling
# add footer section
@@ -2560,11 +2554,11 @@ class MediaPage(BasePage):
# and close the file
self.XHTMLWriter(mediapage, of)
- def gallery_nav_link(self, handle, name, up = False):
+ def media_nav_link(self, handle, name, up = False):
url = self.report.build_url_fname_html(handle, "img", up)
- name = html_escape(name)
- hyper = Html("a", name, id = name, href = url, title = name, inline = True)
+ img_name = html_escape(name)
+ hyper = Html("a", img_name, name = img_name, id = img_name, href = url, title = img_name, inline = True)
# return hyperlink to its callers
return hyper
@@ -2925,15 +2919,15 @@ class SourcePage(BasePage):
if not self.noid:
grampsid = source.gramps_id
- for (label, val) in [(_('GRAMPS ID'), grampsid),
- (_('Author'), source.author),
- (_('Publication information'), source.pubinfo),
- (_('Abbreviation'), source.abbrev)]:
+ for (label, val) in [(GRAMPSID, grampsid),
+ (_("Author"), source.author),
+ (_("Publication information"), source.pubinfo),
+ (_("Abbreviation"), source.abbrev)]:
if val:
- trow = [ Html("tr"),
+ trow = Html("tr") + (
Html("td", label, class_ = "ColumnAttribute"),
Html("td", val, class_ = "ColumnValue")
- ]
+ )
tbody += trow
# additional media
@@ -3011,11 +3005,11 @@ class MediaListPage(BasePage):
if not title:
title = "[untitled]"
- trow = [ Html("tr"),
+ trow = Html("tr") + (
Html("td", index, class_ = "ColumnRowLabel", inline = True),
Html("td", self.media_ref_link(handle, title), class_ = "ColumnName"),
Html("td", date, class_ = "ColumnDate", inline = True)
- ]
+ )
tbody += trow
# increment counter
@@ -3639,7 +3633,7 @@ class IndividualPage(BasePage):
db = self.report.database
self.page_title = self.sort_name
- thumbnail = self.display_first_image_as_thumbnail(self.person.get_media_list())
+ thumbnail = self.display_first_image_as_thumbnail(self.person.get_media_list() )
section_title = Html("h3", self.get_name(self.person), inline = True)
@@ -3664,11 +3658,11 @@ class IndividualPage(BasePage):
pname = pname[2:]
type_ = str( name.get_type() )
- trow = ( Html("tr") +
+ trow = Html("tr") + (
Html("td", type_, class_ = "ColumnAttribute", inline = True)
)
table += trow
- tcell = Html("td", pname, class_ = "ColumnValue", inline = True)
+ tcell = Html("td", pname, class_ = "ColumnValue")
trow += tcell
# display any notes associated with this name
@@ -3685,44 +3679,43 @@ class IndividualPage(BasePage):
# attach note
unordered += note_text
- # display call names
+ # display call name
first_name = primary_name.get_first_name()
for name in all_names:
call_name = name.get_call_name()
if call_name and call_name != first_name:
- call_name += self.get_citation_links(
- name.get_source_references() )
- trow = [ Html("tr"),
- Html("td", _('Call Name'), class_ = "ColumnAttribute", inline = True),
+ call_name += self.get_citation_links(name.get_source_references() )
+ trow = Html("tr") + (
+ Html("td", _("Call Name"), class_ = "ColumnAttribute", inline = True),
Html("td", call_name, class_ = "ColumnValue", inline = True)
- ]
+ )
table += trow
# display the nickname attribute
nick_name = self.person.get_nick_name()
if nick_name and nick_name != first_name:
- nick_name += self.get_citation_links(
- self.person.get_source_references() )
- trow = [ Html("tr"),
+ nick_name += self.get_citation_links(self.person.get_source_references() )
+ trow = Html("tr") + (
Html("td", _("Nick Name"), class_ = "ColumnAttribute", inline = True),
Html("td", nick_name, class_ = "ColumnValue", inline = True)
- ]
+ )
table += trow
# GRAMPS ID
- if not self.noid:
- trow = [ Html("tr"),
- Html("td", _("GRAMPS ID"), class_ = "ColumnAttribute", inline = True),
- Html("td", self.person.gramps_id, class_ = "ColumnValue", inline = True)
- ]
+ person_gid = self.person.get_gramps_id()
+ if not self.noid and person_gid:
+ trow = Html("tr") + (
+ Html("td", GRAMPSID, class_ = "ColumnAttribute", inline = True),
+ Html("td", person_gid, class_ = "ColumnValue", inline = True)
+ )
table += trow
# Gender
gender = self.gender_map[self.person.gender]
- trow = [ Html("tr"),
+ trow = Html("tr") + (
Html("td", _("Gender"), class_ = "ColumnAttribute", inline = True),
Html("td", gender, class_ = "ColumnValue", inline = True)
- ]
+ )
table += trow
# Age At Death???
@@ -3733,8 +3726,8 @@ class IndividualPage(BasePage):
if birth:
birth_date = birth.get_date_object()
- if birth_date is not None:
- alive = probably_alive(self.person, db, date.Today())
+ if birth_date is not None and birth_date != Date.EMPTY:
+ alive = probably_alive(self.person, db, date.Today() )
death_date = None
death_ref = self.person.get_death_ref()
@@ -3743,33 +3736,33 @@ class IndividualPage(BasePage):
if death:
death_date = death.get_date_object()
- if not alive and death_date is not None:
+ if not alive and (death_date is not None and death_date != Date.EMPTY):
nyears = death_date - birth_date
- nyears.format(precision=3)
- trow = [ Html("tr"),
+ nyears.format(precision = 3)
+ trow = Html("tr") + (
Html("td", _("Age at Death"), class_ = "ColumnAttribute", inline = True),
Html("td", nyears, class_ = "ColumnValue", inline = True)
- ]
+ )
table += trow
# time since they passed away
nyears = date.Today() - death_date
- nyears.format(precision=3)
+ nyears.format(precision = 3)
# get appropriate gender pronoun
- if gender == "female":
+ if gender == Person.FEMALE:
gdr_str = "she"
- elif gender == "male":
+ elif gender == Person.MALE:
gdr_str = "he"
else:
gdr_str = "unknown"
time_str = _("It has been %(time)s, since %(gdr_str)s has died..") % {
'time' : nyears, 'gdr_str' : gdr_str }
- trow = [ Html("tr"),
+ trow = Html("tr") + (
Html("td", " ", class_ = "ColumnAttribute", inline = True),
Html("td", time_str, class_ = "ColumnValue", inline = True)
- ]
+ )
table += trow
# return all three pieces to its caller
@@ -3789,7 +3782,7 @@ class IndividualPage(BasePage):
# begin events division and section title
with Html("div", class_ = "subsection", id = "events") as section:
- section += Html("h4", _('Events'), inline = True)
+ section += Html("h4", _("Events"), inline = True)
# begin events table
with Html("table", class_ = "infolist eventlist") as table:
@@ -3823,8 +3816,7 @@ class IndividualPage(BasePage):
@param: subdirs = True or False
@param: hyp = show hyperlinked evt type or not?
"""
- tbody += self.display_event_row(event, evt_ref, True, False, True,
- False, True, True)
+ tbody += self.display_event_row(event, evt_ref, True, False, True, False, True, True)
# return section to its caller
return section
@@ -3840,7 +3832,7 @@ class IndividualPage(BasePage):
# begin addresses division and title
with Html("div", class_ = "subsection", id = "Addresses") as section:
- section += Html("h4", _('Addresses'), inline = True)
+ section += Html("h4", _("Addresses"), inline = True)
# write out addresses()
section += self.dump_addresses(self.person)
@@ -3860,7 +3852,7 @@ class IndividualPage(BasePage):
# begin LDS Ordinance division and section title
with Html("div", class_ = "subsection", id = "LDSOrdinance") as section:
- section += Html("h4", _('Latter-Day Saints (LDS) Ordinance'), inline = True)
+ section += Html("h4", _("Latter-Day Saints/ LDS Ordinance"), inline = True)
# ump individual LDS ordinance list
section += self.dump_ordinance(db, self.person)
@@ -3925,7 +3917,7 @@ class IndividualPage(BasePage):
# begin parents division
with Html("div", class_ = "subsection", id = "parents") as section:
- section += Html("h4", _('Parents'), inline = True)
+ section += Html("h4", _("Parents"), inline = True)
# begin parents table
with Html("table", class_ = "infolist") as table:
@@ -3951,7 +3943,7 @@ class IndividualPage(BasePage):
if not first:
trow = Html("tr") +(
- Html("td", " ", colspan=2, inline = True)
+ Html("td", " ", colspan = 2, inline = True)
)
table += trow
else:
@@ -3962,14 +3954,15 @@ class IndividualPage(BasePage):
trow = Html("tr")
table += trow
- tabcol1, tabcol2 = self.display_parent(father_handle, _('Father'), frel)
- trow += (tabcol1, tabcol2)
+ tcell1, tcell2 = self.display_parent(father_handle, _("Father"), frel)
+ trow += (tcell1, tcell2)
mother_handle = family.get_mother_handle()
if mother_handle:
trow = Html("tr")
table += trow
- tabcol1, tabcol2 = self.display_parent(mother_handle, _('Mother'), mrel)
- trow += (tabcol1, tabcol2)
+
+ tcell1, tcell2 = self.display_parent(mother_handle, _("Mother"), mrel)
+ trow += (tcell1, tcell2)
first = False
if len(child_ref_list) > 1:
@@ -3979,13 +3972,15 @@ class IndividualPage(BasePage):
# we've already "seen" this child
# now that we have all natural siblings, display them...
- if len(sibling):
- trow = ( Html("tr") +
+ if sibling:
+ trow = Html("tr") + (
Html("td", _("Siblings"), class_ = "ColumnAttribute", inline = True)
)
table += trow
+
tcell = Html("td", class_ = "ColumnValue")
trow += tcell
+
ordered = Html("ol")
tcell += ordered
@@ -4036,13 +4031,15 @@ class IndividualPage(BasePage):
half_siblings.add(half_child_handle)
# now that we have all half- siblings, display them...
- if len(half_siblings):
- trow = ( Html("tr") +
+ if half_siblings:
+ trow = Html("tr") + (
Html("td", _("Half Siblings"), class_ = "ColumnAttribute", inline = True)
)
table += trow
+
tcell = Html("td", class_ = "ColumnValue")
trow += tcell
+
ordered = Html("ol")
tcell += ordered
@@ -4076,7 +4073,7 @@ class IndividualPage(BasePage):
if father_handle:
tmp_parent_handles.add(father_handle)
- while len(tmp_parent_handles) > 0:
+ while len(tmp_parent_handles):
# pop the next parent from the set
parent_handle = tmp_parent_handles.pop()
@@ -4112,7 +4109,7 @@ class IndividualPage(BasePage):
# of families involved is > 1
if len(all_family_handles) > 1:
- while len(all_family_handles) > 0:
+ while len(all_family_handles):
# pop the next family from the set
family_handle = all_family_handles.pop()
# look in this family for children we haven't yet seen
@@ -4127,12 +4124,14 @@ class IndividualPage(BasePage):
# now that we have all step- siblings, display them...
if len(step_siblings):
- trow = ( Html("tr") +
+ trow = Html("tr") + (
Html("td", _("Step Siblings"), class_ = "ColumnAttribute", inline = True)
)
table += trow
+
tcell = Html("td", class_ = "ColumnValue")
- trow += tcell
+ trow += tcell
+
ordered = Html("ol")
tcell += ordered
@@ -4163,7 +4162,7 @@ class IndividualPage(BasePage):
# begin families division and section title
with Html("div", class_ = "subsection", id = "families") as section:
- section += Html("h4", _('Families'), inline = True)
+ section += Html("h4", _("Families"), inline = True)
# begin families table
with Html("table", class_ = "infolist") as table:
@@ -4184,8 +4183,10 @@ class IndividualPage(BasePage):
tcell = Html("td", class_ = "ColumnValue")
trow += tcell
+
ordered = Html("ol")
tcell += ordered
+
childlist = [child_ref.ref for child_ref in childlist]
if self.report.options['birthorder']:
@@ -4200,13 +4201,13 @@ class IndividualPage(BasePage):
ordered += self.display_child_link(child_handle)
# family LDS ordinance list
- famldslist = family.get_lds_ord_list()
+ famldslist = family.lds_ord_list
if famldslist:
- trow = [ Html("tr"),
+ trow = Html("tr") + (
Html("td", " ", class_ = "ColumnType", inline = True),
Html("td", " ", class_ = "ColumnAttribute", inline = True),
Html("td", self.dump_ordinance(db, family, "Family"), class_ = "ColumnValue")
- ]
+ )
table += trow
# return section to its caller
@@ -4245,6 +4246,7 @@ class IndividualPage(BasePage):
Html("td", relstr, class_ = "ColumnAttribute", inline = True)
)
table += trow
+
tcell = Html("td", class_ = "ColumnValue")
trow += tcell
@@ -4297,7 +4299,7 @@ class IndividualPage(BasePage):
spouse_handle = ReportUtils.find_spouse(self.person, rel_family)
if spouse_handle:
spouse = db.get_person_from_handle(spouse_handle)
- pedsp = (Html("li", class_ = "spouse") +
+ pedsp = (Html("li", class_ = "spouse") +
self.pedigree_person(spouse)
)
ped += [pedsp]
@@ -4384,8 +4386,7 @@ class IndividualPage(BasePage):
@param: subdirs = True or False
@param: hyp = show hyperlinked evt type or not?
"""
- tbody += self.display_event_row(event, event_ref, True, False,
- True, False, True, True)
+ tbody += self.display_event_row(event, event_ref, True, False, True, False, True, True)
# return table to its callers
return table
@@ -4492,18 +4493,19 @@ class RepositoryPage(BasePage):
repositorydetail += table
# repository type
- trow = [ Html("tr"),
+ trow = Html("tr") + (
Html("td", THEAD, class_ = "ColumnType", inline = True),
Html("td", str(repo.type), class_ = "ColumnAttribute", inline = True)
- ]
+ )
table += trow
+ # GRAMPS ID
if not self.noid and gid:
# repo gramps id
- trow = [ Html("tr"),
- Html("td", _("GRAMPS ID"), class_ = "ColumnType", inline = True),
+ trow = Html("tr") + (
+ Html("td", GRAMPSID, class_ = "ColumnType", inline = True),
Html("td", gid, class_ = "ColumnAttribute", inline = True)
- ]
+ )
table += trow
# repository: address(es)
@@ -4676,6 +4678,9 @@ class NavWebReport(Report):
self.inc_contact = self.options['contactnote'] or \
self.options['contactimg']
+ # exif tags option
+ self.exiftagsopt = self.options["exiftagsopt"]
+
# name format option
self.name_format = self.options['name_format']
@@ -4892,7 +4897,7 @@ class NavWebReport(Report):
# Copy the Creative Commons icon if the Creative Commons
# license is requested???
- if 0 < self.copyright < len(_CC):
+ if 0 < self.copyright <= len(_CC):
imgs += ["somerights20.gif"]
# include GRAMPS favicon
@@ -4901,16 +4906,19 @@ class NavWebReport(Report):
# we need the blank image gif neede by behaviour.css
imgs += ["blank.gif"]
+ # add the document.png file for media other than photos
+ imgs += ["document.png"]
+
# copy Ancestor Tree graphics if needed???
if self.graph:
imgs += ["Web_Gender_Female.png",
- "Web_Gender_FemaleFFF.png",
- "Web_Gender_Male.png",
- "Web_Gender_MaleFFF.png"]
+ "Web_Gender_FemaleFFF.png",
+ "Web_Gender_Male.png",
+ "Web_Gender_MaleFFF.png"]
- for f in imgs:
- from_path = os.path.join(const.IMAGE_DIR, f)
- self.copy_file(from_path, f, "images")
+ for fname in imgs:
+ from_path = os.path.join(const.IMAGE_DIR, fname)
+ self.copy_file(from_path, fname, "images")
def build_events(self, ind_list, event_dict):
"""
@@ -5525,6 +5533,12 @@ class NavWebOptions(MenuReportOptions):
menu.add_option(category_name, 'gallery', self.__gallery)
self.__gallery.connect('value-changed', self.__gallery_changed)
+ self.__exiftags = BooleanOption(_("Whether to add exif tags to the media page or not?"), False)
+ self.__exiftags.set_help(_("Do you want to add the exif data tags to the page? You will"
+ " need to have the pyexiv2 library installed on your system."
+ "It can be downloaded from here: http://www.exiv2.org/ ."))
+ menu.add_option(category_name, "exiftagsopt", self.__exiftags)
+
self.__maxinitialimagewidth = NumberOption(_("Max width of initial image"),
_DEFAULT_MAX_IMG_WIDTH, 0, 2000)
self.__maxinitialimagewidth.set_help(_("This allows you to set the maximum width "
@@ -5724,9 +5738,11 @@ class NavWebOptions(MenuReportOptions):
"""
if self.__gallery.get_value() == False:
+ self.__exiftags.set_available(False)
self.__maxinitialimagewidth.set_available(False)
self.__maxinitialimageheight.set_available(False)
else:
+ self.__exiftags.set_available(True)
self.__maxinitialimagewidth.set_available(True)
self.__maxinitialimageheight.set_available(True)