Index: /trunk/gsdl/src/recpt/formattools.cpp
===================================================================
--- /trunk/gsdl/src/recpt/formattools.cpp	(revision 12566)
+++ /trunk/gsdl/src/recpt/formattools.cpp	(revision 12567)
@@ -172,9 +172,10 @@
     return substr(it+1, end);
   }
+
   return meta_name;
 
 }
-// returns a date of form 31 _textmonthnn_ 1999 
-// input is date of type 19991231
+// returns a date of form _format:date_(year, month, day)
+// input is date of type yyyy-?mm-?dd
 // at least the year must be present in date
 text_t format_date (const text_t &date) {
@@ -185,190 +186,33 @@
 
   text_t year = substr (datebegin, datebegin+4);
-
-  if (date.size() < 6) return year;
-
-  text_t month = substr (datebegin+4, datebegin+6);
+  int chars_seen_so_far = 4;
+
+  if (date[chars_seen_so_far] == '-') ++chars_seen_so_far ;
+  if (date.size() < chars_seen_so_far+2) return "_format:date_("+year+")";
+ 
+  text_t month = substr (datebegin+chars_seen_so_far, datebegin+chars_seen_so_far+2);
   int imonth = month.getint();
-  if (imonth <= 0 || imonth > 12) return year;
-  month = "_textmonth" + month + "_";
-
-  if (date.size() < 8) return month + " " + year;
-
-  text_t day = substr (datebegin+6, datebegin+8);
+  if (imonth <= 0 || imonth > 12) return "_format:date_("+year+")";
+ 
+  chars_seen_so_far += 2;
+  if (date[chars_seen_so_far] == '-') ++chars_seen_so_far ;
+  
+  if (date.size() < chars_seen_so_far+2) return "_format:date_("+year+","+month+")";
+
+  text_t day = substr (datebegin+chars_seen_so_far, datebegin+chars_seen_so_far+2);
   if (day[0] == '0') day = substr (day.begin()+1, day.end());
   int iday = day.getint();
-  if (iday <= 0 || iday > 31) return month + " " + year;
-    
-  return day + " " + month + " " + year;
+  if (iday <= 0 || iday > 31) return "_format:date_("+year+","+month+")";
+    
+  return "_format:date_("+year+","+month+","+day+")";
 }  
 
 // converts an iso639 language code to its English equivalent
