On Sat, Sep 29, 2012 at 1:04 PM, Dave Fisher <dave2w...@comcast.net> wrote:
> Top Note: > > This has become an example of how to edit several parts of the website > including adding xslt. > > - XSLT. > - SSI - How html pages are transformed into AOO branded html pages. > - Top Navigation customized for an NL. > - Page Template Skeleton > - Branding - including Header and Footer construction. > > > On Sep 29, 2012, at 12:16 PM, Rob Weir wrote: > > > On Sat, Sep 29, 2012 at 2:40 PM, Dave Fisher <dave2w...@comcast.net> > wrote: > >> > >> On Sep 29, 2012, at 2:25 AM, Andrea Pescetti wrote: > >> > >>> Rob Weir wrote: > >>>> A technical solution could be to put the strings into their own XML > >>>> file, so different localized versions could be used. These would be > >>>> strings like column headers, the text of the disclaimer, etc. > >>> > >>> This would be perfect, and flexible enough. > >> > >> The CMS can be setup to build XML files from XSLT files with only some > slight efforts with perl. > >> > >> Here are eccn / exports from the lib/view.pm for www.apache.org: > >> > >> sub exports { > >> my %args = @_; > >> my $template = "content$args{path}"; > >> $args{breadcrumbs} = ASF::View::breadcrumbs($args{path}); > >> > >> my $page_path = $template; > >> $page_path =~ s/\.[^.]+$/.page/; > >> if (-d $page_path) { > >> for my $f (grep -f, glob "$page_path/*.mdtext") { > >> $f =~ m!/([^/]+)\.mdtext$! or die "Bad filename: $f\n"; > >> $args{$1} = {}; > >> read_text_file $f, $args{$1}; > >> } > >> $args{table} = `xsltproc $page_path/eccnmatrix.xsl > $page_path/eccnmatrix.xml`; > >> > >> } > >> > >> return Template($template)->render(\%args), html => \%args; > >> } > >> > >> and the lib/path.pm: > >> > >> [qr!^/licenses/exports/index\.html$!, exports => {} ], > >> > >> > >> Done properly we can drop the NL files in a consistent area. > Interesting... > >> > >> Ideally all that should be changed is the XML and then the site is > properly rebuilt. > >> > >> What will this xlstproc call look like if there are two XML files - one > for columns and the other for data? > >> > > > > I don't know xsltproc, but most XSLT engines have a way to pass in an > > XSLT parameter via the command line. So we'd pass in the locale id, > > e.g., "it" for Italian. Then within the XSLT we could use the > > document() call to load a string resource file whose name is based in > > part on the locale, for example, strings_<locale>.xml. Or > > <locale>/strings.xml, depending on whether you want these centralized > > or not. > > > > But one other assumption to check: can we pipeline the CMS processing > > steps together? In other words, if we generate a bare-bones XHTML > > from the XSLT transform. can we then feed that XHTML back into the CMS > > to apply the usual template for the header/footer, etc.? > > Sure that's very much what we already do with all of the existing html: > > (1) Strip out header, body tag and content. > > (2) Push the existing html through the CMS templating engine. > > I'll annotate the process because the ssi part if important to consider > here: > > sub html_page { > my %args = @_; > my %styleargs = @_; > my $file = "content$args{path}"; > my $template = $args{template}; > $args{breadcrumbs} = breadcrumbs($args{path}); > > (a) Get the html file contents > read_text_file $file, \%args; > > (b) Each page may have an attachments directory with mdtext special > content - read those. > my $page_path = $file; > $page_path =~ s/\.[^.]+$/.page/; > if (-d $page_path) { > for my $f (grep -f, glob "$page_path/*.mdtext") { > $f =~ m!/([^/]+)\.mdtext$! or die "Bad filename: $f\n"; > $args{$1} = {}; > read_text_file $f, $args{$1}; > } > } > > (c) Grab the folder or main ssi.mdtext defining special items like > translations. > my $ssi_header_file = ssiheaderfile($args{path}); > $args{ssi} = {}; > read_text_file $ssi_header_file, $args{ssi}; > > (d) Extract the head, bodytag and content from the html file contents > if ($args{content} =~ > m!<head.*?>(.*?)</head>(?:.*?<body(.*?)>)?(.*?)(?:</body>|\Z)!si) { > @args{qw/head bodytag content/} = ($1, $2, $3); > } > > (e) Create the breadcrumbs for the header > $args{breadcrumbs} =~ s/home/$args{ssi}{headers}{home}/; > > (f) Render through the templating engine with the collected arguments. > return Template($template)->render(\%args), html => \%args; > } > > (3) ssi.mdtext files are used to do folder specific ssi overrides into the > template: > > templates/ssi.mdtext > doctype: /doctype.html > brand: /brand.html > footer: /footer.html > topnav: /topnav.html > home: home > > templates/it/ssi.mdtext > doctype: /doctype.html > brand: /it/brand.html > footer: /footer.html > topnav: /it/topnav.html > home: home > > Adding a consultant tag to these files makes sense. > > (4) content/it/topnav.mdtext > > The place to put this new consultants link would be in these files. > > divid: topnava > > - [Prodotto][m0] > - [Download][m1] > - [Supporto][m2] > - [Estensioni][m3] > - [Modelli][m4] > - [Collabora][m5] > > > [m0]: /it/informazioni/prodotto/writer.html > "Descrizione di Apache OpenOffice" > [m1]: /it/download/ > "Scarica OpenOffice" > [m2]: /it/supporto/index.html > "Supporto per OpenOffice" > [m3]: http://extensions.openoffice.org > "Estensioni per OpenOffice: aggiungi nuove funzioni" > [m4]: http://templates.openoffice.org > "Modelli di documento per OpenOffice" > [m5]: /it/contribuire/index.html > "Aiuta il progetto OpenOffice" > > > (5) templates/skeleton.html > > FYI - the full page - note the ssi.headers variables come from the > selected ssi.mdtext. > > <!--#include virtual="{{ ssi.headers.doctype }}" --> > <html> > <head> > <link href="/css/ooo.css" rel="stylesheet" type="text/css"> > {% if head %}{{ head|safe }}{% else %} > <title>{% block title %}{{ headers.title }}{% endblock %}</title> > <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> > {% if headers.css %}<link href="{{ headers.css }}" rel="stylesheet" > type="text/css">{% endif %} > {% endif %} > <!--#include virtual="/google-analytics.js" --> > </head> > <body{% if bodytag %} {{ bodytag|safe }}{% endif %}> > <!--#include virtual="{{ ssi.headers.brand }}" --> > <div id="topbara"> > {% if ssi.headers.topnav %}<!--#include virtual="{{ ssi.headers.topnav > }}" -->{% endif %} > <div id="breadcrumbsa">{% block breaddcrumbs %}{{ breadcrumbs|safe > }}{% endblock %}</div> > </div> > <div id="clear"></div> > {% if ssi.headers.leftnav %}<!--#include virtual="{{ ssi.headers.leftnav > }}" -->{% endif %} > {% if ssi.headers.rightnav %}<!--#include virtual="{{ > ssi.headers.rightnav }}" -->{% endif %} > <div id="content"> > {% block legacy %}{% if ssi.headers.legacy %}<div class="legacy">{{ > ssi.headers.legacy }}</div>{% endif %}{% endblock %} > {% block title %}{% if headers.title %}<h1 class="title">{{ > headers.title }}</h1>{% endif %}{% endblock %} > {% block content %}{{ content|markdown }}{% endblock %} > </div> > <!--#include virtual="{{ ssi.headers.footer }}" --> > </body> > </html> > > (6) content/brand.mdtext > > You are certainly familiar with this parallel structure. > > home: home > search: search > name: Apache OpenOffice (incubating) > tagline: (incubating) | The Free and Open Productivity Suite > logo: AOO_logos/OOo_Website_v2_copy.png > domain: www.openoffice.org > divid: bannera > announce: Please help us collect and rate ideas for OpenOffice 4.0 > announceurl: https://www.google.com/moderator/#16/e=2011d5 > announcetip: Read the announcement > > (7) templates/brand.html > > This is really more about the site banner is more about refresh and > transition to TLP. > > <div id="{{ headers.divid }}"> > <div id="bannerleft"><a title="Apache OpenOffice (incubating)" > href="/"><img id="ooo-logo" alt="{{ headers.name }}" src="/images/{{ > headers.logo }}"/></a></div> > <div id="bannerright"> > <a title="Apache Incubator" href="http://incubator.apache.org"><img > id="asf-logo" alt="Apache Incubator" > src="/images/apache-incubator-logo.png"/></a> > <div style="relative; margin: 14px 0 0 0; height: 24px;"> > <form id="cse-search-box-header" action="http://www.google.com/search" > method="get"> > <div> > <input type="hidden" name="domains" value="{{ headers.domain }}"/> > <input type="hidden" name="sitesearch" value="{{ headers.domain > }}"/> > </div> > <div class="topsrchbox"> > <input name="resultsPerPage" value="40" type="hidden"/> > <input name="q" id="query" type="text"/> > <input name="Button" value="{{ headers.search }}" type="submit" > class="topsrchbutton"/> > </div> > </form> > </div> > </div> > {% block tagline %}{% if headers.tagline %}<div > id="bannercenter"><br/>{{ headers.tagline }}</div>{% endif %}{% endblock %} > </div> > {% block announce %}{% if headers.announce %}<div id="announce"><a > href="{{ headers.announceurl }}" title="{{ headers.announcetip }}">{{ > headers.announce }}</a></div>{% endif %}{% endblock %} > > (8) templates/footer.html > > Remove the disclaimer - other changes? > > <div id="{{ headers.divid }}"> > <div id="poweredbya"><p><img src="/images/feather-small.gif" > alt="Apache Feather"/></p></div> > <div id="copyrighta"> > <p style="text-align:center;"> > <a href="/license.html">Copyright & License</a> | <a > href="/privacy.html">Privacy</a> | <a href="/contact_us.html">Contact > Us</a> | <a href=" > http://www.apache.org/foundation/contributing.html#Paypal">Donate</a> > </p> > <p> > Apache and the Apache feather logos are trademarks of The Apache > Software Foundation. > OpenOffice.org and the seagull logo are registered trademarks of The > Apache Software Foundation. > Other names appearing on the site may be trademarks of their > respective owners. > </p> > <p> > Apache OpenOffice is an effort undergoing incubation at The Apache > Software Foundation (ASF), sponsored by the Apache Incubator. > Incubation is required of all newly accepted projects until a further > review indicates that the infrastructure, communications, and > decision making process have stabilized in a manner consistent with > other successful ASF projects. While incubation status is > not necessarily a reflection of the completeness or stability of the > code, it does indicate that the project has > yet to be fully endorsed by the ASF.</p> > </div> > </div> > > (9) Rebranding is easy to do and reverse. > > Regards, > Dave > > > > > > > -Rob > > > > > >> Regards, > >> Dave > >> > >>> > >>>> Another solution would be to have one master consultant listing, but > >>>> add a field to indicate the geographic scope of their business. ... > >>>> Pardon my ignorance here, but how do consultants tend to work in > >>>> Europe? Are they easily able to offer services through the EU? > >>> > >>> This option is probably not needed. Individual consultants will often > work within one country only, and those who offer services in multiple > countries can fill in multiple applications (and then we would have the > issue that geography and language do not map one-to-one, so this approach > couldn't be easily generalized). > >>> > >>> Regards, > >>> Andrea. > >> > > Ok, I found this... :) -- ---------------------------------------------------------------------------------------- MzK "Just 'cause you got the monkey off your back doesn't mean the circus has left town." -- George Carlin