From fd072528d286d5ab3a682d0745da896129f4737c Mon Sep 17 00:00:00 2001 From: Serge Noiraud Date: Sat, 14 Dec 2019 11:55:16 +0100 Subject: [PATCH] Narrative web: Some improvements (#931) * Narrative web: Some improvements - Event type, Date and place in bold - Family events shifted one column on the left - ancestortree css file before narrative-screen to allow modification - Adaptation for all themes Fixes #11393 * Narrative web: forgot a comma during last merge * Allow scrolling if the ancestor tree is too large * Translation of alternate stylesheets name * Crash when using the family map * Translate only the css title, not the file name * Some minor corrections to css files * Narrative web: open layers optimizations * Narrative web: open layers and link in popup * Narrative web: some events missing in popup * Narrative web: Reference date column too large. Allow the place title to use the maximum of width * NarrativeWeb: shift children from one column - adapt the css files to the new table - some inconsistencies between the source and the css * Make the drop down menu button size usable * NarrativeWeb: Incorrect rendering when use of alternate place name * NarWeb: removing the unused image heigth option * Click on image link gives a not found URL. If the image used in home, introduction or contact page is not already associated by a filtered object, we have a 404 error * NarWeb: Index images and thumbnails pages optional * Narweb: Improper Notes subtitle in web pages * Narweb: List index truncated after 999 * Narweb: NarrativeWeb usage enhancements * Narweb: avoid duplicate files in archive. * Narweb: Add an optional news and updates page: When you have a big database and you make intensive updates, it's useful to have a list of the last modified objects. you can select the period to show and how many records to see per object type. * Narweb: forgot to add the module updates.py * Narweb: some minor changes (pylint, img index bug) * Popups don't work with the last openlayers version It only needs to move the scripts at the end of the html body. Use addEventListener instead of onload in the html body statement. * Narweb: some popup problems * Narweb: better score for pylint --- data/css/Web_Basic-Ash.css | 124 +++++++++-- data/css/Web_Basic-Blue.css | 145 +++++++++---- data/css/Web_Basic-Cypress.css | 134 ++++++++++-- data/css/Web_Basic-Lilac.css | 139 ++++++++++-- data/css/Web_Basic-Peach.css | 139 ++++++++++-- data/css/Web_Basic-Spruce.css | 139 ++++++++++-- data/css/Web_Citations-Outline.css | 2 +- data/css/Web_DropDown-Menus.css | 11 +- data/css/Web_Fade-Menus.css | 2 +- data/css/Web_Horizontal-Menus.css | 2 +- data/css/Web_Mainz.css | 137 ++++++++++-- data/css/Web_Nebraska.css | 183 ++++++++++++---- data/css/Web_Print-Default.css | 40 ++-- data/css/Web_Vertical-Menus.css | 11 +- data/css/Web_Visually.css | 59 +++-- data/css/ancestortree.css | 3 +- data/css/narrative-maps.css | 54 ++++- gramps/plugins/webreport/basepage.py | 186 +++++++++------- gramps/plugins/webreport/common.py | 42 ++-- gramps/plugins/webreport/event.py | 2 +- gramps/plugins/webreport/family.py | 2 +- gramps/plugins/webreport/media.py | 13 +- gramps/plugins/webreport/narrativeweb.py | 142 ++++++++++-- gramps/plugins/webreport/person.py | 262 +++++++++++++---------- gramps/plugins/webreport/place.py | 107 +++++---- gramps/plugins/webreport/repository.py | 2 +- gramps/plugins/webreport/source.py | 2 +- gramps/plugins/webreport/thumbnail.py | 7 +- gramps/plugins/webreport/updates.py | 241 +++++++++++++++++++++ 29 files changed, 1775 insertions(+), 557 deletions(-) create mode 100644 gramps/plugins/webreport/updates.py diff --git a/data/css/Web_Basic-Ash.css b/data/css/Web_Basic-Ash.css index fa0cb5dbb..abc4ea3eb 100644 --- a/data/css/Web_Basic-Ash.css +++ b/data/css/Web_Basic-Ash.css @@ -1,14 +1,14 @@ /* -************************************************************************************************** +******************************************************************************* Copyright Holder and License -************************************************************************************************** +******************************************************************************* GRAMPS Cascading Style Sheet Style Name: Basic-Ash Stylesheet Style Author: Jason M. Simanek (2008) Note: Adapted from GRAMPS original Modern Style stylesheet -************************************************************************************************** +******************************************************************************* This website was created with GRAMPS --------------------------------------------------------------------------------------------------- +------------------------------------------------------------------------------- GRAMPS is a Free Software Project for Genealogy, offering a professional genealogy program, and a wiki open to all. It is a community project, created, @@ -16,7 +16,7 @@ developed and governed by genealogists. Go to to learn more! --------------------------------------------------------------------------------------------------- +------------------------------------------------------------------------------- Copyright 2008 Jason M. Simanek Copyright 2009 Stephane Charette Copyright (C) 2008-2011 Rob G. Healey @@ -36,10 +36,10 @@ A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GRAMPS. If not, see . --------------------------------------------------------------------------------------------------- +------------------------------------------------------------------------------- Color Palette --------------------------------------------------------------------------------------------------- +------------------------------------------------------------------------------- black #000 gray dark #555 @@ -47,14 +47,14 @@ gray #999 gray light #CCC gray very light #EEE white #FFF --------------------------------------------------------------------------------------------------- +------------------------------------------------------------------------------- Characteristic of this style is that it uses the full width of the browser window and that horizontal highlighting bars extend over the full width of the page. --------------------------------------------------------------------------------------------------- +------------------------------------------------------------------------------- NarrativeWeb Styles ------------------------------------------------------------------------------------------------- +------------------------------------------------------------------------------- General Elements ----------------------------------------------------- */ @@ -235,7 +235,7 @@ div#alphanav ul li a:hover { } /* Responsive navigation */ -a.navIcon { +button.navIcon { display: none; } @@ -282,11 +282,14 @@ div#nav::after { .nav li {display: none;} .nav ul {display: none;} - a.navIcon { - font-size:1.3em; + button.navIcon { display: block; - margin: 0.1em 0.4em 0.4em 0.4em; float: left; + font-size:2.9em; + line-height: 35px; + border: 0px; + color: #555; + background-color: #EEE; } .nav.responsive {position: absolute; display: block; z-index: 100;} @@ -393,18 +396,41 @@ table#SortByCount thead th.ColumnQuantity a:after { table.surname td.ColumnName { background-color: #EEE; } +table#SortByName tr:hover td.ColumnSurname, +table#SortByCount tr:hover td.ColumnQuantity { + background-color: #DDE; +} +table#SortByName tr:hover, +table#SortByCount tr:hover, +table#SortByName tr:hover td.ColumnQuantity, +table#SortByCount tr:hover td.ColumnSurname { + background-color: #DDE; +} +table.surname tr:hover, +table.surname tr:hover td.ColumnName { + background-color: #DDE; +} /* Individuals ----------------------------------------------------- */ table.IndividualList td.ColumnSurname { background-color: #EEE; } +#parents table.infolist tr:hover, +table.IndividualList tr:hover, +table.IndividualList tr:hover td.ColumnSurname { + background-color: #DDE; +} /* Places ----------------------------------------------------- */ #Places table.infolist td.ColumnName { background-color: #EEE; } +#Places table.infolist tr:hover, +#Places table.infolist tr:hover td.ColumnName { + background-color: #DDE; +} /* Events ----------------------------------------------------- */ @@ -420,6 +446,10 @@ table.IndividualList td.ColumnSurname { #EventList td.ColumnPerson a { display: inline; } +#EventList table.infolist tr:hover, +#EventList table.infolist tr:hover td.ColumnType { + background-color: #DDE; +} #EventList td.ColumnPerson span.person:after, #EventList td.ColumnPerson span.father:after, #EventList td.ColumnPerson span.mother:after, @@ -440,10 +470,33 @@ table.IndividualList td.ColumnSurname { #EventDetail td.ColumnPerson span.mother:last-child:after { content: ""; } - +table.eventlist tbody tr td:first-child, +table.eventlist thead tr th:first-child { + padding-left: 10px; +} table.eventlist tbody tr td.ColumnSources { width: 5%; } +table.eventlist tbody tr td.ColumnDate { + width: 15%; +} +table.eventlist td.ColumnEvent, +table.eventlist td.ColumnDate, +table.eventlist td.ColumnPlace { + font-weight: bold; +} +#attributes table.infolist td.ColumnType { + width: 10%; + padding-left: 15px; +} +#attributes table.infolist td.ColumnSources { + width: 5%; + padding-left: 5px; +} +#WebLinks table.infolist td.ColumnType { + width: 10%; + padding-left: 15px; +} /* Gallery ----------------------------------------------------- */ @@ -495,6 +548,10 @@ table.eventlist tbody tr td.ColumnSources { div#SourceDetail { margin: 0 auto; } +#Sources table.infolist tr:hover, +#Sources table.infolist tr:hover td.ColumnType { + background-color: #DDE; +} /* Contact ----------------------------------------------------- */ @@ -564,18 +621,32 @@ div#SourceDetail { /* Subsection : Families ----------------------------------------------------- */ +#families table.infolist td.ColumnValue.Child table.infolist tr:hover, +table.relationships tr:hover { + background-color: #DDE; +} + div#families table.fixed_subtables table.eventlist { table-layout: fixed; } div#families table.fixed_subtables table.eventlist th:first-child { width: 9em; } -div#families table.fixed_subtables table.eventlist th:last-child { +div#families table.fixed_subtables table.eventlist th.ColumnDate { + width: 12%; +} +div#families table.fixed_subtables table.eventlist th.ColumnSources { width: 5em; } div#families table.attrlist td.ColumnType { color: black; } +div#families table.fixed_subtables .Child table.eventlist .ColumnName { + width: 60%; +} +div#families table.fixed_subtables .Child table.eventlist .ColumnDate { + width: 20%; +} /* Subsection : Gallery ----------------------------------------------------- */ @@ -615,7 +686,6 @@ div#families table.attrlist td.ColumnType { } #gallery div.indexno { float: right; - width: 1.8em; font-size: large; text-align: center; background-color: #CCC; @@ -663,11 +733,15 @@ div.snapshot div.thumbnail { h4 + div.grampsstylednote, a.familymap { margin: 1em 15px; } +i.NoteType { + font-weight: bold; + font-size: .8em; +} i + div.grampsstylednote p { margin: 0 0 0.3em 0; } div.grampsstylednote p { - margin-bottom: 0.5em; + padding-bottom: 0.6em; } /* Subsection : Family Map @@ -676,6 +750,12 @@ a.familymap { display: block; } +/* Subsection : References +----------------------------------------------------- */ +#references ol { + margin-left: 2em; +} + /* Subsection : Source References ----------------------------------------------------- */ #sourcerefs ol li ol { @@ -736,10 +816,16 @@ a.familymap { padding-right: 15px; } +/* Updates +----------------------------------------------------- */ +#Updates table.list td.date { + width: 20%; +} + /* Overwritten ----------------------------------------------------- */ body#FamilyMap { - background-color: #EEE ! important; + background-color: #EEE !important; } /* Calendar Styles diff --git a/data/css/Web_Basic-Blue.css b/data/css/Web_Basic-Blue.css index 7453b846a..eeff39371 100644 --- a/data/css/Web_Basic-Blue.css +++ b/data/css/Web_Basic-Blue.css @@ -11,7 +11,7 @@ # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # -# This program is distributed in the hope that it will be useful, +# This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. @@ -139,7 +139,6 @@ h1 { h2 { font: bold 1em sans-serif; text-align: center; - float: center; } h3 { font: bold italic 1.6em serif; @@ -349,7 +348,7 @@ div#footer p#copyright img { } /* Responsive navigation */ -a.navIcon { +button.navIcon { display: none; } @@ -359,6 +358,12 @@ div#header::after { display: table; } +/* Updates +----------------------------------------------------- */ +#Updates table.list td.date { + width: 20%; +} + /* Alphabet Navigation ----------------------------------------------------- */ div#alphanav { @@ -432,11 +437,14 @@ div#nav::after { .nav li {display: none;} .nav ul {display: none;} - a.navIcon { - font-size:1.3em; + button.navIcon { display: block; - margin: 0.1em 0.4em 0.4em 0.4em; float: left; + font-size:2.9em; + line-height: 60px; + border: 0px; + color: #FFF; + background-color: #00029D; } .nav.responsive {position: absolute; display: block; z-index: 100;} @@ -506,13 +514,12 @@ table.infolist tr td.ColumnRowLabel a { } table.infolist tr td.ColumnType { width: 6%; - padding-left: 20px; } table.infolist tr td.ColumnAttribute { width: 10%; } table.infolist tr td.ColumnValue { - width: 40%; + width: 30%; } table.infolist tr td.ColumnName { width: 30%; @@ -527,7 +534,7 @@ table.infolist tr td.ColumnPartner { table.infolist tr td.ColumnParents { width: 30%; } -table.infolist tbody tr td.ColumnParents span.father, +table.infolist tbody tr td.ColumnParents span.father, table.infolist tbody tr td.ColumnParents span.mother { display: block; } @@ -595,11 +602,11 @@ div#IndividualDetail table.infolist tbody tr td.ColumnAttribute { margin: 0; padding: 0; } -table.surnamelist thead tr th.ColumnSurname, +table.surnamelist thead tr th.ColumnSurname, #Surnames table.surnamelist tbody tr td.ColumnSurname { width: 50%; } -table#SortByName thead tr th.ColumnSurname, +table#SortByName thead tr th.ColumnSurname, table#SortByCount thead tr th.ColumnQuantity { background-color: #00029D; color: #FFF; @@ -610,7 +617,7 @@ table.surnamelist thead tr th.ColumnSurname a { table.surnamelist thead tr th.ColumnSurname a:hover { color: #000; } -table#SortByName thead tr th.ColumnSurname a:after, +table#SortByName thead tr th.ColumnSurname a:after, table#SortByCount thead tr th.ColumnQuantity a:after { content: " ↓"; } @@ -661,11 +668,9 @@ div#Places table.infolist tbody tr td.ColumnLongitude { } div#PlaceDetail h5 { font: bold .7cm serif; - float: center; text-align: center; border-bottom: double 4px #13A926; } - /* EventList and EventDetail ------------------------------------------------------ */ @@ -676,18 +681,40 @@ div#EventList, div#EventDetail { table.eventlist tbody tr td.ColumnEvent { width: 10%; } -table.eventlist tbody tr td.ColumnPlace { - width: 25%; -} -table.eventlist tbody tr td.ColumnNotes { - width: 20%; -} table.eventlist tbody tr td.ColumnSources { + vertical-align: top; width: 5%; } table.eventlist tbody tr td.ColumnPerson { width: 35%; } +table.eventlist th.ColumnDate { + width: 15%; +} +table.eventlist td.ColumnEvent, +table.eventlist td.ColumnDate, +table.eventlist td.ColumnPlace { + font-weight: bold; +} +#attributes table.infolist td.ColumnType { + width: 10%; + padding-left: 15px; +} +#attributes table.infolist td.ColumnSources { + width: 5%; + padding-left: 5px; +} +#WebLinks table.infolist td.ColumnType { + width: 10%; + padding-left: 15px; +} +#families table.infolist th.ColumnEvent { + width: 10%; + padding-left: 0px; +} +#families table.infolist td.ColumnAttribute { + padding-left: 0px; +} div#IndividualDetail div#families table.eventlist tr td { border-bottom: dashed 1px #000; } @@ -719,7 +746,7 @@ div#EventList table.alphaevent tbody tr td.ColumnGRAMPSID { div#EventList table.alphaevent tbody tr td.ColumnPerson { width: 50%; } -div#EventList table.alphaevent tbody tr td.ColumnPerson span.father, +div#EventList table.alphaevent tbody tr td.ColumnPerson span.father, div#EventList table.alphaevent tbody tr td.ColumnPerson span.mother { display:block; } @@ -751,7 +778,7 @@ div#EventDetail table.eventlist tbody tr td.ColumnDate { #EventDetail table.infolist tr td a { display: inline; } -#EventList table.infolist tr td span.father, +#EventList table.infolist tr td span.father, #EventList table.infolist tr td span.mother, #EventDetail table.infolist tr td span.father, #EventDetail table.infolist tr td span.mother { @@ -863,7 +890,6 @@ div#EventDetail table.eventlist tbody tr td.ColumnDate { } #GalleryDetail div#summaryarea table.gallery { padding-bottom: 0; - margin: 1 .5em 0 0; border-style: solid; border-width: 2px 0 1px 0; border-color: #000; @@ -949,9 +975,9 @@ body#ThumbnailPreview div#references table.infolist tbody tr td.ColumnName { text-decoration: none; } -/* Download +/* Download ----------------------------------------------------- */ -div#Download { +div#Download { margin: 0; width: 100%; } @@ -965,7 +991,7 @@ div#Download table.download { div#Download table.download tbody tr#Row02 { border-bottom: solid 2px #000; } -div#Download table.download tbody tr td { +div#Download table.download tbody tr td { border: solid 1px #000; text-align: left; } @@ -989,6 +1015,9 @@ div#Download table.download td.ColumnModified { margin: 0; padding: 0; } +#Sources table.infolist tr td.ColumnName { + width: 70%; +} div#SourceDetail { min-height: 900px } @@ -1097,8 +1126,14 @@ div#events h4 { #IndividualDetail div#events table.eventtable { width: 100%; } -table.eventlist tbody tr td.ColumnEvent { - width: 12%; +#families table.eventlist tbody tr td.ColumnEvent { + vertical-align: top; + width: 8%; +} +div#RelationshipDetail table.infolist tbody tr td.ColumnAttribute, +div#IndividualDetail table.infolist tbody tr td.ColumnAttribute { + vertical-align: top; + width: 10%; } #IndividualDetail div#events table.infolist tbody tr td { padding-top: .4em; @@ -1185,6 +1220,10 @@ div#Families table.infolist tbody tr td.ColumnAttribute { } div#families table.infolist tbody tr td.ColumnValue p { margin-top: 0; + margin-left: 0; +} +div#families table.infolist tbody tr td.ColumnValue { + width: 70%; } div#families table.infolist tbody tr td.ColumnValue ol { margin: 0; @@ -1199,6 +1238,22 @@ div#families table.infolist tbody tr td.ColumnValue ol li a { div#families table.fixed_subtables table.eventlist { table-layout:fixed; } +div#families table.fixed_subtables table.eventlist th.ColumnDate { + width: 12%; +} +div#families table.fixed_subtables table.eventlist th.ColumnSources { + width: 5em; + } +div#families table.fixed_subtables .Child table.eventlist .ColumnName { + width: 60%; +} +div#families table.fixed_subtables .Child table.eventlist .ColumnDate { + width: 20%; +} +div#families table.fixed_subtables .BeginFamily .ColumnType { + width: 7em; + vertical-align: top; +} /* Subsection: Families: Attributes ------------------------------------------------- */ @@ -1215,17 +1270,14 @@ SourcesType { div#families table.infolist tbody tr td.Value { width: 15%; } -div#families table.infolist tr td.Notes { - width: 40%; -} div#families table.infolist tbody tr td.Sources { - width: 15%; + width: 5%; } /* Subsection: Families: LDS Ordinance ------------------------------------------------------ */ div#families table.infolist { - font: normal .8em sans; + font: normal .9em sans; } div#families table.infolist tbody tr.BeginOrdinance { border-top: solid 1px #000; @@ -1366,7 +1418,6 @@ div.Residence table.infolist tr td { } #gallery div.indexno { float: right; - width: 1.8em; font-size: large; text-align: center; background-color: #CCC; @@ -1411,9 +1462,22 @@ div.narrative { font: normal .9em/1.4em sans-serif; margin: 0.1em 0 0.2em 0; } +i.NoteType { + font-weight: bold; + font-size: .8em; +} i + div.grampsstylednote p { margin: 0.1em 0 0.2em 0; } +div.grampsstylednote p { + padding-bottom: 0.6em; +} + +/* Subsection : References +----------------------------------------------------- */ +#references ol { + margin-left: 3em; +} /* Subsections : References ----------------------------------------------------- */ @@ -1453,6 +1517,9 @@ div#summaryarea table.infolist tr td, div#summaryarea table.infolist tr td p { font: normal .9em/1.2em sans-serif; vertical-align: top; } +div#summaryarea table.infolist tr td.ColumnValue { + width: 70%; +} div#summaryarea table.infolist tr td a, div#summaryarea table.infolist tr td p a { display:inline; } @@ -1482,7 +1549,7 @@ table.WebLinks tbody tr td.ColumnPath { width: 50%; } table.weblinks tbody tr td.ColumnDescription { - width: 30%; + width: 80%; } /* Subsections : Pedigree @@ -1568,7 +1635,7 @@ div#pedigree { vertical-align: top; height: 2em; } -.calendar thead tr th.weekend, +.calendar thead tr th.weekend, .calendar thead tr th.weekday { font-style:italic; color: #000; @@ -1655,9 +1722,9 @@ div#pedigree { } /* Calendar : Previous-Next Month */ -.calendar tbody tr td.previous, -.calendar tbody tr td.next, -.calendar tbody tr td.previous div.date, +.calendar tbody tr td.previous, +.calendar tbody tr td.next, +.calendar tbody tr td.previous div.date, .calendar tbody tr td.next div.date { color: #333; background-color: #D8F3D6; diff --git a/data/css/Web_Basic-Cypress.css b/data/css/Web_Basic-Cypress.css index 03b7913bf..839e8810e 100644 --- a/data/css/Web_Basic-Cypress.css +++ b/data/css/Web_Basic-Cypress.css @@ -1,14 +1,15 @@ /* -************************************************************************************************** +******************************************************************************* Copyright Holder and License -************************************************************************************************** +******************************************************************************* GRAMPS Cascading Style Sheet Style Name: Basic - Cypress Style Author: Jason Simanek (2008) -Note: Adapted from GRAMPS original Modern Style stylesheet with colors from the original 'Tranquil' stylesheet -************************************************************************************************** +Note: Adapted from GRAMPS original Modern Style stylesheet with colors from the + original 'Tranquil' stylesheet +******************************************************************************* This website was created with GRAMPS --------------------------------------------------------------------------------------------------- +------------------------------------------------------------------------------- GRAMPS is a Free Software Project for Genealogy, offering a professional genealogy program, and a wiki open to all. It is a community project, created, @@ -16,7 +17,7 @@ developed and governed by genealogists. Go to to learn more! --------------------------------------------------------------------------------------------------- +------------------------------------------------------------------------------- Copyright 2008 Jason M. Simanek Copyright 2009 Stephane Charette Copyright (C) 2008-2011 Rob G. Healey @@ -36,10 +37,10 @@ A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GRAMPS. If not, see . --------------------------------------------------------------------------------------------------- +------------------------------------------------------------------------------- Color Palette --------------------------------------------------------------------------------------------------- +------------------------------------------------------------------------------- black #000 slate dark #454 @@ -47,14 +48,14 @@ slate #7C8F7C slate light #9DBF9D slate very light #E0E6E0 white #FFF --------------------------------------------------------------------------------------------------- +------------------------------------------------------------------------------- Characteristic of this style is that it uses the full width of the browser window and that horizontal highlighting bars extend over the full width of the page. --------------------------------------------------------------------------------------------------- +------------------------------------------------------------------------------- NarrativeWeb Styles ------------------------------------------------------------------------------------------------- +------------------------------------------------------------------------------- General Elements ----------------------------------------------------- */ @@ -239,7 +240,7 @@ div#alphanav ul li a:hover { } /* Responsive navigation */ -a.navIcon { +button.navIcon { display: none; } @@ -286,11 +287,14 @@ div#nav::after { .nav li {display: none;} .nav ul {display: none;} - a.navIcon { - font-size:1.3em; + button.navIcon { display: block; - margin: 0.1em 0.4em 0.4em 0.4em; float: left; + font-size:2.9em; + line-height: 35px; + border: 0px; + color: #E0E6E0; + background-color: #454; } .nav.responsive {position: absolute; display: block; z-index: 100;} @@ -373,9 +377,6 @@ td.ColumnLetter, td.ColumnRowLabel { td.ColumnEvent, td.ColumnDate { white-space: nowrap; } -td.ColumnPlace, td.ColumnDescription { - width: 20% -} /* end of customizations by Stephane */ td.ColumnBirth, td.ColumnDeath, td.ColumnPartner, td.ColumnParents { font-size: 90%; @@ -434,12 +435,31 @@ table.surname td.ColumnName { table.surname td.ColumnName > a { padding-left: 15px; } +table#SortByName tr:hover td.ColumnSurname, +table#SortByCount tr:hover td.ColumnQuantity { + background-color: #9DBF9D; +} +table#SortByName tr:hover, +table#SortByCount tr:hover, +table#SortByName tr:hover td.ColumnQuantity, +table#SortByCount tr:hover td.ColumnSurname { + background-color: #9DBF9D; +} +table.surname tr:hover, +table.surname tr:hover td.ColumnName { + background-color: #9DBF9D; +} /* Individuals ----------------------------------------------------- */ table.IndividualList td.ColumnSurname { background-color: #E0E6E0; } +#parents table.infolist tr:hover, +table.IndividualList tr:hover, +table.IndividualList tr:hover td.ColumnSurname { + background-color: #9DBF9D; +} /* Places ----------------------------------------------------- */ @@ -453,6 +473,10 @@ table.IndividualList td.ColumnSurname { #Places table.infolist td.ColumnName > a { padding-left: 1ex; } +#Places table.infolist tr:hover, +#Places table.infolist tr:hover td.ColumnName { + background-color: #9DBF9D; +} /* Events ----------------------------------------------------- */ @@ -468,6 +492,10 @@ table.IndividualList td.ColumnSurname { #EventList td.ColumnPerson a { display: inline; } +#EventList table.infolist tr:hover, +#EventList table.infolist tr:hover td.ColumnType { + background-color: #9DBF9D; +} #EventList td.ColumnPerson span.person:after, #EventList td.ColumnPerson span.father:after, #EventList td.ColumnPerson span.mother:after, @@ -488,10 +516,49 @@ table.IndividualList td.ColumnSurname { #EventDetail td.ColumnPerson span.mother:last-child:after { content: ""; } - +table.eventlist tbody tr td:first-child, +table.eventlist thead tr th:first-child { + padding-left: 15px; +} +#attributes table.infolist td.ColumnType { + width: 10%; + padding-left: 15px; +} +#attributes table.infolist td.ColumnValue { + width: 15%; +} +#attributes table.infolist td.ColumnSources { + width: 5%; + padding-left: 5px; +} +#WebLinks table.infolist td.ColumnType { + width: 10%; + padding-left: 15px; +} +#events table.eventlist td.ColumnDate { + padding-left: 15px; +} +#families table.eventlist tbody tr td:first-child, +#families table.eventlist thead tr th:first-child { + width: 10%; + padding-left: 0px; +} +#families table.eventlist tbody tr td.ColumnDate, +#families table.eventlist tbody tr td.ColumnNotes { + padding-left: 15px; +} table.eventlist tbody tr td.ColumnSources { width: 5%; } +table.eventlist th.ColumnDate { + padding-left: 15px; + width: 15%; +} +table.eventlist td.ColumnEvent, +table.eventlist td.ColumnDate, +table.eventlist td.ColumnPlace { + font-weight: bold; +} /* Gallery ----------------------------------------------------- */ @@ -546,6 +613,10 @@ table.eventlist tbody tr td.ColumnSources { div#SourceDetail { margin: 0 auto; } +#Sources table.infolist tr:hover, +#Sources table.infolist tr:hover td.ColumnType { + background-color: #9DBF9D; +} /* Contact ----------------------------------------------------- */ @@ -615,6 +686,10 @@ div#SourceDetail { /* Subsection : Families ----------------------------------------------------- */ +#families table.infolist td.ColumnValue.Child table.infolist tr:hover, +table.relationships tr:hover { + background-color: #9DBF9D; +} div#families table.fixed_subtables table.eventlist { table-layout: fixed; } @@ -666,7 +741,6 @@ div#families table.attrlist td.ColumnType { } #gallery div.indexno { float: right; - width: 1.8em; font-size: large; text-align: center; background-color: #CCC; @@ -714,11 +788,21 @@ div.snapshot div.thumbnail { h4 + div.grampsstylednote, a.familymap { margin: 1em 15px; } +i.NoteType { + font-weight: bold; + font-size: .8em; +} i + div.grampsstylednote p { margin: 0 0 0.3em 0; } div.grampsstylednote p { - margin-bottom: 0.5em; + padding-bottom: 0.6em; +} + +/* Subsection : References +----------------------------------------------------- */ +#references ol { + margin-left: 2em; } /* Subsection : Family Map @@ -791,10 +875,16 @@ a.familymap { padding-right: 15px; } +/* Updates +----------------------------------------------------- */ +#Updates table.list td.date { + width: 20%; +} + /* Overwritten ----------------------------------------------------- */ body#FamilyMap { - background-color: #454 ! important; + background-color: #454 !important; } /* Calendar Styles diff --git a/data/css/Web_Basic-Lilac.css b/data/css/Web_Basic-Lilac.css index 7bf044157..2ad98dc71 100644 --- a/data/css/Web_Basic-Lilac.css +++ b/data/css/Web_Basic-Lilac.css @@ -1,14 +1,15 @@ /* -************************************************************************************************** +******************************************************************************* Copyright Holder and License -************************************************************************************************** +******************************************************************************* GRAMPS Cascading Style Sheet Style Name: Basic - Lilac Style Author: Jason M. Simanek (2008) -Note: Adapted from GRAMPS original Modern Style stylesheet with colors from the original 'Business' stylesheet -************************************************************************************************** +Note: Adapted from GRAMPS original Modern Style stylesheet with colors from the + original 'Business' stylesheet +******************************************************************************* This website was created with GRAMPS --------------------------------------------------------------------------------------------------- +------------------------------------------------------------------------------- GRAMPS is a Free Software Project for Genealogy, offering a professional genealogy program, and a wiki open to all. It is a community project, created, @@ -16,7 +17,7 @@ developed and governed by genealogists. Go to to learn more! --------------------------------------------------------------------------------------------------- +------------------------------------------------------------------------------- Copyright 2008 Jason M. Simanek Copyright 2009 Stephane Charette Copyright (C) 2008-2011 Rob G. Healey @@ -36,10 +37,10 @@ A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GRAMPS. If not, see . --------------------------------------------------------------------------------------------------- +------------------------------------------------------------------------------- Color Palette --------------------------------------------------------------------------------------------------- +------------------------------------------------------------------------------- black #000 lilac dark #2E2E61 @@ -47,14 +48,14 @@ lilac #669 lilac light #B4B4CB lilac very light #E0E0E9 white #FAFAFF --------------------------------------------------------------------------------------------------- +------------------------------------------------------------------------------- Characteristic of this style is that it uses the full width of the browser window and that horizontal highlighting bars extend over the full width of the page. --------------------------------------------------------------------------------------------------- +------------------------------------------------------------------------------- NarrativeWeb Styles ------------------------------------------------------------------------------------------------- +------------------------------------------------------------------------------- General Elements ----------------------------------------------------- */ @@ -237,7 +238,7 @@ div#alphanav ul li a:hover { } /* Responsive navigation */ -a.navIcon { +button.navIcon { display: none; } @@ -284,11 +285,14 @@ div#nav::after { .nav li {display: none;} .nav ul {display: none;} - a.navIcon { - font-size:1.3em; + button.navIcon { display: block; - margin: 0.1em 0.4em 0.4em 0.4em; float: left; + font-size:2.9em; + line-height: 35px; + border: 0px; + color: #2E2E61; + background-color: #E0E0E9; } .nav.responsive {position: absolute; display: block; z-index: 100;} @@ -419,12 +423,31 @@ table.surname td.ColumnName { table.surname td.ColumnName > a { padding-left: 15px; } +table#SortByName tr:hover td.ColumnSurname, +table#SortByCount tr:hover td.ColumnQuantity { + background-color: #B4B4CB; +} +table#SortByName tr:hover, +table#SortByCount tr:hover, +table#SortByName tr:hover td.ColumnQuantity, +table#SortByCount tr:hover td.ColumnSurname { + background-color: #B4B4CB; +} +table.surname tr:hover, +table.surname tr:hover td.ColumnName { + background-color: #B4B4CB; +} /* Individuals ----------------------------------------------------- */ table.IndividualList td.ColumnSurname { background-color: #E0E0E9; } +#parents table.infolist tr:hover, +table.IndividualList tr:hover, +table.IndividualList tr:hover td.ColumnSurname { + background-color: #B4B4CB; +} /* Places ----------------------------------------------------- */ @@ -441,6 +464,10 @@ table.IndividualList td.ColumnSurname { #Places table.infolist td.ColumnName > a { padding-left: 1ex; } +#Places table.infolist tr:hover, +#Places table.infolist tr:hover td.ColumnName { + background-color: #B4B4CB; +} /* Events ----------------------------------------------------- */ @@ -456,6 +483,10 @@ table.IndividualList td.ColumnSurname { #EventList td.ColumnPerson a { display: inline; } +#EventList table.infolist tr:hover, +#EventList table.infolist tr:hover td.ColumnType { + background-color: #B4B4CB; +} #EventList td.ColumnPerson span.person:after, #EventList td.ColumnPerson span.father:after, #EventList td.ColumnPerson span.mother:after, @@ -476,9 +507,54 @@ table.IndividualList td.ColumnSurname { #EventDetail td.ColumnPerson span.mother:last-child:after { content: ""; } - -table.eventlist tbody tr td.ColumnSources { +#attributes table.infolist td.ColumnType { + width: 10%; + padding-left: 15px; +} +#attributes table.infolist td.ColumnValue { + width: 15%; +} +#attributes table.infolist td.ColumnSources { width: 5%; + padding-left: 5px; +} +#WebLinks table.infolist td.ColumnType { + width: 10%; + padding-left: 15px; +} +#events table.eventlist td.ColumnDate { + width: 15%; + padding-left: 10px; +} +#families table.eventlist td.ColumnDate { + width: 15%; + padding-left: 10px; +} +#families table.eventlist tbody tr td:first-child, +#families table.eventlist thead tr th:first-child { + width: 10%; + padding-left: 0px; +} +#families table.eventlist tbody tr td.ColumnDate, +#families table.eventlist tbody tr td.ColumnNotes { + padding-left: 20px; +} +table.eventlist tbody tr td:first-child, +table.eventlist thead tr th:first-child { + padding-left: 10px; +} +table.eventlist tbody tr td.ColumnSources { + padding-left: 20px; + width: 5%; +} +#families table.eventlist th.ColumnDate { + padding-left: 20px; + width: 15%; +} +table.eventlist td.ColumnEvent, +table.eventlist td.ColumnDate, +table.eventlist td.ColumnPlace { + font-weight: bold; } /* Gallery @@ -534,6 +610,10 @@ table.eventlist tbody tr td.ColumnSources { div#SourceDetail { margin: 0 auto; } +#Sources table.infolist tr:hover, +#Sources table.infolist tr:hover td.ColumnType { + background-color: #B4B4CB; +} /* Contact ----------------------------------------------------- */ @@ -603,6 +683,10 @@ div#SourceDetail { /* Subsection : Families ----------------------------------------------------- */ +#families table.infolist td.ColumnValue.Child table.infolist tr:hover, +table.relationships tr:hover { + background-color: #B4B4CB; +} div#families table.fixed_subtables table.eventlist { table-layout: fixed; } @@ -654,7 +738,6 @@ div#families table.attrlist td.ColumnType { } #gallery div.indexno { float: right; - width: 1.8em; font-size: large; text-align: center; background-color: #CCC; @@ -702,11 +785,21 @@ div.snapshot div.thumbnail { h4 + div.grampsstylednote, a.familymap { margin: 1em 15px; } +i.NoteType { + font-weight: bold; + font-size: .8em; +} i + div.grampsstylednote p { margin: 0 0 0.3em 0; } div.grampsstylednote p { - margin-bottom: 0.5em; + padding-bottom: 0.6em; +} + +/* Subsection : References +----------------------------------------------------- */ +#references ol { + margin-left: 2em; } /* Subsection : Family Map @@ -778,10 +871,16 @@ a.familymap { background-color: #B4B4CB; } +/* Updates +----------------------------------------------------- */ +#Updates table.list td.date { + width: 20%; +} + /* Overwritten ----------------------------------------------------- */ body#FamilyMap { - background-color: #E0E0E9 ! important; + background-color: #E0E0E9 !important; } /* Calendar Styles diff --git a/data/css/Web_Basic-Peach.css b/data/css/Web_Basic-Peach.css index 64034abfb..7b2d85696 100644 --- a/data/css/Web_Basic-Peach.css +++ b/data/css/Web_Basic-Peach.css @@ -1,14 +1,15 @@ /* -************************************************************************************************** +******************************************************************************* Copyright Holder and License -************************************************************************************************** +******************************************************************************* GRAMPS Cascading Style Sheet Style Name: Basic-Peach Stylesheet Style Author: Jason M. Simanek (2008) -Note: Adapted from GRAMPS original Modern Style stylesheet with a new orange color scheme. -************************************************************************************************** +Note: Adapted from GRAMPS original Modern Style stylesheet with a new orange + color scheme. +******************************************************************************* This website was created with GRAMPS --------------------------------------------------------------------------------------------------- +------------------------------------------------------------------------------- GRAMPS is a Free Software Project for Genealogy, offering a professional genealogy program, and a wiki open to all. It is a community project, created, @@ -16,7 +17,7 @@ developed and governed by genealogists. Go to to learn more! --------------------------------------------------------------------------------------------------- +------------------------------------------------------------------------------- Copyright 2008 Jason M. Simanek Copyright 2009 Stephane Charette Copyright (C) 2008-2011 Rob G. Healey @@ -36,10 +37,10 @@ A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GRAMPS. If not, see . --------------------------------------------------------------------------------------------------- +------------------------------------------------------------------------------- Color Palette --------------------------------------------------------------------------------------------------- +------------------------------------------------------------------------------- black #36220B brown #8C581C @@ -47,14 +48,14 @@ orange dark #EA8414 orange #FFC35E orange light #FFE09F yellow light #FFFBE7 --------------------------------------------------------------------------------------------------- +------------------------------------------------------------------------------- Characteristic of this style is that it uses the full width of the browser window and that horizontal highlighting bars extend over the full width of the page. --------------------------------------------------------------------------------------------------- +------------------------------------------------------------------------------- NarrativeWeb Styles ------------------------------------------------------------------------------------------------- +------------------------------------------------------------------------------- General Elements ----------------------------------------------------- */ @@ -237,7 +238,7 @@ div#alphanav ul li a:hover { } /* Responsive navigation */ -a.navIcon { +button.navIcon { display: none; } @@ -284,11 +285,14 @@ div#nav::after { .nav li {display: none;} .nav ul {display: none;} - a.navIcon { - font-size:1.3em; + button.navIcon { display: block; - margin: 0.1em 0.4em 0.4em 0.4em; float: left; + font-size:2.9em; + line-height: 35px; + border: 0px; + color: #EA8414; + background-color: #FFE09F; } .nav.responsive {position: absolute; display: block; z-index: 100;} @@ -419,12 +423,31 @@ table.surname td.ColumnName { table.surname td.ColumnName > a { padding-left: 15px; } +table#SortByName tr:hover td.ColumnSurname, +table#SortByCount tr:hover td.ColumnQuantity { + background-color: #FFC35E; +} +table#SortByName tr:hover, +table#SortByCount tr:hover, +table#SortByName tr:hover td.ColumnQuantity, +table#SortByCount tr:hover td.ColumnSurname { + background-color: #FFC35E; +} +table.surname tr:hover, +table.surname tr:hover td.ColumnName { + background-color: #FFC35E; +} /* Individuals ----------------------------------------------------- */ table.IndividualList td.ColumnSurname { background-color: #FFE09F; } +#parents table.infolist tr:hover, +table.IndividualList tr:hover, +table.IndividualList tr:hover td.ColumnSurname { + background-color: #FFC35E; +} /* Places ----------------------------------------------------- */ @@ -441,6 +464,10 @@ table.IndividualList td.ColumnSurname { #Places table.infolist td.ColumnName > a { padding-left: 1ex; } +#Places table.infolist tr:hover, +#Places table.infolist tr:hover td.ColumnName { + background-color: #FFC35E; +} /* Events ----------------------------------------------------- */ @@ -456,6 +483,10 @@ table.IndividualList td.ColumnSurname { #EventList td.ColumnPerson a { display: inline; } +#EventList table.infolist tr:hover, +#EventList table.infolist tr:hover td.ColumnType { + background-color: #FFC35E; +} #EventList td.ColumnPerson span.person:after, #EventList td.ColumnPerson span.father:after, #EventList td.ColumnPerson span.mother:after, @@ -476,10 +507,57 @@ table.IndividualList td.ColumnSurname { #EventDetail td.ColumnPerson span.mother:last-child:after { content: ""; } - +#attributes table.infolist td.ColumnType { + width: 10%; + padding-left: 15px; +} +#attributes table.infolist td.ColumnValue { + width: 15%; +} +#attributes table.infolist td.ColumnSources { + width: 5%; + padding-left: 5px; +} +#WebLinks table.infolist td.ColumnType { + width: 10%; + padding-left: 15px; +} +#events table.eventlist td.ColumnDate { + width: 15%; + padding-left: 10px; +} +#families table.eventlist th.ColumnDate { + width: 15%; + padding-left: 20px; +} +#families table.eventlist td.ColumnDate { + width: 15%; + padding-left: 10px; +} +#families table.eventlist tbody tr td:first-child, +#families table.eventlist thead tr th:first-child { + width: 10%; + padding-left: 0px; +} +#families table.eventlist tbody tr td.ColumnDate, +#families table.eventlist tbody tr td.ColumnNotes { + padding-left: 20px; +} +table.eventlist tbody tr td:first-child, +table.eventlist thead tr th:first-child { + padding-left: 10px; +} table.eventlist tbody tr td.ColumnSources { width: 5%; } +table.eventlist th.ColumnDate { + width: 15%; +} +table.eventlist td.ColumnEvent, +table.eventlist td.ColumnDate, +table.eventlist td.ColumnPlace { + font-weight: bold; +} /* Gallery ----------------------------------------------------- */ @@ -533,6 +611,10 @@ table.eventlist tbody tr td.ColumnSources { div#SourceDetail { margin: 0 auto; } +#Sources table.infolist tr:hover, +#Sources table.infolist tr:hover td.ColumnType { + background-color: #FFC35E; +} /* Contact ----------------------------------------------------- */ @@ -602,6 +684,10 @@ div#SourceDetail { /* Subsection : Families ----------------------------------------------------- */ +#families table.infolist td.ColumnValue.Child table.infolist tr:hover, +table.relationships tr:hover { + background-color: #FFC35E; +} div#families table.fixed_subtables table.eventlist { table-layout: fixed; } @@ -653,7 +739,6 @@ div#families table.attrlist td.ColumnType { } #gallery div.indexno { float: right; - width: 1.8em; font-size: large; text-align: center; background-color: #CCC; @@ -701,11 +786,21 @@ div.snapshot div.thumbnail { h4 + div.grampsstylednote, a.familymap { margin: 1em 15px; } +i.NoteType { + font-weight: bold; + font-size: .8em; +} i + div.grampsstylednote p { margin: 0 0 0.3em 0; } div.grampsstylednote p { - margin-bottom: 0.5em; + padding-bottom: 0.6em; +} + +/* Subsection : References +----------------------------------------------------- */ +#references ol { + margin-left: 2em; } /* Subsection : Family Map @@ -777,11 +872,17 @@ a.familymap { background-color: #FFC35E; } +/* Updates +----------------------------------------------------- */ +#Updates table.list td.date { + width: 20%; +} + /* Overwritten ----------------------------------------------------- */ button#drop { background-color: #FFE09F; - border: solid 1px #EA8414 ! important; + border: solid 1px #EA8414 !important; } button#drop:hover { background-color: #FFC35E; diff --git a/data/css/Web_Basic-Spruce.css b/data/css/Web_Basic-Spruce.css index fa5084618..8f0c573a1 100644 --- a/data/css/Web_Basic-Spruce.css +++ b/data/css/Web_Basic-Spruce.css @@ -1,14 +1,15 @@ /* -************************************************************************************************** +******************************************************************************* Copyright Holder and License -************************************************************************************************** +******************************************************************************* GRAMPS Cascading Style Sheet Style Name: Basic-Spruce Stylesheet Style Author: Jason M. Simanek (2008) -Note: Adapted from GRAMPS original Modern Style stylesheet with a new blue color scheme. -************************************************************************************************** +Note: Adapted from GRAMPS original Modern Style stylesheet with a new blue + color scheme. +******************************************************************************* This website was created with GRAMPS --------------------------------------------------------------------------------------------------- +------------------------------------------------------------------------------- GRAMPS is a Free Software Project for Genealogy, offering a professional genealogy program, and a wiki open to all. It is a community project, created, @@ -16,7 +17,7 @@ developed and governed by genealogists. Go to to learn more! --------------------------------------------------------------------------------------------------- +------------------------------------------------------------------------------- Copyright 2008 Jason M. Simanek Copyright 2009 Stephane Charette Copyright (C) 2008-2011 Rob G. Healey @@ -37,10 +38,10 @@ A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GRAMPS. If not, see . --------------------------------------------------------------------------------------------------- +------------------------------------------------------------------------------- Color Palette --------------------------------------------------------------------------------------------------- +------------------------------------------------------------------------------- black #000 blue dark #204D91 @@ -48,14 +49,14 @@ blue #7CA3DD blue light #BFD0EA blue very light #EAEEF4 white #FFF --------------------------------------------------------------------------------------------------- +------------------------------------------------------------------------------- Characteristic of this style is that it uses the full width of the browser window and that horizontal highlighting bars extend over the full width of the page. --------------------------------------------------------------------------------------------------- +------------------------------------------------------------------------------- NarrativeWeb Styles ------------------------------------------------------------------------------------------------- +------------------------------------------------------------------------------- General Elements ----------------------------------------------------- */ @@ -238,7 +239,7 @@ div#alphanav ul li a:hover { } /* Responsive navigation */ -a.navIcon { +button.navIcon { display: none; } @@ -285,11 +286,14 @@ div#nav::after { .nav li {display: none;} .nav ul {display: none;} - a.navIcon { - font-size:1.3em; + button.navIcon { display: block; - margin: 0.1em 0.4em 0.4em 0.4em; float: left; + font-size:2.9em; + line-height: 35px; + border: 0px; + color: #204D91; + background-color: #EAEEF4; } .nav.responsive {position: absolute; display: block; z-index: 100;} @@ -420,12 +424,31 @@ table.surname td.ColumnName { table.surname td.ColumnName > a { padding-left: 15px; } +table#SortByName tr:hover td.ColumnSurname, +table#SortByCount tr:hover td.ColumnQuantity { + background-color: #BFD0EA; +} +table#SortByName tr:hover, +table#SortByCount tr:hover, +table#SortByName tr:hover td.ColumnQuantity, +table#SortByCount tr:hover td.ColumnSurname { + background-color: #BFD0EA; +} +table.surname tr:hover, +table.surname tr:hover td.ColumnName { + background-color: #BFD0EA; +} /* Individuals ----------------------------------------------------- */ table.IndividualList td.ColumnSurname { background-color: #EAEEF4; } +#parents table.infolist tr:hover, +table.IndividualList tr:hover, +table.IndividualList tr:hover td.ColumnSurname { + background-color: #EAEEF4; +} /* Places ----------------------------------------------------- */ @@ -442,6 +465,10 @@ table.IndividualList td.ColumnSurname { #Places table.infolist td.ColumnName > a { padding-left: 1ex; } +#Places table.infolist tr:hover, +#Places table.infolist tr:hover td.ColumnName { + background-color: #BFD0EA; +} /* Events ----------------------------------------------------- */ @@ -457,6 +484,10 @@ table.IndividualList td.ColumnSurname { #EventList td.ColumnPerson a { display: inline; } +#EventList table.infolist tr:hover, +#EventList table.infolist tr:hover td.ColumnType { + background-color: #BFD0EA; +} #EventList td.ColumnPerson span.person:after, #EventList td.ColumnPerson span.father:after, #EventList td.ColumnPerson span.mother:after, @@ -477,10 +508,57 @@ table.IndividualList td.ColumnSurname { #EventDetail td.ColumnPerson span.mother:last-child:after { content: ""; } - +#attributes table.infolist td.ColumnType { + width: 10%; + padding-left: 15px; +} +#attributes table.infolist td.ColumnValue { + width: 15%; +} +#attributes table.infolist td.ColumnSources { + width: 5%; + padding-left: 5px; +} +#WebLinks table.infolist td.ColumnType { + width: 10%; + padding-left: 15px; +} +#events table.eventlist td.ColumnDate { + width: 15%; + padding-left: 10px; +} +#families table.eventlist th.ColumnDate { + width: 15%; + padding-left: 20px; +} +#families table.eventlist td.ColumnDate { + width: 15%; + padding-left: 10px; +} +#families table.eventlist tbody tr td:first-child, +#families table.eventlist thead tr th:first-child { + width: 10%; + padding-left: 0px; +} +#families table.eventlist tbody tr td.ColumnDate, +#families table.eventlist tbody tr td.ColumnNotes { + padding-left: 20px; +} +table.eventlist tbody tr td:first-child, +table.eventlist thead tr th:first-child { + padding-left: 10px; +} table.eventlist tbody tr td.ColumnSources { width: 5%; } +table.eventlist th.ColumnDate { + width: 15%; +} +table.eventlist td.ColumnEvent, +table.eventlist td.ColumnDate, +table.eventlist td.ColumnPlace { + font-weight: bold; +} /* Gallery ----------------------------------------------------- */ @@ -534,6 +612,10 @@ table.eventlist tbody tr td.ColumnSources { div#SourceDetail { margin: 0 auto; } +#Sources table.infolist tr:hover, +#Sources table.infolist tr:hover td.ColumnType { + background-color: #BFD0EA; +} /* Contact ----------------------------------------------------- */ @@ -603,6 +685,10 @@ div#SourceDetail { /* Subsection : Families ----------------------------------------------------- */ +#families table.infolist td.ColumnValue.Child table.infolist tr:hover, +table.relationships tr:hover { + background-color: #BFD0EA; +} div#families table.fixed_subtables table.eventlist { table-layout: fixed; } @@ -654,7 +740,6 @@ div#families table.attrlist td.ColumnType { } #gallery div.indexno { float: right; - width: 1.8em; font-size: large; text-align: center; background-color: #CCC; @@ -702,11 +787,21 @@ div.snapshot div.thumbnail { h4 + div.grampsstylednote, a.familymap { margin: 1em 15px; } +i.NoteType { + font-weight: bold; + font-size: .8em; +} i + div.grampsstylednote p { margin: 0 0 0.3em 0; } div.grampsstylednote p { - margin-bottom: 0.5em; + padding-bottom: 0.6em; +} + +/* Subsection : References +----------------------------------------------------- */ +#references ol { + margin-left: 2em; } /* Subsection : Family Map @@ -778,10 +873,16 @@ a.familymap { background-color: #BFD0EA; } +/* Updates +----------------------------------------------------- */ +#Updates table.list td.date { + width: 20%; +} + /* Overwritten ----------------------------------------------------- */ body#FamilyMap { - background-color: #EAEEF4 ! important; + background-color: #EAEEF4 !important; } /* Calendar Styles diff --git a/data/css/Web_Citations-Outline.css b/data/css/Web_Citations-Outline.css index 6b811624e..cfde738d9 100644 --- a/data/css/Web_Citations-Outline.css +++ b/data/css/Web_Citations-Outline.css @@ -10,7 +10,7 @@ # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # -# This program is distributed in the hope that it will be useful, +# This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. diff --git a/data/css/Web_DropDown-Menus.css b/data/css/Web_DropDown-Menus.css index bca58370b..73648fbbd 100644 --- a/data/css/Web_DropDown-Menus.css +++ b/data/css/Web_DropDown-Menus.css @@ -9,7 +9,7 @@ # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # -# This program is distributed in the hope that it will be useful, +# This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. @@ -77,8 +77,7 @@ ul#dropmenu li:hover > a { color: #fafafa } -*html ul#dropmenu li a:hover /* IE6 */ -{ +*html ul#dropmenu li a:hover /* IE6 */ { color: #fafafa } ul#dropmenu li:hover > ul { @@ -129,13 +128,11 @@ ul#dropmenu ul a { float: none; text-transform: none; } -*html ul#dropmenu ul a /* IE6 */ -{ +*html ul#dropmenu ul a /* IE6 */ { height: 10px; width: 150px; } -*:first-child+html ul#dropmenu ul a /* IE7 */ -{ +*:first-child+html ul#dropmenu ul a /* IE7 */ { height: 10px; width: 150px; } diff --git a/data/css/Web_Fade-Menus.css b/data/css/Web_Fade-Menus.css index 5a3f95241..3b475f94d 100644 --- a/data/css/Web_Fade-Menus.css +++ b/data/css/Web_Fade-Menus.css @@ -9,7 +9,7 @@ # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # -# This program is distributed in the hope that it will be useful, +# This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. diff --git a/data/css/Web_Horizontal-Menus.css b/data/css/Web_Horizontal-Menus.css index 3be0f908a..ef8613380 100644 --- a/data/css/Web_Horizontal-Menus.css +++ b/data/css/Web_Horizontal-Menus.css @@ -10,7 +10,7 @@ # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # -# This program is distributed in the hope that it will be useful, +# This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. diff --git a/data/css/Web_Mainz.css b/data/css/Web_Mainz.css index 08c82ab23..f7a04a679 100644 --- a/data/css/Web_Mainz.css +++ b/data/css/Web_Mainz.css @@ -58,7 +58,7 @@ Middle Light images/Web_Mainz_MidLight.png NarrativeWeb Styles --------------------------------------------------------------------------------------------- +---------------------------------------------------------------------------- General Elements -----------------------------------------------------------------*/ @@ -150,7 +150,8 @@ a { word-wrap: break-word; } a[href]:hover, a[href]:active { - background-color: #FFFFE7; + background-color: #D8C19F; + font-style: italic; } .grampsid { font-family: monospace; @@ -167,7 +168,7 @@ a[href]:hover, a[href]:active { /* Navigation -----------------------------------------------------------------*/ div#nav, #subnavigation { - background: url(../images/Web_Mainz_MidLight.png) #FFF2C6 repeat; + background: url(../images/Web_Mainz_Mid.png) repeat-x top left; } div#nav ul, #subnavigation ul { list-style-type: none; @@ -233,7 +234,7 @@ div#alphanav ul li a:hover { } /* Responsive navigation */ -a.navIcon { +button.navIcon { display: none; } @@ -280,11 +281,14 @@ div#nav::after { .nav li {display: none;} .nav ul {display: none;} - a.navIcon { - font-size:1.3em; + button.navIcon { display: block; - margin: 0.1em 0.4em 0.4em 0.4em; float: left; + font-size:2.9em; + line-height: 80px; + border: 0px; + color: #7D5925; + background: url(../images/Web_Mainz_Mid.png) #FFF2C6 repeat; } .nav.responsive {position: absolute; display: block; z-index: 100;} @@ -380,12 +384,40 @@ table#SortByName thead th.ColumnSurname a:after, table#SortByCount thead th.ColumnQuantity a:after { content: " \2193"; } +table#SortByName tr:hover td.ColumnSurname, +table#SortByCount tr:hover td.ColumnQuantity { + background-color: #D8C19F; +} +table#SortByName tbody tr:hover, +table#SortByCount tbody tr:hover, +table#SortByName tr:hover td.ColumnQuantity, +table#SortByCount tr:hover td.ColumnSurname { + background-color: #D8C19F; +} +table.surname tbody tr:hover, +table.surname tr:hover td.ColumnName { + background-color: #D8C19F; +} #SurnameDetail h3 { border-bottom-width: 0px; padding-bottom: 0px; margin: 0px; } +/* Individuals +----------------------------------------------------- */ +#parents table.infolist tbody tr:hover, +table.IndividualList tbody tr:hover, +table.IndividualList tr:hover td.ColumnSurname { + background-color: #D8C19F; +} + +/* Places +----------------------------------------------------- */ +#Places table.infolist tbody tr:hover, +#Places table.infolist tr:hover td.ColumnName { + background-color: #D8C19F; +} /* Events -----------------------------------------------------------------*/ #EventList tr.BeginType td { @@ -399,6 +431,10 @@ table#SortByCount thead th.ColumnQuantity a:after { #EventList td.ColumnPerson a { display: inline; } +#EventList table.infolist tbody tr:hover, +#EventList table.infolist tr:hover td.ColumnType { + background-color: #D8C19F; +} /* Family events, put mother on next line */ #EventList td.ColumnPerson span.father, #EventList td.ColumnPerson span.mother, @@ -422,9 +458,57 @@ table#SortByCount thead th.ColumnQuantity a:after { #EventDetail td.ColumnPerson span.mother:last-child:after { content: ""; } - -table.eventlist tbody tr td.ColumnSources { +#attributes table.infolist td.ColumnType { + width: 10%; + padding-left: 15px; +} +#attributes table.infolist td.ColumnValue { + width: 15%; +} +#attributes table.infolist td.ColumnSources { width: 5%; + padding-left: 5px; +} +#WebLinks table.infolist td.ColumnType { + width: 10%; + padding-left: 15px; +} +#events table.eventlist td.ColumnDate { + width: 15%; + padding-left: 10px; +} +#families table.eventlist th.ColumnDate { + width: 15%; + padding-left: 25px; +} +#families table.eventlist td.ColumnDate { + width: 15%; + padding-left: 20px; +} +#families table.eventlist tbody tr td:first-child, +#families table.eventlist thead tr th:first-child { + width: 10%; + padding-left: 0px; +} +#families table.eventlist tbody tr td.ColumnDate, +#families table.eventlist tbody tr td.ColumnNotes { + padding-left: 25px; +} +#IndividualDetail div table.eventlist td.ColumnEvent { + padding-right: 0px; + width: 8%; +} +#IndividualDetail div table.eventlist td.ColumnSources { + width: 5%; +} +#IndividualDetail div table.eventlist td.ColumnDate { + padding-right: 0px; + width: 15%; +} +#IndividualDetail div table.eventlist td.ColumnEvent, +#IndividualDetail div table.eventlist td.ColumnDate, +#IndividualDetail div table.eventlist td.ColumnPlace { + font-weight: bold; } /* Gallery @@ -485,6 +569,10 @@ table.eventlist tbody tr td.ColumnSources { div#SourceDetail { margin: 0 auto; } +#Sources table.infolist tbody tr:hover, +#Sources table.infolist tr:hover td.ColumnType { + background-color: #D8C19F; +} /* Contact -----------------------------------------------------------------*/ @@ -551,6 +639,10 @@ div#SourceDetail { /* SubSection : Families -----------------------------------------------------------------*/ +#families table.infolist td.ColumnValue.Child table.infolist tbody tr:hover, +table.relationships tr:hover td { + background-color: #D8C19F; +} div#families table.fixed_subtables table.eventlist { table-layout: fixed; } @@ -569,9 +661,6 @@ div#families .infolist h4 { #gallery { background-color: green; } -#indivgallery { - background-color: white; -} #gallery .gallerycell { float: left; width: 130px; @@ -596,7 +685,6 @@ div#families .infolist h4 { font-size: smaller; text-align: center; margin: 0.5em; - background-color: white; } #indivgallery img { border: solid 1px #7D5925; @@ -607,7 +695,6 @@ div#families .infolist h4 { } #gallery div.indexno { float: right; - width: 1.8em; font-size: large; text-align: center; background-color: #CCC; @@ -649,11 +736,21 @@ h4 + div.grampsstylednote, a.familymap { margin-left: 10px; margin-right: 10px; } +i.NoteType { + font-weight: bold; + font-size: .8em; +} i + div.grampsstylednote p { margin: 0 0 0.3em 0; } div.grampsstylednote p { - margin-bottom: 0.5em; + padding-bottom: 0.6em; +} + +/* Subsection : References +----------------------------------------------------- */ +#references ol { + margin-left: 2em; } /* SubSection : Source References @@ -721,16 +818,22 @@ div.grampsstylednote p { background: url(../images/Web_Mainz_MidLight.png) #FFF2C6; } +/* Updates +----------------------------------------------------- */ +#Updates table.list td.date { + width: 20%; +} + /* Overwritten -----------------------------------------------------------------*/ button#drop { font-style: italic; color: #FFF2C6; background: url(../images/Web_Mainz_Bkgd.png) #7D5925 repeat; - border: outset 3px black ! important; + border: outset 3px black !important; } div#map_canvas { - border-color: #7D5925 ! important; + border-color: #7D5925 !important; } /* Calendar Styles diff --git a/data/css/Web_Nebraska.css b/data/css/Web_Nebraska.css index 863873574..b9076f784 100644 --- a/data/css/Web_Nebraska.css +++ b/data/css/Web_Nebraska.css @@ -1,21 +1,21 @@ /* -************************************************************************************************** +******************************************************************************* Copyright Holder and License -************************************************************************************************** +******************************************************************************* GRAMPS Cascading Style Sheet Style Name: Nebraska Default Stylesheet Style Author: Jason M. Simanek (2008) -************************************************************************************************** +******************************************************************************* This website was created with GRAMPS --------------------------------------------------------------------------------------------------- +------------------------------------------------------------------------------- GRAMPS is a Free Software Project for Genealogy, offering a professional genealogy program, and a wiki open to all. It is a community project, created, developed and governed by genealogists. Go to to learn more! --------------------------------------------------------------------------------------------------- +------------------------------------------------------------------------------- Copyright 2008 Jason M. Simanek Copyright 2009 Stephane Charette Copyright (C) 2008-2011 Rob G. Healey @@ -34,10 +34,10 @@ A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GRAMPS. If not, see . --------------------------------------------------------------------------------------------------- +------------------------------------------------------------------------------- Color Palette --------------------------------------------------------------------------------------------------- +------------------------------------------------------------------------------- brown darkest #453619 brown dark #542 brown #A97 @@ -45,14 +45,14 @@ brown light #C1B398 brown lightest #F6F2EE gray #696969 green #5D835F --------------------------------------------------------------------------------------------- +------------------------------------------------------------------------------- NarrativeWeb Styles --------------------------------------------------------------------------------------------- +------------------------------------------------------------------------------- General Elements ------------------------------------------------------ */ +---------------------------------------------------------------------------- */ body { color:#000; @@ -172,7 +172,7 @@ p#description { background-color:#FFF; } p a { - color:#FFF; + color:#542; text-decoration:underline; } sup { @@ -284,7 +284,7 @@ div#subnavigation ul li.CurrentSection a { } /* Responsive navigation */ -a.navIcon { +button.navIcon { display: none; color: #FFF; } @@ -332,12 +332,14 @@ div#nav::after { .nav li {display: none;} .nav ul {display: none;} - a.navIcon { - font-size:1.3em; + button.navIcon { display: block; - margin: 0.1em 0.4em 0.4em 0.4em; float: left; - color: #FFF; + font-size:2.9em; + line-height: 70px; + border: 0px; + background-color: #542; + color: #FFF; } .nav.responsive {position: absolute; display: block; z-index: 100;} @@ -456,6 +458,20 @@ table.surnamelist tr th a, table.surnamelist tr th a:visited { table.surnamelist tr th:hover { background-color:#C1B398; } +table#SortByName tr:hover td.ColumnSurname, +table#SortByCount tr:hover td.ColumnQuantity { + background-color:#C1B398; +} +table#SortByName tr:hover, +table#SortByCount tr:hover, +table#SortByName tr:hover td.ColumnQuantity, +table#SortByCount tr:hover td.ColumnSurname { + background-color:#C1B398; +} +table.surname tr:hover, +table.surname tr:hover td.ColumnName { + background-color:#C1B398; +} table.surnamelist thead tr th.ColumnLetter { padding-left:20px; padding-right:10px; @@ -511,6 +527,11 @@ table.surname thead tr th.ColumnParents, table.surname tbody tr td.ColumnParents /* Individuals ----------------------------------------------------- */ +#parents table.infolist tr:hover, +table.IndividualList tr:hover, +table.IndividualList tr:hover td.ColumnSurname { + background-color:#C1B398; +} #Individuals { } #Individuals table.IndividualList { border-bottom:solid 1px #A97; @@ -554,6 +575,7 @@ table.IndividualList tbody tr td.ColumnName a:hover { #IndividualDetail div table.infolist tr td { font:normal .9em/1.2em sans-serif; vertical-align:top; + padding-left: 5px; } #IndividualDetail div table.infolist tr td a { display:inline; @@ -566,6 +588,7 @@ table.IndividualList tbody tr td.ColumnName a:hover { color:#696969; } #IndividualDetail div.subsection table tr td:first-child { + color:#696969; padding-left:20px; } #familymap a.familymap { @@ -603,6 +626,10 @@ table.attrlist tbody tr td.ColumnSources { /* Sources ----------------------------------------------------- */ +#Sources table.infolist tr:hover, +#Sources table.infolist tr:hover td.ColumnType { + background-color:#C1B398; +} #Sources { } #Sources table.infolist tbody tr td.ColumnRowLabel { padding-bottom:0; @@ -651,6 +678,10 @@ table.relationships tbody tr td.ColumnPartner a:hover { #Places table.infolist tbody tr td.ColumnName { padding:0; } +#Places table.infolist tr:hover, +#Places table.infolist tr:hover td.ColumnName { + background-color:#C1B398; +} #Places table.infolist tbody tr td.ColumnName a { padding:.1em 10px .3em 10px; } @@ -670,7 +701,11 @@ table.relationships tbody tr td.ColumnPartner a:hover { #EventDetail table.infolist tr td a { display: inline; } -#EventList table.infolist tr td span.father, +#EventList table.infolist tr:hover, +#EventList table.infolist tr:hover td.ColumnType { + background-color:#C1B398; +} +#EventList table.infolist tr td span.father, #EventList table.infolist tr td span.mother, #EventDetail table.infolist tr td span.father, #EventDetail table.infolist tr td span.mother { @@ -692,10 +727,27 @@ table.relationships tbody tr td.ColumnPartner a:hover { #EventDetail table.infolist tr td span.mother:last-child:after { content: ""; } - -table.eventlist tbody tr td.ColumnSources { +#IndividualDetail div table.eventlist tbody tr td:first-child, +#IndividualDetail div table.eventlist thead tr th:first-child { + padding-left: 10px; +} +#IndividualDetail div table.eventlist tbody tr td.ColumnSources { + padding-left: 5px; width: 5%; } +#IndividualDetail div table.eventlist tbody tr td.ColumnEvent { + padding-right: 0px; + width: 8%; +} +#IndividualDetail div table.eventlist tbody tr td.ColumnDate { + padding-left: 10px; + width: 15%; +} +#IndividualDetail div table.eventlist td.ColumnEvent, +#IndividualDetail div table.eventlist td.ColumnDate, +#IndividualDetail div table.eventlist td.ColumnPlace { + font-weight: bold; +} /* Gallery ----------------------------------------------------- */ @@ -847,9 +899,9 @@ body#ThumbnailPreview div#references table.infolist tbody tr td.ColumnName { text-decoration:underline; } -/* Download +/* Download ----------------------------------------------------- */ -#Download { +#Download { padding:1cm; height:396px; } @@ -869,7 +921,7 @@ table.download thead tr th { table.download tbody tr#Row02 { border-bottom:solid 2px #000; } -table.download thead tr th, table.download tbody tr td { +table.download thead tr th, table.download tbody tr td { padding-left:10px; padding-top:20px; border-style:solid; @@ -972,9 +1024,6 @@ div#events h4 { padding-bottom:4px; background-color:#A97; } -#IndividualDetail div#events table.infolist thead tr th:first-child { - padding-left:20px; -} #IndividualDetail div#events table.infolist tbody tr td { padding-top:.4em; padding-bottom:.8em; @@ -990,6 +1039,51 @@ table.infolist tbody tr td.ColumnValue p { color:#696969; margin:.2em 0 0 2em; } +#attributes table.infolist td.ColumnType { + width: 10%; + padding-left: 15px; +} +#attributes table.infolist td.ColumnValue { + width: 15%; +} +#attributes table.infolist td.ColumnSources { + width: 5%; + padding-left: 5px; +} +#WebLinks table.weblinks tbody tr td:first-child { + vertical-align:middle; +} +#WebLinks table.weblinks td.ColumnType, +#WebLinks table.weblinks td.ColumnDescription { +} +#events table.eventlist td.ColumnDate { + width: 15%; + padding-left: 10px; +} +#families table.eventlist th.ColumnDate { + width: 15%; + padding-left: 10px; +} +#families table.eventlist td.ColumnEvent, +#families table.eventlist td.ColumnDate, +#families table.eventlist td.ColumnPlace, +#families table.eventlist td.ColumnDescription, +#families table.eventlist td.ColumnSources { + padding-top:.4em; + padding-bottom:.8em; +} +#families table.eventlist td.ColumnDate { + width: 15%; + padding-left: 20px; +} +#families table.eventlist td.ColumnNotes { + font:normal 1.1em/1.4em sans-serif; +} +#families table.eventlist tbody tr td:first-child, +#families table.eventlist thead tr th:first-child { + width: 10%; + padding-left: 0px; +} /* Subsections : Attributes ----------------------------------------------------- */ @@ -1012,10 +1106,15 @@ div#parents table.infolist tbody tr td.ColumnValue ol li { /* Subsections : Families ----------------------------------------------------- */ +#families table.infolist td.ColumnValue.Child table.infolist tr:hover, +table.relationships tr:hover { + background-color:#C1B398; +} div#families table.infolist { margin-top:.5em; } div#families table.infolist tbody tr td.ColumnValue p { + margin-left:0; margin-top:0; } div#families table.infolist tbody tr td.ColumnValue ol { @@ -1063,9 +1162,6 @@ div#Addresses table.infolist tr td a, div#Addresses table.infolist tr td p a { #gallery { background-color: green; } -#indivgallery { - background-color: white; -} #gallery .gallerycell { float: left; width: 130px; @@ -1088,11 +1184,10 @@ div#Addresses table.infolist tr td a, div#Addresses table.infolist tr td p a { float:left; width:130px; text-align:center; - background-color: white; + background-color: #F6F2EE; } #gallery div.indexno { float: right; - width: 1.8em; font-size: large; text-align: center; background-color: #CCC; @@ -1155,16 +1250,26 @@ div.snapshot div.thumbnail { div.narrative { padding-bottom:0; } +i.NoteType { + font-weight: bold; + font-size: .8em; +} i + div.grampsstylednote p { margin: 0.1em 0 0.2em 0; } +div.grampsstylednote p { + padding-bottom: 0.6em; +} .narrative p { margin: 0.1em 0 0.2em 0; font:normal .9em/1.4em sans-serif; } -/* Subsections : References +/* Subsection : References ----------------------------------------------------- */ +#references ol { + margin-left: 3em; +} /* Subsections : Source References ----------------------------------------------------- */ @@ -1306,6 +1411,12 @@ div#pedigree { padding: 0; } +/* Updates +----------------------------------------------------- */ +#Updates table.list td.date { + width: 20%; +} + /* Calendar Styles -------------------------------------------------------------------------------------------- */ /* Calendar : General */ @@ -1343,12 +1454,12 @@ body#WebCal { vertical-align: top; height: 2em; } -.calendar thead tr th.weekend, +.calendar thead tr th.weekend, .calendar thead tr th.weekday { color:#542; background-color:#A97; } -.calendar thead tr th.saturday, +.calendar thead tr th.saturday, .calendar thead tr th.sunday { } .calendar tfoot tr td { padding:.7em 5% 1em 5%; @@ -1434,9 +1545,9 @@ body#WebCal { } /* Calendar : Previous-Next Month */ -.calendar tbody tr td.previous, -.calendar tbody tr td.next, -.calendar tbody tr td.previous div.date, +.calendar tbody tr td.previous, +.calendar tbody tr td.next, +.calendar tbody tr td.previous div.date, .calendar tbody tr td.next div.date { color:#A97; background-color:#F6F2EE; diff --git a/data/css/Web_Print-Default.css b/data/css/Web_Print-Default.css index 5a2dd6b54..d05442983 100644 --- a/data/css/Web_Print-Default.css +++ b/data/css/Web_Print-Default.css @@ -1,22 +1,22 @@ /* -************************************************************************************************** +******************************************************************************* Copyright Holder and License -************************************************************************************************** +******************************************************************************* GRAMPS Cascading Style Sheet Style Name: Print Style Sheet Style Author: Jason M. Simanek (2008) Modified by Rob G. Healey, July 2008 -************************************************************************************************** +******************************************************************************* This website was created with GRAMPS --------------------------------------------------------------------------------------------------- +------------------------------------------------------------------------------- GRAMPS is a Free Software Project for Genealogy, offering a professional genealogy program, and a wiki open to all. It is a community project, created, developed and governed by genealogists. 'Go to to learn more! --------------------------------------------------------------------------------------------------- +------------------------------------------------------------------------------- Copyright (C) 2008-2011 Rob G. Healey This file is part of the GRAMPS program. @@ -31,21 +31,21 @@ A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GRAMPS. If not, see . --------------------------------------------------------------------------------------------------- +------------------------------------------------------------------------------- Color Palette --------------------------------------------------------------------------------------------------- +------------------------------------------------------------------------------- gray #A7A7A7 red #520 black #000 white #FFF ---------------------------------------------------------------------------------------------------- +------------------------------------------------------------------------------- NarrativeWeb Styles --------------------------------------------------------------------------------------------- +------------------------------------------------------------------------------- - General Elements + General Elements ----------------------------------------------------- */ body { @@ -419,7 +419,7 @@ body#ThumbnailPreview div#references table.infolist tbody tr td.ColumnName { width: 90%; } -/* Contact +/* Contact ----------------------------------------------------- */ #researcher { margin:16pt 0 0 0; @@ -456,13 +456,13 @@ body#ThumbnailPreview div#references table.infolist tbody tr td.ColumnName { clear:left; } -/* Subsections +/* Subsections ----------------------------------------------------- */ #Home, #Introduction, #Download, #Contact { padding:3em 20px; } -/* Subsections : Events +/* Subsections : Events ----------------------------------------------------- */ #IndividualDetail .ColumnValue { padding:4pt 0; @@ -472,7 +472,7 @@ body#ThumbnailPreview div#references table.infolist tbody tr td.ColumnName { margin:1pt 0 0 18pt; } -/* Subsections : Gallery +/* Subsections : Gallery ----------------------------------------------------- */ #indivgallery h4 { margin-bottom:1em; @@ -532,7 +532,7 @@ table.attrlist tbody tr td.ColumnSources { width: 10%; } -/* Subsections : Pedigree +/* Subsections : Pedigree ----------------------------------------------------- */ #pedigree a { text-decoration:none; @@ -574,7 +574,7 @@ table.attrlist tbody tr td.ColumnSources { font-weight:bold; } -/* Subsections : Ancestors Tree +/* Subsections : Ancestors Tree ----------------------------------------------------- */ #tree { page-break-before:always; @@ -674,7 +674,7 @@ p#createdate { display: none; } -/* Calendar Styles +/* Calendar Styles -------------------------------------------------------------------------------------------- */ /* Calendar : General */ body#WebCal h1#SiteTitle { @@ -791,9 +791,9 @@ body#WebCal a { } /* Calendar : Previous-Next Month */ -.calendar tbody tr td.previous, -.calendar tbody tr td.next, -.calendar tbody tr td.previous div.date, +.calendar tbody tr td.previous, +.calendar tbody tr td.next, +.calendar tbody tr td.previous div.date, .calendar tbody tr td.next div.date { font-weight:normal; font-size:12pt; diff --git a/data/css/Web_Vertical-Menus.css b/data/css/Web_Vertical-Menus.css index ef3c2339e..c5427ae9d 100644 --- a/data/css/Web_Vertical-Menus.css +++ b/data/css/Web_Vertical-Menus.css @@ -10,7 +10,7 @@ # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # -# This program is distributed in the hope that it will be useful, +# This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. @@ -20,17 +20,18 @@ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # -************************************************************************************************** +******************************************************************************* GRAMPS Cascading Style Sheet Style Name: Web_Navigation-Vertical.css Stylesheet -*************************************************************************************************** +******************************************************************************* # $Id: Web_Navigation-Vertical.css 15241 2010-04-19 11:07:00Z robhealey1 $ Body Element ----------------------------------------------------- */ -body { background: -webkit-gradient - (linear, left top, left bottom, from(#ccc), to(#fff)); +body { + background: -webkit-gradient (linear, left top, left bottom, + from(#ccc), to(#fff)); color: #000; padding: 60px 0px 0px 146px; } diff --git a/data/css/Web_Visually.css b/data/css/Web_Visually.css index 2e7bf8e0a..54e77e89a 100644 --- a/data/css/Web_Visually.css +++ b/data/css/Web_Visually.css @@ -10,7 +10,7 @@ # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # -# This program is distributed in the hope that it will be useful, +# This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. @@ -20,15 +20,15 @@ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # -************************************************************************************************** +******************************************************************************* GRAMPS Cascading Style Sheet Style Name: Visually Impaired Stylesheet Style Author: Jason M. Simanek (2008) -*************************************************************************************************** +******************************************************************************* --------------------------------------------------------------------------------------------------- +------------------------------------------------------------------------------- Color Palette --------------------------------------------------------------------------------------------------- +------------------------------------------------------------------------------- brown dark #453619, #542 brown light #C1B398 gray #696969 @@ -47,7 +47,7 @@ Females Web_Gender_Female.png NarrativeWeb Styles --------------------------------------------------------------------------------------------- */ +---------------------------------------------------------------------------- */ div#alphabet ul li { background-color: #6AF364; } @@ -96,8 +96,6 @@ img { background:none; } .content { - overflow: auto; - width:965px; margin:0 auto; padding-bottom: .2em; } @@ -349,7 +347,7 @@ table.infolist tbody tr td.ColumnPartner a { table.infolist tbody tr td.ColumnParents { font-size:.9em; } -table.infolist tbody tr td.ColumnParents span.father, +table.infolist tbody tr td.ColumnParents span.father, table.infolist tbody tr td.ColumnParents span.mother { display:block; } @@ -366,7 +364,7 @@ table.infolist tbody tr td.ColumnParents span.mother:before { #SurnameDetail p#description { padding-top:0; } -table.surnamelist thead tr th.ColumnSurname, +table.surnamelist thead tr th.ColumnSurname, #Surnames table.surnamelist tbody tr td.ColumnSurname { width:50%; } @@ -391,11 +389,11 @@ table.surnamelist tbody tr td.ColumnLetter a { table.surnamelist tbody tr td.ColumnSurname { background-color: #FFF; } -table#SortByName thead tr th.ColumnSurname, +table#SortByName thead tr th.ColumnSurname, table#SortByCount thead tr th.ColumnQuantity { background-color: #C1B398; } -table#SortByName thead tr th.ColumnSurname a:after, +table#SortByName thead tr th.ColumnSurname a:after, table#SortByCount thead tr th.ColumnQuantity a:after { content:" ↓"; } @@ -443,7 +441,7 @@ table.surname tbody tr td.ColumnPartner a { display:block; padding:.6em 10px .6em 0px; } -table.surname thead tr th.ColumnParents, +table.surname thead tr th.ColumnParents, table.surname tbody tr td.ColumnParents { width:25%; } @@ -465,7 +463,7 @@ div#Individuals table.IndividualList tbody tr td a { display: block; padding: .6em 10px; } -div#Individuals table.IndividualList tbody tr td.ColumnSurname a:hover, +div#Individuals table.IndividualList tbody tr td.ColumnSurname a:hover, div#Individuals table.IndividualList tbody tr td.ColumnSurname a:active { cursor:default; color: #000; @@ -666,7 +664,7 @@ div#EventList table.alphaevent tbody tr td.ColumnDate { div#EventList table.alphaevent tbody tr td.ColumnPerson { width: 60%; } -div#EventList table.alphaevent tbody tr td.ColumnPerson span.father, +div#EventList table.alphaevent tbody tr td.ColumnPerson span.father, div#EventList table.alphaevent tbody tr td.ColumnPerson span.mother { display:block; } @@ -696,7 +694,7 @@ div#EventDetail table.eventlist tbody tr td.ColumnDate { div#EventDetail table.eventlist tbody tr td.ColumnPerson { background-color: #D8F3D6; } - + /* Events ----------------------------------------------------- */ #EventList table.infolist tr.BeginType td { @@ -709,7 +707,7 @@ div#EventDetail table.eventlist tbody tr td.ColumnPerson { #EventDetail table.infolist tr td a { display: inline; } -#EventList table.infolist tr td span.father, +#EventList table.infolist tr td span.father, #EventList table.infolist tr td span.mother, #EventDetail table.infolist tr td span.father, #EventDetail table.infolist tr td span.mother { @@ -731,6 +729,20 @@ div#EventDetail table.eventlist tbody tr td.ColumnPerson { #EventDetail table.infolist tr td span.mother:last-child:after { content: ""; } +#IndividualDetail div table.eventlist td.ColumnSources { + width: 5%; +} +#IndividualDetail div table.eventlist td.ColumnDate { + width: 15%; +} +#IndividualDetail div table.eventlist td.ColumnEvent { + width: 8%; +} +#IndividualDetail div table.eventlist td.ColumnEvent, +#IndividualDetail div table.eventlist td.ColumnDate, +#IndividualDetail div table.eventlist td.ColumnPlace { + font-weight: bold; +} /* Gallery ----------------------------------------------------- */ @@ -899,7 +911,7 @@ body#ThumbnailPreview div#references table.infolist tbody tr td.ColumnName { text-decoration:none; } -/* Download +/* Download ----------------------------------------------------- */ div#Download { margin: 0; @@ -912,7 +924,7 @@ div#Download table.download { div#Download table.download tbody tr#Row02 { border-bottom: solid 1px #000; } -div#Download table.download tbody tr td { +div#Download table.download tbody tr td { border: solid 1px #000; text-align: left; padding: 5px 0px 5px 0px; @@ -1197,6 +1209,7 @@ div#families table.infolist tbody tr td.ColumnValue { } div#families table.infolist tbody tr td.ColumnValue p { margin-top:0; + margin-left:0; } div#families table.infolist tbody tr td.ColumnValue ol { margin:0; @@ -1489,7 +1502,7 @@ body#WebCal { vertical-align: top; height: 2em; } -.calendar thead tr th.weekend, +.calendar thead tr th.weekend, .calendar thead tr th.weekday { font-style:italic; color: #000; @@ -1581,9 +1594,9 @@ body#WebCal { } /* Calendar : Previous-Next Month */ -.calendar tbody tr td.previous, -.calendar tbody tr td.next, -.calendar tbody tr td.previous div.date, +.calendar tbody tr td.previous, +.calendar tbody tr td.next, +.calendar tbody tr td.previous div.date, .calendar tbody tr td.next div.date { color: #333; background-color: #D8F3D6; diff --git a/data/css/ancestortree.css b/data/css/ancestortree.css index 3a27b6b17..0fc6b27ac 100644 --- a/data/css/ancestortree.css +++ b/data/css/ancestortree.css @@ -33,13 +33,14 @@ Unknown #000 ===== Web Graphics ===== Males Web_Gender_Male.png Females Web_Gender_Female.png -# -------------------------------------------------------------------------- # +# -------------------------------------------------------------------------- */ /* Subsections : Ancestors Tree -------------------------------------------- */ #tree { page-break-before:always; margin:0; padding:0; background:none; + overflow-x:auto; } #treeContainer { position:relative; diff --git a/data/css/narrative-maps.css b/data/css/narrative-maps.css index 0fb9d1007..74f12726e 100644 --- a/data/css/narrative-maps.css +++ b/data/css/narrative-maps.css @@ -64,13 +64,13 @@ div#FamilyMapDetail div#references table.infolist { width: 100%; } div#FamilyMapDetail div#references table.infolist tbody tr td.ColumnPlace { - width: 40%; + width: 70%; } /* Subsection: popup ------------------------------------------------------ */ -.ol-popup { +#map_canvas .ol-popup { position: absolute; background-color: white; -webkit-filter: drop-shadow(0 1px 4px rgba(0,0,0,0.2)); @@ -82,7 +82,7 @@ div#FamilyMapDetail div#references table.infolist tbody tr td.ColumnPlace { left: -50px; min-width: 450px; } -.ol-popup:after, .ol-popup:before { +#map_canvas .ol-popup:after, #map_canvas .ol-popup:before { top: 100%; border: solid transparent; height: 0; @@ -90,24 +90,64 @@ div#FamilyMapDetail div#references table.infolist tbody tr td.ColumnPlace { position: absolute; pointer-events: none; } -.ol-popup:after { +#map_canvas .ol-popup:after { border-top-color: white; border-width: 10px; left: 48px; margin-left: -10px; } -.ol-popup:before { +#map_canvas .ol-popup:before { border-top-color: #cccccc; border-width: 11px; left: 48px; margin-left: -11px; } -.ol-popup-closer { +#map_canvas .ol-popup-closer { text-decoration: none; position: absolute; top: 2px; right: 8px; } -.ol-popup-closer:after { +#map_canvas .ol-popup-closer:after { content: "✖"; } +#popup-content { + max-height: 250px; + overflow-y: auto; +} +#map_canvas .ol-control { + position: absolute; + background-color: rgba(255,255,255,0.1); + bottom: .1em; + left: .1em; + height: 4%; + width: 100%; + margin-top: 1px; + margin-bottom: 1px; + padding-left: 1px; +} +#map_canvas .ol-rotate { + display: none; +} +#map_canvas .ol-zoom, #map_canvas .ol-zoom-in, #map_canvas .ol-zoom-out { + top: .5em; + left: .5em; + border-left-width: 1px; + padding-left: 1px; + padding-right: 1px; +} +#map_canvas .ol-attribution ul { + list-style-type: none; + font-size:0.8em; + float: left; + margin-top: 1px; + margin-bottom: 1px; + padding-left: 5px; +} +#map_canvas .ol-attribution li { + float: left; + padding-left: 5px; +} +#map_canvas .ol-attribution button { + display: none; +} diff --git a/gramps/plugins/webreport/basepage.py b/gramps/plugins/webreport/basepage.py index ee950e590..eb91a1179 100644 --- a/gramps/plugins/webreport/basepage.py +++ b/gramps/plugins/webreport/basepage.py @@ -60,6 +60,7 @@ import logging from gramps.gen.const import GRAMPS_LOCALE as glocale from gramps.gen.lib import (FamilyRelType, NoteType, NameType, Person, UrlType, Name, PlaceType, EventRoleType, + Source, Attribute, Media, Repository, Event, Family, Citation, Place, Date) from gramps.gen.lib.date import Today from gramps.gen.const import PROGRAM_NAME, URL_HOMEPAGE @@ -130,6 +131,8 @@ class BasePage: # pylint: disable=C1001 self.create_media = report.options['gallery'] self.create_unused_media = report.options['unused'] self.create_thumbs_only = report.options['create_thumbs_only'] + self.create_images_index = report.options['create_images_index'] + self.create_thumbs_index = report.options['create_thumbs_index'] self.inc_families = report.options['inc_families'] self.inc_events = report.options['inc_events'] self.usecms = report.options['usecms'] @@ -351,10 +354,9 @@ class BasePage: # pylint: disable=C1001 if family_events: trow = Html("tr") + ( Html("td", " ", class_="ColumnType", inline=True), - Html("td", " ", class_="ColumnAttribute", inline=True), Html("td", self.format_family_events(family_events, place_lat_long), - class_="ColumnValue") + class_="ColumnValue", colspan=2) ) table = trow @@ -377,13 +379,13 @@ class BasePage: # pylint: disable=C1001 childlist = family.get_child_ref_list() if childlist: trow = Html("tr") + ( - Html("td", " ", class_="ColumnType", inline=True), Html("td", self._("Children"), class_="ColumnAttribute", inline=True) ) table = table + trow if table is not None else trow - tcell = Html("td", class_="ColumnValue", close=False) + tcell = Html("td", class_="ColumnValue Child", close=False, + colspan=2) trow += tcell with Html("table", class_="infolist eventlist") as table2: @@ -517,7 +519,8 @@ class BasePage: # pylint: disable=C1001 for (data, colclass) in [ (str(attr.get_type()), "ColumnType"), (attr.get_value(), "ColumnValue"), - (self.dump_notes(attr.get_note_list()), "ColumnNotes"), + (self.dump_notes(attr.get_note_list(), Attribute), + "ColumnNotes"), (self.get_citation_links(attr.get_citation_list()), "ColumnSources") ] @@ -610,7 +613,7 @@ class BasePage: # pylint: disable=C1001 htmllist.extend(Html('p') + linelist) return htmllist - def dump_notes(self, notelist): + def dump_notes(self, notelist, parent=None): """ dump out of list of notes with very little elements of its own @@ -621,11 +624,24 @@ class BasePage: # pylint: disable=C1001 # begin unordered list notesection = Html("div") + idx = 0 for notehandle in notelist: this_note = self.r_db.get_note_from_handle(notehandle) + title = self._(this_note.type.xml_str()) if this_note is not None: - notesection.extend(Html("i", self._(this_note.type.xml_str()), - class_="NoteType")) + idx += 1 + if len(notelist) > 1: + if self.default_note(parent, int(this_note.type)): + title_text = self._("Note: %s") % str(idx) + else: + title = " (" + title + ")" + title_text = self._("Note: %s") % str(idx) + title + else: + if self.default_note(parent, int(this_note.type)): + title_text = self._("Note") + else: + title_text = title + notesection.extend(Html("i", title_text, class_="NoteType")) notesection.extend(self.get_note_format(this_note, True)) return notesection @@ -682,7 +698,7 @@ class BasePage: # pylint: disable=C1001 etype, event_gid, uplink) if hyperlink else etype - trow += Html("td", event_hyper, class_="ColumnEvent") + trow += Html("td", event_hyper, class_="ColumnEvent", rowspan=2) # get event data event_data = self.get_event_data(event, event_ref, uplink) @@ -694,7 +710,6 @@ class BasePage: # pylint: disable=C1001 ) trow2 = Html("tr") - trow2 += Html("td", "", class_="ColumnEvent") # get event source references srcrefs = self.get_citation_links(event.get_citation_list()) or " " trow += Html("td", srcrefs, class_="ColumnSources", rowspan=2) @@ -703,7 +718,7 @@ class BasePage: # pylint: disable=C1001 notelist = event.get_note_list()[:] # we don't want to modify # cached original notelist.extend(event_ref.get_note_list()) - htmllist = self.dump_notes(notelist) + htmllist = self.dump_notes(notelist, Event) # if the event or event reference has an attribute attached to it, # get the text and format it correctly? @@ -720,7 +735,7 @@ class BasePage: # pylint: disable=C1001 #also output notes attached to the attributes notelist = attr.get_note_list() if notelist: - htmllist.extend(self.dump_notes(notelist)) + htmllist.extend(self.dump_notes(notelist, Event)) trow2 += Html("td", htmllist, class_="ColumnNotes", colspan=3) @@ -1387,9 +1402,9 @@ class BasePage: # pylint: disable=C1001 del page[0] # Header constants - _meta1 = 'name ="viewport" content="width=device-width; ' - _meta1 += 'height=device-height; initial-scale=1.0; ' - _meta1 += 'minimum-scale=0.5; maximum-scale=10.0; user-scalable=yes"' + _meta1 = 'name ="viewport" content="width=device-width, ' + _meta1 += 'height=device-height, initial-scale=1.0, ' + _meta1 += 'minimum-scale=0.5, maximum-scale=10.0, user-scalable=yes"' _meta2 = 'name ="apple-mobile-web-app-capable" content="yes"' _meta3 = 'name="generator" content="%s %s %s"' % ( PROGRAM_NAME, VERSION, URL_HOMEPAGE) @@ -1417,13 +1432,21 @@ class BasePage: # pylint: disable=C1001 # create stylesheet and favicon links links = Html("link", type="image/x-icon", - href=url4, rel="shortcut icon") + ( - Html("link", type="text/css", href=url3, - media='print', rel="stylesheet", indent=False), - Html("link", type="text/css", href=url2, - media="screen", title=self._("Default"), - rel="stylesheet", indent=False), - ) + href=url4, rel="shortcut icon") + # attach the ancestortree style sheet if ancestor + # graph is being created? + if self.report.options["ancestortree"]: + if self.usecms: + fname = "/".join([self.target_uri, "css", "ancestortree.css"]) + else: + fname = "/".join(["css", "ancestortree.css"]) + url5 = self.report.build_url_fname(fname, None, self.uplink) + links += Html("link", type="text/css", href=url5, + media="screen", rel="stylesheet", indent=False) + links += Html("link", type="text/css", href=url3, + media='print', rel="stylesheet", indent=False) + links += Html("link", type="text/css", href=url2, + media="screen", rel="stylesheet", indent=False) # create all alternate stylesheets # Cannot use it on local files (file://) for css_f in CSS: @@ -1435,7 +1458,7 @@ class BasePage: # pylint: disable=C1001 urlx = self.report.build_url_fname(fname, None, self.uplink) links += Html("link", rel="alternate stylesheet", - title=css_f, indent=False, + title=self._(css_f), indent=False, media="screen", type="text/css", href=urlx) @@ -1463,13 +1486,11 @@ class BasePage: # pylint: disable=C1001 body += outerwrapperdiv # begin header section - #headerdiv = Html("div", id='header') + ( headerdiv = Html("div", id='header') + ( - Html("")) + ( - Html("h1", html_escape(self.title_str), + Html("")) + headerdiv += Html("h1", html_escape(self.title_str), id="SiteTitle", inline=True) - ) outerwrapperdiv += headerdiv header_note = self.report.options['headernote'] @@ -1544,12 +1565,15 @@ class BasePage: # pylint: disable=C1001 ('places', self._("Places"), self.report.inc_places), ('sources', self._("Sources"), self.report.inc_sources), ('repositories', self._("Repositories"), inc_repos), - ('media', self._("Media"), _create_media_link), - ('thumbnails', self._("Thumbnails"), self.create_media), + ('media', self._("Media"), self.create_images_index and + self.report.inc_gallery and not self.report.create_thumbs_only), + ('thumbnails', self._("Thumbnails"), self.create_thumbs_index and + self.report.inc_gallery), ('download', self._("Download"), self.report.inc_download), ("addressbook", self._("Address Book"), self.report.inc_addressbook), ('contact', self._("Contact"), self.report.use_contact), + ('updates', self._("Updates"), self.report.inc_updates), ('statistics', self._("Statistics"), self.report.inc_stats), (self.target_cal_uri, self._("Web Calendar"), self.usecal) ] @@ -2009,10 +2033,12 @@ class BasePage: # pylint: disable=C1001 # Begin hyperlink. Description is given only for # the purpose of the alt tag in img element - snapshot += self.media_link(photo_handle, newpath, - descr, - uplink=self.uplink, - usedescr=False) + if self.create_images_index: + snapshot += self.media_link(photo_handle, + newpath, + descr, + uplink=self.uplink, + usedescr=False) except (IOError, OSError) as msg: self.r_user.warn(_("Could not add photo to page"), @@ -2099,11 +2125,39 @@ class BasePage: # pylint: disable=C1001 # return indivgallery division to its caller return section - def display_note_list(self, notelist=None): + def default_note(self, parent, notetype): + """ + return true if the notetype is the same as the parent + + @param: parent -- The object (Person, Family, Media,...) + @param: notetype -- The type for the current note + """ + if parent == Person and notetype == NoteType.PERSON: + return True + elif parent == Family and notetype == NoteType.FAMILY: + return True + elif parent == Media and notetype == NoteType.MEDIA: + return True + elif parent == Repository and notetype == NoteType.REPO: + return True + elif parent == Source and notetype == NoteType.SOURCE: + return True + elif parent == Event and notetype == NoteType.EVENT: + return True + elif parent == Place and notetype == NoteType.PLACE: + return True + elif parent == Citation and notetype == NoteType.CITATION: + return True + elif parent == Attribute and notetype == NoteType.ATTRIBUTE: + return True + return False + + def display_note_list(self, notelist=None, parent=None): """ Display note list @param: notelist -- The list of notes + @param: parent -- The parent associated to these notes """ if not notelist: return None @@ -2111,14 +2165,27 @@ class BasePage: # pylint: disable=C1001 # begin narrative division with Html("div", class_="subsection narrative") as section: + idx = 0 for notehandle in notelist: note = self.r_db.get_note_from_handle(notehandle) + title = self._(note.type.xml_str()) if note: note_text = self.get_note_format(note, True) - + idx += 1 + if len(notelist) > 1: + if self.default_note(parent, int(note.type)): + title_text = self._("Note: %s") % str(idx) + else: + title = " (" + title + ")" + title_text = self._("Note: %s") % str(idx) + title + else: + if self.default_note(parent, int(note.type)): + title_text = self._("Note") + else: + title_text = title # add section title - section += Html("h4", self._("Narrative"), inline=True) + section += Html("h4", title_text, inline=True) # attach note section += note_text @@ -2681,47 +2748,6 @@ class BasePage: # pylint: disable=C1001 tbody += trow tbody += Html("tr") + Html("td", " ", colspan=2) - # encloses - with Html("div", class_='subsection encloses') as encloses: - tbody += encloses - encloses += Html("h4", self._("Place Encloses"), inline=True) - with Html("table", class_="infolist place") as table: - encloses += table - visited = [place.handle] - for link in self.r_db.find_backlink_handles( - place.handle, include_classes=['Place']): - if link[1] in visited: - continue - visited.append(link[1]) - c_place = self.r_db.get_place_from_handle(link[1]) - placeref = None - for placeref in c_place.get_placeref_list(): - if placeref.ref == place.handle: - gpfh = self.r_db.get_place_from_handle - eplace = gpfh(placeref.ref) - if not eplace: - continue - place_name = c_place.get_name().get_value() - table += Html("tr") + Html("td", place_name) - - # enclosed by - with Html("div", class_='subsection encloses') as encloses: - tbody += encloses - encloses += Html("h4", self._("Enclosed By"), inline=True) - with Html("table", class_="infolist place") as table: - encloses += table - visited = [place.handle] - placeref = None - for placeref in place.get_placeref_list(): - if placeref.ref in visited: - continue - visited.append(placeref.ref) - pplace = self.r_db.get_place_from_handle(placeref.ref) - if not pplace: - continue - place_name = pplace.get_name().get_value() - table += Html("tr") + Html("td", place_name) - # enclosed by tbody += Html("tr") + Html("td", " ") trow = Html("tr") + ( @@ -2740,7 +2766,7 @@ class BasePage: # pylint: disable=C1001 else: place_hyper = place_name trow = Html("tr") + ( - Html("td", place_hyper, class_="ColumnValue", + Html("td", place_hyper, class_="ColumnPlace", inline=True)) tbody += trow @@ -2766,7 +2792,7 @@ class BasePage: # pylint: disable=C1001 place_hyper = place_name trow = Html("tr") + ( Html("td", place_hyper, - class_="ColumnValue", inline=True)) + class_="ColumnPlace", inline=True)) tbody += trow # return place table to its callers diff --git a/gramps/plugins/webreport/common.py b/gramps/plugins/webreport/common.py index 6c99dd14c..3814cdd4c 100644 --- a/gramps/plugins/webreport/common.py +++ b/gramps/plugins/webreport/common.py @@ -57,14 +57,14 @@ HTTPS = "https://" GOOGLE_MAPS = 'https://maps.googleapis.com/maps/' # javascript code for marker path MARKER_PATH = """ - var marker_png = '%s' + var marker_png = '%s'; """ # javascript code for Google's FamilyLinks... FAMILYLINKS = """ - var tracelife = %s + var tracelife = %s; - function initialize() { + window.addEventListener("load", function() { var myLatLng = new google.maps.LatLng(%s, %s); var mapOptions = { @@ -86,18 +86,19 @@ FAMILYLINKS = """ }); flightPath.setMap(map); - }""" + }); +""" # javascript for Google's Drop Markers... DROPMASTERS = """ var markers = []; var iterator = 0; - var tracelife = %s + var tracelife = %s; var map; var myLatLng = new google.maps.LatLng(%s, %s); - function initialize() { + window.addEventListener("load", function() { var mapOptions = { scaleControl: true, zoomControl: true, @@ -107,7 +108,7 @@ DROPMASTERS = """ }; map = new google.maps.Map(document.getElementById("map_canvas"), mapOptions); - }; + }); function drop() { for (var i = 0; i < tracelife.length; i++) { @@ -144,11 +145,11 @@ DROPMASTERS = """ # javascript for Google's Markers... MARKERS = """ - var tracelife = %s + var tracelife = %s; var map; var myLatLng = new google.maps.LatLng(%s, %s); - function initialize() { + window.addEventListener("load", function() { var mapOptions = { scaleControl: true, panControl: true, @@ -160,7 +161,7 @@ MARKERS = """ map = new google.maps.Map(document.getElementById("map_canvas"), mapOptions); addMarkers(); - } + }); function addMarkers() { var bounds = new google.maps.LatLngBounds(); @@ -189,7 +190,6 @@ MARKERS = """ infoWindow.open(map, marker); }); } - """ # javascript for OpenStreetMap's markers... @@ -198,9 +198,9 @@ https://openlayers.org/en/latest/examples/ """ OSM_MARKERS = """ - function initialize(){ + window.addEventListener("load", function() { var map; - var tracelife = %s + var tracelife = %s; var iconStyle = new ol.style.Style({ image: new ol.style.Icon(({ anchor: [0.2, 48], @@ -241,9 +241,9 @@ OSM_MARKERS = """ """ STAMEN_MARKERS = """ - function initialize(){ + window.addEventListener("load", function() { var map; - var tracelife = %s + var tracelife = %s; var layer = '%s'; var iconStyle = new ol.style.Style({ image: new ol.style.Icon(({ @@ -292,23 +292,20 @@ OPENLAYER = """ var closer = document.getElementById('popup-closer'); var tip = document.getElementById('tooltip'); var tipcontent = document.getElementById('tooltip-content'); - var tooltip = new ol.Overlay({ element: tip, positioning: 'bottom-center', offset: [10, 0], }); map.addOverlay(tooltip); - var popup = new ol.Overlay({ element: element, positioning: 'bottom-center', autoPan: true, autoPanAnimation: { duration: 500 }, - stopEvent: false + stopEvent: true }); map.addOverlay(popup); - /** * Add a click handler to hide the popup. * @return {boolean} Don't follow the href. @@ -318,7 +315,6 @@ OPENLAYER = """ closer.blur(); return false; }; - map.on('pointermove', function(evt) { evt.preventDefault() var feature = this.forEachFeatureAtPixel(evt.pixel, @@ -338,10 +334,9 @@ OPENLAYER = """ } else { tooltip.setPosition(undefined); } - }); map.on('singleclick', function(evt) { - evt.preventDefault() + evt.preventDefault(); var feature = map.forEachFeatureAtPixel(evt.pixel, function(feature, layer) { return feature; @@ -355,8 +350,7 @@ OPENLAYER = """ popup.setPosition(undefined); } }); - - }; + }); """ # variables for alphabet_navigation() diff --git a/gramps/plugins/webreport/event.py b/gramps/plugins/webreport/event.py index c6fa904a9..33045f097 100644 --- a/gramps/plugins/webreport/event.py +++ b/gramps/plugins/webreport/event.py @@ -413,7 +413,7 @@ class EventPages(BasePage): # Narrative subsection notelist = event.get_note_list() - notelist = self.display_note_list(notelist) + notelist = self.display_note_list(notelist, Event) if notelist is not None: eventdetail += notelist diff --git a/gramps/plugins/webreport/family.py b/gramps/plugins/webreport/family.py index 9ab917559..2c0525046 100644 --- a/gramps/plugins/webreport/family.py +++ b/gramps/plugins/webreport/family.py @@ -367,7 +367,7 @@ class FamilyPages(BasePage): # Narrative subsection notelist = family.get_note_list() if notelist: - relationshipdetail += self.display_note_list(notelist) + relationshipdetail += self.display_note_list(notelist, Family) # display family LDS ordinance... family_lds_ordinance_list = family.get_lds_ord_list() diff --git a/gramps/plugins/webreport/media.py b/gramps/plugins/webreport/media.py index 3672cfbe2..39ac72d8b 100644 --- a/gramps/plugins/webreport/media.py +++ b/gramps/plugins/webreport/media.py @@ -97,6 +97,7 @@ class MediaPages(BasePage): self.media_dict = defaultdict(set) self.unused_media_handles = [] self.cur_fname = None + self.create_images_index = self.report.options['create_images_index'] def display_pages(self, title): """ @@ -190,7 +191,8 @@ class MediaPages(BasePage): """ BasePage.__init__(self, report, title) - output_file, sio = self.report.create_file("media") + if self.create_images_index: + output_file, sio = self.report.create_file("media") # save the media file name in case we create unused media pages self.cur_fname = self.report.cur_fname result = self.write_header(self._('Media')) @@ -314,7 +316,8 @@ class MediaPages(BasePage): # send page out for processing # and close the file self.report.cur_fname = self.cur_fname - self.xhtml_writer(medialistpage, output_file, sio, ldatec) + if self.create_images_index: + self.xhtml_writer(medialistpage, output_file, sio, ldatec) def media_ref_link(self, handle, name, uplink=False): """ @@ -577,7 +580,7 @@ class MediaPages(BasePage): table += trow # get media notes - notelist = self.display_note_list(media.get_note_list()) + notelist = self.display_note_list(media.get_note_list(), Media) if notelist is not None: mediadetail += notelist @@ -649,7 +652,9 @@ class MediaPages(BasePage): try: mtime = os.stat(fullpath).st_mtime if self.report.archive: - self.report.archive.add(fullpath, str(newpath)) + if str(newpath) not in self.report.archive.getnames(): + # The current file not already archived. + self.report.archive.add(fullpath, str(newpath)) else: to_dir = os.path.join(self.html_dir, to_dir) if not os.path.isdir(to_dir): diff --git a/gramps/plugins/webreport/narrativeweb.py b/gramps/plugins/webreport/narrativeweb.py index 82bb4347a..5d4ca9e29 100644 --- a/gramps/plugins/webreport/narrativeweb.py +++ b/gramps/plugins/webreport/narrativeweb.py @@ -97,6 +97,7 @@ from gramps.plugins.webreport.surnamelist import SurnameListPage from gramps.plugins.webreport.surname import SurnamePage from gramps.plugins.webreport.thumbnail import ThumbnailPreviewPage from gramps.plugins.webreport.statistics import StatisticsPage +from gramps.plugins.webreport.updates import UpdatesPage from gramps.plugins.webreport.home import HomePage from gramps.plugins.webreport.contact import ContactPage from gramps.plugins.webreport.download import DownloadPage @@ -163,6 +164,8 @@ class NavWebReport(Report): self.inc_gallery = self.options['gallery'] self.inc_unused_gallery = self.options['unused'] self.create_thumbs_only = self.options['create_thumbs_only'] + self.create_thumbs_index = self.options['create_thumbs_index'] + self.create_images_index = self.options['create_images_index'] self.opts = self.options self.inc_contact = self.opts['contactnote'] or self.opts['contactimg'] @@ -202,6 +205,7 @@ class NavWebReport(Report): self.use_home = self.options['homenote'] or self.options['homeimg'] self.use_contact = self.opts['contactnote'] or self.opts['contactimg'] self.inc_stats = self.opts['inc_stats'] + self.inc_updates = self.opts['updates'] self.create_unused_media = self.opts['unused'] # Do we need to include this in a cms ? @@ -218,6 +222,9 @@ class NavWebReport(Report): self.usecal = self.options['usecal'] self.target_cal_uri = self.options['caluri'] + # Do we need to include news and updates page ? + self.inc_updates = self.options['updates'] + # either include the gender graphics or not? self.ancestortree = self.options['ancestortree'] @@ -400,6 +407,31 @@ class NavWebReport(Report): self._build_obj_dict() + ################################################# + # + # Add images for home, contact and introduction pages + # if they are not associated to any used objects. + # + ################################################# + if self.use_home: + img = self.options['homeimg'] + if img: + media = self._db.get_media_from_gramps_id(img) + if media: + self._add_media(media.handle, Media, media.handle) + if self.inc_contact: + img = self.options['contactimg'] + if img: + media = self._db.get_media_from_gramps_id(img) + if media: + self._add_media(media.handle, Media, media.handle) + if self.use_intro: + img = self.options['introimg'] + if img: + media = self._db.get_media_from_gramps_id(img) + if media: + self._add_media(media.handle, Media, media.handle) + ################################################# # # Pass 2 Generate the web pages @@ -451,6 +483,10 @@ class NavWebReport(Report): if self.inc_stats: self.statistics_preview_page(self.title) + # build classes Updates + if self.inc_updates: + self.updates_preview_page(self.title) + # copy all of the neccessary files self.copy_narrated_files() @@ -1193,6 +1229,15 @@ class NavWebReport(Report): 1) as step: StatisticsPage(self, title, step) + def updates_preview_page(self, title): + """ + creates the statistics preview page + """ + with self.user.progress(_("Narrated Web Site Report"), + _("Creating updates page..."), + 1): + UpdatesPage(self, title) + def addressbook_pages(self, ind_list): """ Create a webpage with a list of address availability for each person @@ -1241,7 +1286,7 @@ class NavWebReport(Report): def base_pages(self): """ - creates HomePage, ContactPage, DownloadPage, and IntroductionPage + creates HomePage, ContactPage, DownloadPage and IntroductionPage if requested by options in plugin """ if self.use_home: @@ -1454,15 +1499,17 @@ class NavWebReport(Report): when we use rsync. """ if self.archive: - output_file.flush() - tarinfo = tarfile.TarInfo(self.cur_fname) - tarinfo.size = len(string_io.getvalue()) - tarinfo.mtime = date if date != 0 else time.time() - if not win(): - tarinfo.uid = os.getuid() - tarinfo.gid = os.getgid() - string_io.seek(0) - self.archive.addfile(tarinfo, string_io) + if self.cur_fname not in self.archive.getnames(): + # The current file not already archived. + output_file.flush() + tarinfo = tarfile.TarInfo(self.cur_fname) + tarinfo.size = len(string_io.getvalue()) + tarinfo.mtime = date if date != 0 else time.time() + if not win(): + tarinfo.uid = os.getuid() + tarinfo.gid = os.getgid() + string_io.seek(0) + self.archive.addfile(tarinfo, string_io) output_file.close() else: output_file.close() @@ -1513,7 +1560,9 @@ class NavWebReport(Report): return tarinfo dest = os.path.join(to_dir, to_fname) - self.archive.add(from_fname, dest, filter=set_mtime) + if dest not in self.archive.getnames(): + # The current file not already archived. + self.archive.add(from_fname, dest, filter=set_mtime) else: dest = os.path.join(self.html_dir, to_dir, to_fname) @@ -1577,13 +1626,15 @@ class NavWebOptions(MenuReportOptions): self.__usecal = None self.__calendar_uri = None self.__create_thumbs_only = None + self.__create_images_index = None + self.__create_thumbs_index = None self.__mapservice = None - self.__maxinitialimageheight = None self.__maxinitialimagewidth = None self.__citationreferents = None self.__incdownload = None self.__placemappages = None self.__familymappages = None + self.__stamenopts = None self.__googleopts = None self.__googlemapkey = None self.__ancestortree = None @@ -1592,6 +1643,9 @@ class NavWebOptions(MenuReportOptions): self.__dl_descr2 = None self.__down_fname2 = None self.__gallery = None + self.__updates = None + self.__maxdays = None + self.__maxupdates = None self.__unused = None self.__down_fname1 = None self.__navigation = None @@ -1885,6 +1939,14 @@ class NavWebOptions(MenuReportOptions): addopt("gallery", self.__gallery) self.__gallery.connect('value-changed', self.__gallery_changed) + self.__create_images_index = BooleanOption( + _("Create the images index"), False) + self.__create_images_index.set_help( + _("This option allows you to create the images index")) + addopt("create_images_index", self.__create_images_index) + self.__create_images_index.connect("value-changed", + self.__gallery_changed) + self.__unused = BooleanOption( _("Include unused images and media objects"), True) self.__unused.set_help(_('Whether to include unused or unreferenced' @@ -1902,6 +1964,14 @@ class NavWebOptions(MenuReportOptions): self.__create_thumbs_only.connect("value-changed", self.__gallery_changed) + self.__create_thumbs_index = BooleanOption( + _("Create the thumbnail index"), False) + self.__create_thumbs_index.set_help( + _("This option allows you to create the thumbnail index")) + addopt("create_thumbs_index", self.__create_thumbs_index) + self.__create_thumbs_index.connect("value-changed", + self.__gallery_changed) + self.__maxinitialimagewidth = NumberOption( _("Max width of initial image"), _DEFAULT_MAX_IMG_WIDTH, 0, 2000) self.__maxinitialimagewidth.set_help( @@ -1909,13 +1979,6 @@ class NavWebOptions(MenuReportOptions): "of the image shown on the media page. Set to 0 for no limit.")) addopt("maxinitialimagewidth", self.__maxinitialimagewidth) - self.__maxinitialimageheight = NumberOption( - _("Max height of initial image"), _DEFAULT_MAX_IMG_HEIGHT, 0, 2000) - self.__maxinitialimageheight.set_help( - _("This allows you to set the maximum height " - "of the image shown on the media page. Set to 0 for no limit.")) - addopt("maxinitialimageheight", self.__maxinitialimageheight) - self.__gallery_changed() def __add_download_options(self, menu): @@ -2164,6 +2227,37 @@ class NavWebOptions(MenuReportOptions): addopt("caluri", self.__calendar_uri) self.__calendar_uri_changed() + self.__graph_changed() + + self.__updates = BooleanOption(_("Include the news and updates page"), + True) + self.__updates.set_help(_('Whether to include ' + 'a page with the last updates')) + self.__updates.connect('value-changed', self.__updates_changed) + addopt("updates", self.__updates) + + self.__maxdays = NumberOption(_("Max days for updates"), 1, 1, 300) + self.__maxdays.set_help(_("You want to see the last updates on how" + " many days ?")) + addopt("maxdays", self.__maxdays) + + self.__maxupdates = NumberOption(_("Max number of updates per object" + " to show"), 1, 1, 100) + self.__maxupdates.set_help(_("How many updates do you want to see max" + )) + addopt("maxupdates", self.__maxupdates) + + def __updates_changed(self): + """ + Update the change of storage: archive or directory + """ + _updates_option = self.__updates.get_value() + if _updates_option: + self.__maxupdates.set_available(True) + self.__maxdays.set_available(True) + else: + self.__maxupdates.set_available(False) + self.__maxdays.set_available(False) def __cms_uri_changed(self): """ @@ -2257,23 +2351,25 @@ class NavWebOptions(MenuReportOptions): if _gallery_option: self.__create_thumbs_only.set_available(True) self.__maxinitialimagewidth.set_available(True) - self.__maxinitialimageheight.set_available(True) + self.__create_images_index.set_available(True) + self.__create_thumbs_index.set_available(True) + self.__unused.set_available(True) # thumbnail-sized images only... if _create_thumbs_only_option: self.__maxinitialimagewidth.set_available(False) - self.__maxinitialimageheight.set_available(False) # full- sized images and Media Pages will be created... else: self.__maxinitialimagewidth.set_available(True) - self.__maxinitialimageheight.set_available(True) # no images or media objects are to be used... else: self.__create_thumbs_only.set_available(False) self.__maxinitialimagewidth.set_available(False) - self.__maxinitialimageheight.set_available(False) + self.__create_images_index.set_available(False) + self.__create_thumbs_index.set_available(False) + self.__unused.set_available(False) def __download_changed(self): """ diff --git a/gramps/plugins/webreport/person.py b/gramps/plugins/webreport/person.py index 6c43b818f..c4b0169fb 100644 --- a/gramps/plugins/webreport/person.py +++ b/gramps/plugins/webreport/person.py @@ -52,7 +52,7 @@ import logging #------------------------------------------------ from gramps.gen.const import GRAMPS_LOCALE as glocale from gramps.gen.lib import (ChildRefType, Date, Name, Person, EventRoleType, - Event, EventType) + Family, Event, EventType) from gramps.gen.lib.date import Today from gramps.gen.plug.report import Bibliography from gramps.gen.plug.report import utils @@ -469,18 +469,7 @@ class PersonPages(BasePage): output_file, sio = self.report.create_file(person.get_handle(), "ppl") self.uplink = True result = self.write_header(self.sort_name) - indivdetpage, head, dummy_body, outerwrapper = result - - # attach the ancestortree style sheet if ancestor - # graph is being created? - if self.report.options["ancestortree"]: - if self.usecms: - fname = "/".join([self.target_uri, "css", "ancestortree.css"]) - else: - fname = "/".join(["css", "ancestortree.css"]) - url = self.report.build_url_fname(fname, None, self.uplink) - head += Html("link", href=url, type="text/css", media="screen", - rel="stylesheet") + indivdetpage, dummy_head, dummy_body, outerwrapper = result # begin individualdetail division with Html("div", class_="content", @@ -496,7 +485,7 @@ class PersonPages(BasePage): if self.report.options['notes']: # display Narrative Notes notelist = person.get_note_list() - sect8 = self.display_note_list(notelist) + sect8 = self.display_note_list(notelist, Person) if sect8 is not None: individualdetail += sect8 @@ -564,7 +553,7 @@ class PersonPages(BasePage): if not self.report.options['notes']: # display Narrative Notes notelist = person.get_note_list() - sect8 = self.display_note_list(notelist) + sect8 = self.display_note_list(notelist, Person) if sect8 is not None: individualdetail += sect8 @@ -652,7 +641,7 @@ class PersonPages(BasePage): else: tracelife += """ [%f, %f, \'%s\', %s],""" % (float(longitude), float(latitude), - placetitle.replace("'", "\\'"), links) + placetitle.replace("'", "\\'"), links) return tracelife def __create_family_map(self, person, place_lat_long): @@ -769,9 +758,9 @@ class PersonPages(BasePage): seq_ = 0 old_place_title = "" - oldevent = None links = "" ln_str = "%s" + ppl_lnk = "" for index in range(0, number_markers): (latitude, longitude, placetitle, handle, event) = place_lat_long[index] @@ -783,19 +772,29 @@ class PersonPages(BasePage): if bkref_list: for ref in bkref_list: (bkref_class, bkref_hdle, role) = ref - if role == "Primary": + if bkref_class == Family and role == "Primary": + url = url_fct(bkref_hdle, + "fam", self.uplink) + fam_fct = self.r_db.get_family_from_handle + fam = fam_fct(bkref_hdle) + fam_name = self.report.get_family_name(fam) + ppl_lnk = ln_str % (url, + fam.get_gramps_id(), + fam_name) + if bkref_class == Person and role == "Primary": url = url_fct(bkref_hdle, "ppl", self.uplink) ppl_fct = self.r_db.get_person_from_handle - person = ppl_fct(bkref_hdle) + pers = ppl_fct(bkref_hdle) ppl_lnk = ln_str % (url, - person.get_gramps_id(), - self.get_name(person)) + pers.get_gramps_id(), + self.get_name(pers)) url = self.report.build_url_fname_html(event.get_handle(), "evt", self.uplink) evt_type = self._(str(event.get_type())) evt_date = self.rlocale.get_date(event.get_date_object()) evt_lnk = ln_str % (url, evt_date, evt_type) + evt_lnk += " (" + evt_date + ")" links += ' + "
%s"' % (ppl_lnk + self._(":") + evt_lnk) if index == number_markers - 1: @@ -808,8 +807,8 @@ class PersonPages(BasePage): break continue elif old_place_title != "" and index != 0: - (lat, lng, plcetitle, handle_, - event_) = place_lat_long[index-1] + (lat, lng, plcetitle, dummy_handle, + dummy_event) = place_lat_long[index-1] tracelife = self._create_family_tracelife(tracelife, plcetitle, lat, @@ -824,24 +823,33 @@ class PersonPages(BasePage): if bkref_list: for ref in bkref_list: (bkref_class, bkref_hdle, role) = ref - if role == "Primary": + if bkref_class == Family and role == "Primary": + url = url_fct(bkref_hdle, + "fam", self.uplink) + fam_fct = self.r_db.get_family_from_handle + fam = fam_fct(bkref_hdle) + fam_name = self.report.get_family_name(fam) + ppl_lnk = ln_str % (url, + fam.get_gramps_id(), + fam_name) + if bkref_class == Person and role == "Primary": url = url_fct(bkref_hdle, "ppl", self.uplink) ppl_fct = self.r_db.get_person_from_handle - person = ppl_fct(bkref_hdle) + pers = ppl_fct(bkref_hdle) ppl_lnk = ln_str % (url, - person.get_gramps_id(), - self.get_name(person)) + pers.get_gramps_id(), + self.get_name(pers)) url = self.report.build_url_fname_html(event.handle, "evt", self.uplink) evt_type = self._(str(event.get_type())) - evt_date = self.rlocale.get_date(event.get_date_object()) - evt_lnk = ln_str % (url, evt_date, evt_type) + date = self.rlocale.get_date(event.get_date_object()) + evt_lnk = ln_str % (url, date, evt_type) + evt_lnk += " (" + date + ")" - links = '"
%s"' % (ppl_lnk + self._(":") + - evt_lnk) - elif index == number_markers: + links = '"
%s"' % (ppl_lnk + self._(":") + evt_lnk) + elif index == number_markers-1: tracelife = self._create_family_tracelife(tracelife, placetitle, latitude, @@ -855,23 +863,45 @@ class PersonPages(BasePage): if bkref_list: for ref in bkref_list: (bkref_class, bkref_hdle, role) = ref - if role == "Primary": + if bkref_class == Family and role == "Primary": + url = url_fct(bkref_hdle, + "fam", self.uplink) + fam_fct = self.r_db.get_family_from_handle + fam = fam_fct(bkref_hdle) + fam_name = self.report.get_family_name(fam) + ppl_lnk = ln_str % (url, + fam.get_gramps_id(), + fam_name) + if bkref_class == Person and role == "Primary": url = url_fct(bkref_hdle, "ppl", self.uplink) ppl_fct = self.r_db.get_person_from_handle - person = ppl_fct(bkref_hdle) + pers = ppl_fct(bkref_hdle) ppl_lnk = ln_str % (url, - person.get_gramps_id(), - self.get_name(person)) + pers.get_gramps_id(), + self.get_name(pers)) url = self.report.build_url_fname_html(event.handle, "evt", self.uplink) evt_type = self._(str(event.get_type())) + date = self.rlocale.get_date(event.get_date_object()) evt_lnk = ln_str % (url, evt_type, evt_type) - links = '"

%s"' % (ppl_lnk + self._(":") + evt_lnk) + evt_lnk += " (" + date + ")" + if "

" in links: + links += '"
%s"' % (ppl_lnk+self._(":") + evt_lnk) + else: + links = '"

%s"' % (ppl_lnk + self._(":") + evt_lnk) old_place_title = placetitle seq_ += 1 + (lat, lng, plcetitle, dummy_handle, + dummy_event) = place_lat_long[number_markers-1] + tracelife = self._create_family_tracelife(tracelife, + plcetitle, + lat, + lng, + seq_, + links) tracelife += "];" # begin MapDetail division... with Html("div", class_="content", id="FamilyMapDetail") as mapdetail: @@ -899,82 +929,6 @@ class PersonPages(BasePage): with Html("div", id="map_canvas") as canvas: mapdetail += canvas - # begin javascript inline code... - with Html("script", deter="deter", - style='width =100%; height =100%;', - type="text/javascript", indent=False) as jsc: - head += jsc - - # Link to Gramps marker - fname = "/".join(['images', 'marker.png']) - marker_path = self.report.build_url_image("marker.png", - "images", - self.uplink) - - jsc += MARKER_PATH % marker_path - # are we using Google? - if self.mapservice == "Google": - - # are we creating Family Links? - if self.googleopts == "FamilyLinks": - if midy_ is None: - jsc += FAMILYLINKS % (tracelife, latitude, - longitude, int(10)) - else: - jsc += FAMILYLINKS % (tracelife, midx_, midy_, - zoomlevel) - - # are we creating Drop Markers? - elif self.googleopts == "Drop": - if midy_ is None: - jsc += DROPMASTERS % (tracelife, latitude, - longitude, int(10)) - else: - jsc += DROPMASTERS % (tracelife, midx_, midy_, - zoomlevel) - - # we are creating Markers only... - else: - if midy_ is None: - jsc += MARKERS % (tracelife, latitude, - longitude, int(10)) - else: - jsc += MARKERS % (tracelife, midx_, midy_, - zoomlevel) - - # we are using OpenStreetMap - elif self.mapservice == "OpenStreetMap": - if midy_ is None: - jsc += OSM_MARKERS % (tracelife, - longitude, - latitude, 10) - else: - jsc += OSM_MARKERS % (tracelife, midy_, midx_, - zoomlevel) - jsc += OPENLAYER - # we are using StamenMap - elif self.mapservice == "StamenMap": - if midy_ is None: - jsc += STAMEN_MARKERS % (tracelife, - self.stamenopts, - longitude, - latitude, - 10, - ) - else: - jsc += STAMEN_MARKERS % (tracelife, - self.stamenopts, - midy_, midx_, - zoomlevel, - ) - jsc += OPENLAYER - - # if Google and Drop Markers are selected, - # then add "Drop Markers" button? - if self.mapservice == "Google" and self.googleopts == "Drop": - mapdetail += Html("button", _("Drop Markers"), - id="drop", onclick="drop()", inline=True) - # add div for popups. if self.mapservice == "Google": with Html("div", id="popup", inline=True) as popup: @@ -1020,7 +974,7 @@ class PersonPages(BasePage): # being sorted by date place_lat_long = sorted(place_lat_long, key=lambda evt: - evt[4].get_date_object()) + evt[4].get_date_object()) for (latitude, longitude, placetitle, handle, event) in place_lat_long: trow = Html("tr") @@ -1038,8 +992,84 @@ class PersonPages(BasePage): ] ) + # begin javascript inline code... + with Html("script", deter="deter", + style='width =100%; height =100%;', + type="text/javascript", indent=False) as jsc: + mapdetail += jsc + + # Link to Gramps marker + fname = "/".join(['images', 'marker.png']) + marker_path = self.report.build_url_image("marker.png", + "images", + self.uplink) + + jsc += MARKER_PATH % marker_path + # are we using Google? + if self.mapservice == "Google": + + # are we creating Family Links? + if self.googleopts == "FamilyLinks": + if midy_ is None: + jsc += FAMILYLINKS % (tracelife, latitude, + longitude, int(10)) + else: + jsc += FAMILYLINKS % (tracelife, midx_, midy_, + zoomlevel) + + # are we creating Drop Markers? + elif self.googleopts == "Drop": + if midy_ is None: + jsc += DROPMASTERS % (tracelife, latitude, + longitude, int(10)) + else: + jsc += DROPMASTERS % (tracelife, midx_, midy_, + zoomlevel) + + # we are creating Markers only... + else: + if midy_ is None: + jsc += MARKERS % (tracelife, latitude, + longitude, int(10)) + else: + jsc += MARKERS % (tracelife, midx_, midy_, + zoomlevel) + + # we are using OpenStreetMap + elif self.mapservice == "OpenStreetMap": + if midy_ is None: + jsc += OSM_MARKERS % (tracelife, + longitude, + latitude, 10) + else: + jsc += OSM_MARKERS % (tracelife, midy_, midx_, + zoomlevel) + jsc += OPENLAYER + # we are using StamenMap + elif self.mapservice == "StamenMap": + if midy_ is None: + jsc += STAMEN_MARKERS % (tracelife, + self.stamenopts, + longitude, + latitude, + 10, + ) + else: + jsc += STAMEN_MARKERS % (tracelife, + self.stamenopts, + midy_, midx_, + zoomlevel, + ) + jsc += OPENLAYER + + # if Google and Drop Markers are selected, + # then add "Drop Markers" button? + if self.mapservice == "Google" and self.googleopts == "Drop": + mapdetail += Html("button", _("Drop Markers"), + id="drop", onclick="drop()", inline=True) + # add body id for this page... - body.attr = 'id ="FamilyMap" onload ="initialize()"' + body.attr = 'id ="FamilyMap"' # add clearline for proper styling # add footer section @@ -1392,7 +1422,7 @@ class PersonPages(BasePage): for data in [ person_lnk, person_ref.get_relation(), - self.dump_notes(person_ref.get_note_list()), + self.dump_notes(person_ref.get_note_list(), Person), self.get_citation_links( person_ref.get_citation_list()), ]: diff --git a/gramps/plugins/webreport/place.py b/gramps/plugins/webreport/place.py index 1a4b726c6..b973970fd 100644 --- a/gramps/plugins/webreport/place.py +++ b/gramps/plugins/webreport/place.py @@ -101,6 +101,7 @@ class PlacePages(BasePage): self.person = None self.familymappages = None self.googlemapkey = None + self.stamenopts = None # Place needs to display coordinates? self.display_coordinates = report.options["coordinates"] @@ -301,7 +302,8 @@ class PlacePages(BasePage): output_file, sio = self.report.create_file(place_handle, "plc") self.uplink = True self.page_title = place_name - placepage, head, body, outerwrapper = self.write_header(_("Places")) + (placepage, head, dummy_body, + outerwrapper) = self.write_header(_("Places")) self.placemappages = self.report.options['placemappages'] self.mapservice = self.report.options['mapservice'] @@ -341,7 +343,7 @@ class PlacePages(BasePage): placedetail += placegallery # place notes - notelist = self.display_note_list(place.get_note_list()) + notelist = self.display_note_list(place.get_note_list(), Place) if notelist is not None: placedetail += notelist @@ -358,9 +360,6 @@ class PlacePages(BasePage): if self.placemappages: if place and (place.lat and place.long): - latitude, longitude = conv_lat_lon(place.get_latitude(), - place.get_longitude(), - "D.D8") placetitle = place_name # add narrative-maps CSS... @@ -406,49 +405,21 @@ class PlacePages(BasePage): with Html("div", id="map_canvas", inline=True) as canvas: placedetail += canvas - # Begin inline javascript code because jsc is a - # docstring, it does NOT have to be properly indented - if self.mapservice == "Google": - with Html("script", type="text/javascript", - indent=False) as jsc: - head += jsc - - # Google adds Latitude/ Longitude to its maps... - plce = placetitle.replace("'", "\\'") - jsc += MARKER_PATH % marker_path - jsc += MARKERS % ([[plce, - latitude, - longitude, - 1,""]], - latitude, longitude, - 10) - - elif self.mapservice == "OpenStreetMap": - with Html("script", type="text/javascript") as jsc: - canvas += jsc - jsc += MARKER_PATH % marker_path - jsc += OSM_MARKERS % ([[float(longitude), - float(latitude), - placetitle,""]], - longitude, latitude, 10) - jsc += OPENLAYER - else: # STAMEN - with Html("script", type="text/javascript") as jsc: - canvas += jsc - jsc += MARKER_PATH % marker_path - jsc += STAMEN_MARKERS % ([[float(longitude), - float(latitude), - placetitle,""]], - self.stamenopts, - longitude, latitude, 10) - jsc += OPENLAYER - - # add javascript function call to body element - body.attr += ' onload = "initialize();" ' - # add div for popups. - with Html("div", id="popup", inline=True) as popup: - placedetail += popup + if self.mapservice == "Google": + with Html("div", id="popup", inline=True) as popup: + placedetail += popup + else: + with Html("div", id="popup", class_="ol-popup", + inline=True) as popup: + placedetail += popup + popup += Html("a", href="#", id="popup-closer", + class_="ol-popup-closer") + popup += Html("div", id="popup-content") + with Html("div", id="tooltip", class_="ol-popup", + inline=True) as tooltip: + placedetail += tooltip + tooltip += Html("div", id="tooltip-content") # source references srcrefs = self.display_ind_sources(place) @@ -460,6 +431,48 @@ class PlacePages(BasePage): if ref_list is not None: placedetail += ref_list + # Begin inline javascript code because jsc is a + # docstring, it does NOT have to be properly indented + if self.placemappages: + if place and (place.lat and place.long): + latitude, longitude = conv_lat_lon(place.get_latitude(), + place.get_longitude(), + "D.D8") + scripts = Html() + if self.mapservice == "Google": + with Html("script", type="text/javascript", + indent=False) as jsc: + scripts += jsc + # Google adds Latitude/ Longitude to its maps... + plce = placetitle.replace("'", "\\'") + jsc += MARKER_PATH % marker_path + jsc += MARKERS % ([[plce, + latitude, + longitude, + 1, ""]], + latitude, longitude, + 10) + elif self.mapservice == "OpenStreetMap": + with Html("script", type="text/javascript") as jsc: + scripts += jsc + jsc += MARKER_PATH % marker_path + jsc += OSM_MARKERS % ([[float(longitude), + float(latitude), + placetitle, ""]], + longitude, latitude, 10) + jsc += OPENLAYER + else: # STAMEN + with Html("script", type="text/javascript") as jsc: + scripts += jsc + jsc += MARKER_PATH % marker_path + jsc += STAMEN_MARKERS % ([[float(longitude), + float(latitude), + placetitle, ""]], + self.stamenopts, + longitude, latitude, 10) + jsc += OPENLAYER + placedetail += scripts + # add clearline for proper styling # add footer section footer = self.write_footer(ldatec) diff --git a/gramps/plugins/webreport/repository.py b/gramps/plugins/webreport/repository.py index 79a194ee7..7d2683530 100644 --- a/gramps/plugins/webreport/repository.py +++ b/gramps/plugins/webreport/repository.py @@ -271,7 +271,7 @@ class RepositoryPages(BasePage): repositorydetail += urllist # reposity: notelist - notelist = self.display_note_list(repo.get_note_list()) + notelist = self.display_note_list(repo.get_note_list(), Repository) if notelist is not None: repositorydetail += notelist diff --git a/gramps/plugins/webreport/source.py b/gramps/plugins/webreport/source.py index 13f5d504d..5b6390da8 100644 --- a/gramps/plugins/webreport/source.py +++ b/gramps/plugins/webreport/source.py @@ -273,7 +273,7 @@ class SourcePages(BasePage): tbody += trow # Source notes - notelist = self.display_note_list(source.get_note_list()) + notelist = self.display_note_list(source.get_note_list(), Source) if notelist is not None: sourcedetail += notelist diff --git a/gramps/plugins/webreport/thumbnail.py b/gramps/plugins/webreport/thumbnail.py index 5b5e11e00..f06f12651 100644 --- a/gramps/plugins/webreport/thumbnail.py +++ b/gramps/plugins/webreport/thumbnail.py @@ -76,6 +76,7 @@ class ThumbnailPreviewPage(BasePage): """ BasePage.__init__(self, report, title) self.create_thumbs_only = report.options['create_thumbs_only'] + self.create_thumbs_index = self.report.options['create_thumbs_index'] # bug 8950 : it seems it's better to sort on desc + gid. def sort_by_desc_and_gid(obj): """ @@ -108,7 +109,8 @@ class ThumbnailPreviewPage(BasePage): media_list.sort(key=lambda x: self.rlocale.sort_key(x[0])) # Create thumbnail preview page... - output_file, sio = self.report.create_file("thumbnails") + if self.create_thumbs_index: + output_file, sio = self.report.create_file("thumbnails") result = self.write_header(self._("Thumbnails")) thumbnailpage, dummy_head, body, outerwrapper = result @@ -197,7 +199,8 @@ class ThumbnailPreviewPage(BasePage): # send page out for processing # and close the file - self.xhtml_writer(thumbnailpage, output_file, sio, 0) + if self.create_thumbs_index: + self.xhtml_writer(thumbnailpage, output_file, sio, 0) def thumbnail_link(self, name, index): diff --git a/gramps/plugins/webreport/updates.py b/gramps/plugins/webreport/updates.py new file mode 100644 index 000000000..8989d49b1 --- /dev/null +++ b/gramps/plugins/webreport/updates.py @@ -0,0 +1,241 @@ +# -*- coding: utf-8 -*- +#!/usr/bin/env python +# +# Gramps - a GTK+/GNOME based genealogy program +# +# Copyright (C) 2000-2007 Donald N. Allingham +# Copyright (C) 2019- Serge Noiraud +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +# + +""" +Narrative Web Page generator. + +Classe: + UpdatesPage +""" +#------------------------------------------------ +# python modules +#------------------------------------------------ +from decimal import getcontext +import logging +from time import (strftime, time, localtime) + +#------------------------------------------------ +# Gramps module +#------------------------------------------------ +from gramps.gen.const import GRAMPS_LOCALE as glocale +from gramps.plugins.lib.libhtml import Html + +#------------------------------------------------ +# specific narrative web import +#------------------------------------------------ +from gramps.plugins.webreport.basepage import BasePage +from gramps.gen.display.place import displayer as _pd +from gramps.plugins.webreport.common import (FULLCLEAR, _EVENTMAP) +from gramps.gen.lib import (Person, Family, Event, Place, Source, Repository, + Media) +from gramps.gen.lib.date import Date + +_ = glocale.translation.sgettext +LOG = logging.getLogger(".NarrativeWeb") +getcontext().prec = 8 + +class UpdatesPage(BasePage): + """ + This class is responsible for displaying information about the Home page. + """ + def __init__(self, report, title): + """ + @param: report -- The instance of the main report class for + this report + @param: title -- Is the title of the web page + """ + BasePage.__init__(self, report, title) + ldatec = 0 + + output_file, sio = self.report.create_file("updates") + result = self.write_header(self._('New and updated objects')) + homepage, dummy_head, dummy_body, outerwrapper = result + self.days = self.report.options['maxdays'] + self.nbr = self.report.options['maxupdates'] + cur_time = int(time()) + self.maxdays = cur_time - (86400 * self.days) + + # begin updates division + with Html("div", class_="content", id="Updates") as section: + outerwrapper += section + description = ("This page contains the last updated objects in the" + " database in the last %(days)d days and for a " + "maximum of %(nb)d objects per object type." % { + 'days' : self.days, + 'nb' : self.nbr + } + ) + section += Html("p", description) + + header = self._("People") + section += Html("h4", header) + people = self.list_people_changed(Person) + if people is not None: + section += people + + if self.report.options['inc_families']: + header = self._("Families") + section += Html("h4", header) + families = self.list_people_changed(Family) + if families is not None: + section += families + + if self.report.options['inc_events']: + header = self._("Events") + section += Html("h4", header) + events = self.list_people_changed(Event) + if events is not None: + section += events + + if self.report.options['inc_places']: + header = self._("Places") + section += Html("h4", header) + places = self.list_people_changed(Place) + if places is not None: + section += places + + if self.report.options['inc_sources']: + header = self._("Sources") + section += Html("h4", header) + sources = self.list_people_changed(Source) + if sources is not None: + section += sources + + if self.report.options['inc_repository']: + header = self._("Repositories") + section += Html("h4", header) + repos = self.list_people_changed(Repository) + if repos is not None: + section += repos + + if (self.report.options['gallery'] and not + self.report.options['create_thumbs_only']): + header = self._("Media") + section += Html("h4", header) + media = self.list_people_changed(Media) + if media is not None: + section += media + + # create clear line for proper styling + # create footer section + footer = self.write_footer(ldatec) + outerwrapper += (FULLCLEAR, footer) + + # send page out for processing + # and close the file + self.xhtml_writer(homepage, output_file, sio, ldatec) + + def list_people_changed(self, object_type): + """ + List all records with last change date + """ + nb_items = 0 + + def sort_on_change(handle): + """ sort records based on the last change time """ + obj = fct(handle) + timestamp = obj.get_change_time() + return timestamp + + if object_type == Person: + fct = self.report.database.get_person_from_handle + fct_link = self.new_person_link + elif object_type == Family: + fct = self.report.database.get_family_from_handle + fct_link = self.family_link + elif object_type == Event: + fct = self.report.database.get_event_from_handle + elif object_type == Place: + fct = self.report.database.get_place_from_handle + fct_link = self.place_link + elif object_type == Source: + fct = self.report.database.get_place_from_handle + fct_link = self.source_link + elif object_type == Repository: + fct = self.report.database.get_place_from_handle + fct_link = self.repository_link + elif object_type == Media: + fct = self.report.database.get_place_from_handle + obj_list = sorted(self.report.obj_dict[object_type], + key=sort_on_change, reverse=True) + with Html("table", class_="list", id="list") as section: + for handle in obj_list: + row = Html("tr") + section += row + date = obj = None + name = "" + obj = fct(handle) + if object_type == Person: + name = fct_link(handle) + elif object_type == Family: + name = self.report.get_family_name(obj) + name = fct_link(handle, name) + elif object_type == Event: + otype = obj.get_type() + date = obj.get_date_object() + if int(otype) in _EVENTMAP: + handle_list = set( + self.report.database.find_backlink_handles( + handle, + include_classes=['Family', 'Person'])) + else: + handle_list = set( + self.report.database.find_backlink_handles( + handle, + include_classes=['Person'])) + if handle_list: + name = Html("span", self._(otype.xml_str())+" ") + for obj_t, r_handle in handle_list: + if obj_t == 'Person': + name += self.new_person_link(r_handle) + else: + srbd = self.report.database + fam = srbd.get_family_from_handle(r_handle) + srgfn = self.report.get_family_name + name += self.family_link(r_handle, srgfn(fam)) + elif object_type == Place: + name = _pd.display(self.report.database, obj) + name = fct_link(handle, name) + elif object_type == Source: + name = obj.get_title() + name = fct_link(handle, name) + elif object_type == Repository: + name = obj.get_name() + name = fct_link(handle, name) + elif object_type == Media: + name = obj.get_description() + url = self.report.build_url_fname_html(handle, "img") + name = Html("a", name, href=url, title=name) + if obj: + timestamp = obj.get_change_time() + if timestamp - self.maxdays > 0: + nb_items += 1 + if nb_items > self.nbr: + break + tims = localtime(timestamp) + odat = Date(tims.tm_year, tims.tm_mon, tims.tm_mday) + date = self.rlocale.date_displayer.display(odat) + date += strftime(' %X', tims) + row += Html("td", date, class_="date") + row += Html("td", name) + return section