-// I realize that this isn't the pretiest or most efficient implementation,
-// hopefully this ugly Language (and Date too) formatting won't survive to
-// see gsdl-3.0
+// should we be checking that the macro exists??
 text_t iso639 (const text_t &langcode) {
-
-  if (langcode == "aa") return "Afar";
-  if (langcode == "ab") return "Abkhazian";
-  if (langcode == "af") return "Afrikaans";
-  if (langcode == "am") return "Amharic";
-  if (langcode == "ar") return "Arabic";
-  if (langcode == "as") return "Assamese";
-  if (langcode == "ay") return "Aymara";
-  if (langcode == "az") return "Azerbaijani";
-  
-  if (langcode == "ba") return "Bashkir";
-  if (langcode == "be") return "Byelorussian";
-  if (langcode == "bg") return "Bulgarian";
-  if (langcode == "bh") return "Bihari";
-  if (langcode == "bi") return "Bislama";
-  if (langcode == "bn") return "Bengali; Bangla";
-  if (langcode == "bo") return "Tibetan";
-  if (langcode == "br") return "Breton";
-  
-  if (langcode == "ca") return "Catalan";
-  if (langcode == "co") return "Corsican";
-  if (langcode == "cs") return "Czech";
-  if (langcode == "cy") return "Welsh";
-  
-  if (langcode == "da") return "Danish";
-  if (langcode == "de") return "German";
-  if (langcode == "dz") return "Bhutani";
-  
-  if (langcode == "el") return "Greek";
-  if (langcode == "en") return "English";
-  if (langcode == "eo") return "Esperanto";
-  if (langcode == "es") return "Spanish";
-  if (langcode == "et") return "Estonian";
-  if (langcode == "eu") return "Basque";
-  
-  if (langcode == "fa") return "Persian";
-  if (langcode == "fi") return "Finnish";
-  if (langcode == "fj") return "Fiji";
-  if (langcode == "fo") return "Faroese";
-  if (langcode == "fr") return "French";
-  if (langcode == "fy") return "Frisian";
-  
-  if (langcode == "ga") return "Irish";
-  if (langcode == "gd") return "Scots Gaelic";
-  if (langcode == "gl") return "Galician";
-  if (langcode == "gn") return "Guarani";
-  if (langcode == "gu") return "Gujarati";
-  
-  if (langcode == "ha") return "Hausa";
-  if (langcode == "hi") return "Hindi";
-  if (langcode == "hr") return "Croatian";
-  if (langcode == "hu") return "Hungarian";
-  if (langcode == "hy") return "Armenian";
-  
-  if (langcode == "ia") return "Interlingua";
-  if (langcode == "ie") return "Interlingue";
-  if (langcode == "ik") return "Inupiak";
-  if (langcode == "in") return "Indonesian";
-  if (langcode == "is") return "Icelandic";
-  if (langcode == "it") return "Italian";
-  if (langcode == "iw") return "Hebrew";
-  
-  if (langcode == "ja") return "Japanese";
-  if (langcode == "ji") return "Yiddish";
-  if (langcode == "jw") return "Javanese";
-  
-  if (langcode == "ka") return "Georgian";
-  if (langcode == "kk") return "Kazakh";
-  if (langcode == "kl") return "Greenlandic";
-  if (langcode == "km") return "Cambodian";
-  if (langcode == "kn") return "Kannada";
-  if (langcode == "ko") return "Korean";
-  if (langcode == "ks") return "Kashmiri";
-  if (langcode == "ku") return "Kurdish";
-  if (langcode == "ky") return "Kirghiz";
-  
-  if (langcode == "la") return "Latin";
-  if (langcode == "ln") return "Lingala";
-  if (langcode == "lo") return "Laothian";
-  if (langcode == "lt") return "Lithuanian";
-  if (langcode == "lv") return "Latvian, Lettish";
-  
-  if (langcode == "mg") return "Malagasy";
-  if (langcode == "mi") return "Maori";
-  if (langcode == "mk") return "Macedonian";
-  if (langcode == "ml") return "Malayalam";
-  if (langcode == "mn") return "Mongolian";
-  if (langcode == "mo") return "Moldavian";
-  if (langcode == "mr") return "Marathi";
-  if (langcode == "ms") return "Malay";
-  if (langcode == "mt") return "Maltese";
-  if (langcode == "my") return "Burmese";
-  
-  if (langcode == "na") return "Nauru";
-  if (langcode == "ne") return "Nepali";
-  if (langcode == "nl") return "Dutch";
-  if (langcode == "no") return "Norwegian";
-  
-  if (langcode == "oc") return "Occitan";
-  if (langcode == "om") return "(Afan) Oromo";
-  if (langcode == "or") return "Oriya";
-  
-  if (langcode == "pa") return "Punjabi";
-  if (langcode == "pl") return "Polish";
-  if (langcode == "ps") return "Pashto, Pushto";
-  if (langcode == "pt") return "Portuguese";
-  
-  if (langcode == "qu") return "Quechua";
-  if (langcode == "rm") return "Rhaeto-Romance";
-  if (langcode == "rn") return "Kirundi";
-  if (langcode == "ro") return "Romanian";
-  if (langcode == "ru") return "Russian";
-  if (langcode == "rw") return "Kinyarwanda";
-  
-  if (langcode == "sa") return "Sanskrit";
-  if (langcode == "sd") return "Sindhi";
-  if (langcode == "sg") return "Sangro";
-  if (langcode == "sh") return "Serbo-Croatian";
-  if (langcode == "si") return "Singhalese";
-  if (langcode == "sk") return "Slovak";
-  if (langcode == "sl") return "Slovenian";
-  if (langcode == "sm") return "Samoan";
-  if (langcode == "sn") return "Shona";
-  if (langcode == "so") return "Somali";
-  if (langcode == "sq") return "Albanian";
-  if (langcode == "sr") return "Serbian";
-  if (langcode == "ss") return "Siswati";
-  if (langcode == "st") return "Sesotho";
-  if (langcode == "su") return "Sudanese";
-  if (langcode == "sv") return "Swedish";
-  if (langcode == "sw") return "Swahili";
-  
-  if (langcode == "ta") return "Tamil";
-  if (langcode == "te") return "Tegulu";
-  if (langcode == "tg") return "Tajik";
-  if (langcode == "th") return "Thai";
-  if (langcode == "ti") return "Tigrinya";
-  if (langcode == "tk") return "Turkmen";
-  if (langcode == "tl") return "Tagalog";
-  if (langcode == "tn") return "Setswana";
-  if (langcode == "to") return "Tonga";
-  if (langcode == "tr") return "Turkish";
-  if (langcode == "ts") return "Tsonga";
-  if (langcode == "tt") return "Tatar";
-  if (langcode == "tw") return "Twi";
-  
-  if (langcode == "uk") return "Ukrainian";
-  if (langcode == "ur") return "Urdu";
-  if (langcode == "uz") return "Uzbek";
-  
-  if (langcode == "vi") return "Vietnamese";
-  if (langcode == "vo") return "Volapuk";
-  
-  if (langcode == "wo") return "Wolof";
-  
-  if (langcode == "xh") return "Xhosa";
-  
-  if (langcode == "yo") return "Yoruba";
-  
-  if (langcode == "zh") return "Chinese";
-  if (langcode == "zu") return "Zulu";
-  return langcode;
-}
+  if (langcode.empty()) return "";
+  return "_iso639:iso639"+langcode+"_";
+}
+
 
 text_t get_href (const text_t &link) {
@@ -618,4 +462,8 @@
     meta = substr (meta.begin()+8, meta.end());
   }
