Date: 2005-01-13T15:52:23
Editor: MarkLundquist
Wiki: Cocoon Wiki
Page: SimpleContentModel
URL: http://wiki.apache.org/cocoon/SimpleContentModel
more corrrect & complete!
Change Log:
------------------------------------------------------------------------------
@@ -14,21 +14,24 @@
= The Content Model =
-OK, then... we start with two top-level directories:
-
+OK, then... we start with this directory structure within the webapp directory:
{{{
webapp/
content/
static/
+ content/
}}}
{{{content}}} is the root of a directory structure that contains the XML
source documents.
+
{{{static/}}} contains:
* static resources common to all or most pages, such as
* layout artwork, e.g. logos
* site-wide CSS stylesheet
* common external javascripts
- * symbolic links into the {{{content/}}} directory structure (see below!)
+ * etc...
+ And...
+ * An automatically-generated {{{content/}}} subdirectory containing symbolic
links into the {{{webapp/content/}}} directory structure (see below!)
{{{static/}}} does '''not''' contain any page-specific resources (see below!)
@@ -80,21 +83,21 @@
bowser_chasing_tail.swf
}}}
-We then create the following directory structure and soft link in
{{{webapp/static}}}:
+We then create a directory structure and a soft link in
{{{webapp/static/content}}}. A tool is provided (see the implementation notes
at the end of this article) that (re)builds {{{webapp/static/content}}}, so you
don't have to make any of those soft links or the directory scaffolding by hand
-- just run the tool. But you should know what it does! The following
directory structure is created:
{{{
-webapp/static/
+webapp/static/content/
path/
to/
dogs/
Bowser ----> .../content/path/to/dogs/Bowser/static
}}}
-''[ToDo: provide an ant task that automates this]''
+
A reference to a page-specific resource looks like this in the HTML, e.g.
{{{
-<img src="/static/path/to/dogs/Bowser/bad_dog.jpg" />
+<img src="/static/content/path/to/dogs/Bowser/bad_dog.jpg" />
}}}
It would be quite undesirable to hard-code the site structure into our XML
source document, so we'll add a template to our stylesheet that lets us just
write that as {{{<img src="static/bad_dog.jpg">}}}; the template will rewrite
that to the necessary URI in the generated HTML. See the implementation notes
at the end of this article for the XSLT template.
@@ -103,6 +106,22 @@
Note the the sub-structure of {{{.../Bowser/static}}} is completely ''ad
hoc''; all that matters at this level is that references in the page match the
directory structure. The sitemap does not know or care about this per-page
"static/" directory, and it certainly doesn't care how it's structured
internally.
+If you have static resources that are specific to a certain area of the site,
this is handled too. Suppose we have some imagery that appears on every page
in the {{{path/to/dogs/**}}}. Simply create a {{{static/}}} directory at the
appropriate place in the {{{content/}}} directory structure, e.g.
+{{{
+content/path/to/dogs/
+ static/
+ some-common-image.jpg
+ Bowser.page/
+ ''etc...''
+}}}
+
+The tool will create the soft link in {{{static/content}}}, and you
+reference it in the document like this, e.g.:
+{{{
+<img src="/static/content/path/to/dogs/some-common-image.jpg">
+}}}
+
+
== "Trailing slash" resources ==
Sometimes you really need a resource to be served at a URI that ends with a
slash, because it determines whether a relative link in the page denotes a
''child''(if the current URL has a trailing slash), or a ''sibling'' (current
URL has no trailing slash) of the current page. If the URL of the current page
doesn't end with a slash (e.g., {{{path/to/dogs}}}), then we have an annoying
situation if we want to include a link on that page to a child resource (e.g.,
{{{path/to/dogs/Bowser}}}). Our choices are:
@@ -231,9 +250,34 @@
</xsl:template>
}}}
-== Ant task to automate building directories and links in webapp/static ==
+== A script to automate building directories and links in
webapp/static/content ==
-TBD!
+You can invoke this script from an ant task or a makefile.
+
+{{{
+#!/bin/csh -f
+#
+# Rebuild webapp/static/content.
+# (See http://wiki.apache.org/cocoon/SimpleContentModel)
+#
+cd webapp
+set content_dir = $cwd/content
+
+rm -rf static/content
+mkdir static/content
+
+foreach dir (`cd $content_dir; find * -name static -type d`)
+ set page_dir = $dir:h
+ set page_parent = $page_dir:h
+ set page_name = $page_dir:t
+ set static_dir = static/content/$page_parent
+
+ mkdir -p $static_dir
+ pushd $static_dir >& /dev/null
+ ln -s $content_dir/$page_dir/static $page_name
+ popd >& /dev/null
+end
+}}}
----
That's all there is to it!