+  if (meta.size() > 7 && (substr(meta.begin(), meta.begin()+7) == "format:")) {    
+    metaoption.metacommand |= mSpecial;
+    meta = substr (meta.begin()+7, meta.end());
+  }
 
   if (meta.size() > 7 && (substr (meta.begin(), meta.begin()+6) == "parent")) {
@@ -988,6 +836,10 @@
     for (int i=start_i; i<=end_i; ++i) {
       if (!first) tmp += meta.siblingoptions;
-      if (no_ns_metaname == "Date") tmp += format_date (metainfo.values[i]);
-      else if (no_ns_metaname == "Language") tmp += iso639(metainfo.values[i]);
+      if (meta.metacommand & mSpecial) {
+	// special formatting
+	if (no_ns_metaname == "Date") tmp += format_date (metainfo.values[i]);
+	else if (no_ns_metaname == "Language") tmp += iso639(metainfo.values[i]);
+	else tmp += "_format:"+meta.metaname+"_("+metainfo.values[i]+")";
+      }
       else tmp += metainfo.values[i];
       first = false;
@@ -1000,6 +852,10 @@
       return "";
     }
-    if (no_ns_metaname == "Date") tmp += format_date (metainfo.values[position]);
-    else if (no_ns_metaname == "Language") tmp += iso639(metainfo.values[position]);
+    if (meta.metacommand & mSpecial) {
+      // special formatting
+      if (no_ns_metaname == "Date") tmp += format_date (metainfo.values[position]);
+      else if (no_ns_metaname == "Language") tmp += iso639(metainfo.values[position]);
+      else tmp += "_format:"+meta.metaname+"_("+metainfo.values[position]+")";
+    } 
     else tmp += metainfo.values[position];
   }
@@ -1126,8 +982,4 @@
     
 }
-
-
-// note: all the format_date stuff is assuming that all Date metadata is going to
-// be of the form yyyymmdd, this is of course, crap ;)
 
 static text_t get_meta (const text_t& collection, recptproto* collectproto,
Index: /trunk/gsdl/src/recpt/formattools.h
===================================================================
--- /trunk/gsdl/src/recpt/formattools.h	(revision 12566)
+++ /trunk/gsdl/src/recpt/formattools.h	(revision 12567)
@@ -38,5 +38,5 @@
 		comDocumentButtonExpandContents, comDocumentButtonExpandText, comOID, comRank, comCollection};
 
-enum mcommand_t {mNone=0, mCgiSafe=1, mParent=2, mSibling=4, mChild=8};
+enum mcommand_t {mNone=0, mCgiSafe=1, mParent=2, mSibling=4, mChild=8, mSpecial=16};
 
 enum pcommand_t {pNone, pImmediate, pTop, pAll};
