You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xalan.apache.org by db...@apache.org on 2001/01/26 22:18:45 UTC
cvs commit: xml-xalan/c/src/XSLT ElemNumber.cpp ElemNumber.hpp
dbertoni 01/01/26 13:18:45
Modified: c/src/XSLT ElemNumber.cpp ElemNumber.hpp
Log:
Implemented traditional Greek numbering.
Revision Changes Path
1.33 +183 -13 xml-xalan/c/src/XSLT/ElemNumber.cpp
Index: ElemNumber.cpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/XSLT/ElemNumber.cpp,v
retrieving revision 1.32
retrieving revision 1.33
diff -u -r1.32 -r1.33
--- ElemNumber.cpp 2001/01/03 19:32:48 1.32
+++ ElemNumber.cpp 2001/01/26 21:18:44 1.33
@@ -167,12 +167,9 @@
}
else if(equals(aname, Constants::ATTRNAME_LETTERVALUE))
{
- if (equals("traditional", atts.getValue(i)))
- constructionContext.warn(Constants::ATTRNAME_LETTERVALUE +
- " value 'traditional' not supported yet!");
m_lettervalue_avt = new AVT(aname, atts.getType(i),
atts.getValue(i), *this, constructionContext);
- }
+ }
else if(equals(aname,Constants::ATTRNAME_GROUPINGSEPARATOR))
{
m_groupingSeparator_avt = new AVT(aname, atts.getType(i),
@@ -228,6 +225,7 @@
}
+
XalanNode*
ElemNumber::findAncestor(
StylesheetExecutionContext& executionContext,
@@ -776,15 +774,16 @@
}
else
{
- XalanDOMString letterVal;
+ // A string to hold the result.
+ StylesheetExecutionContext::GetAndReleaseCachedString letterVal(executionContext);
m_lettervalue_avt->evaluate(
- letterVal,
+ letterVal.get(),
contextNode,
*this,
executionContext);
- return equals(compareValue, letterVal);
+ return equals(compareValue, letterVal.get());
}
}
@@ -825,12 +824,14 @@
const IntVectorType::size_type groupsSize = groups.size();
- // array of tables of hundreds, tens, digits. Indexes into the vector
- // returned by
+ // array of tables of hundreds, tens, digits. Indexes into the vectors
+ // in the digits table.
const IntVectorType& tables = theResourceBundle.getDigitsTableTable();
const DigitsTableVectorType& digitsTable = theResourceBundle.getDigitsTable();
+ assert(tables.size() == digitsTable.size());
+
// some languages have additive alphabetical notation,
// some multiplicative-additive, etc... Handle them differently.
const eNumberingMethod numbering = theResourceBundle.getNumberingMethod();
@@ -1038,6 +1039,10 @@
+const XalanDOMChar elalphaNumberType = 0x03B1;
+
+
+
XalanDOMString
ElemNumber::getFormattedNumber(
StylesheetExecutionContext& executionContext,
@@ -1079,8 +1084,24 @@
break;
// Handle the special case of Greek letters for now
- case 0x03B1:
- return int2alphaCount(listElement, s_elalphaCountTable);
+ case elalphaNumberType:
+ if (evaluateLetterValueAVT(executionContext, contextNode, Constants::ATTRVAL_TRADITIONAL) == true)
+ {
+ NumberingResourceBundleMapType::const_iterator i = s_resourceBundles.find(0x03B1);
+
+ if (i != s_resourceBundles.end())
+ {
+ return traditionalAlphaCount(listElement, (*i).second);
+ }
+ else
+ {
+ return XalanDOMString();
+ }
+ }
+ else
+ {
+ return int2alphaCount(listElement, s_elalphaCountTable);
+ }
break;
default: // "1"
@@ -1431,6 +1452,41 @@
0
};
+
+
+static const XalanDOMChar elalphaTraditionalCountTable[] =
+{
+ 0x03c9,
+ 0x03b1,
+ 0x03b2,
+ 0x03b3,
+ 0x03db,
+ 0x03b4,
+ 0x03b5,
+ 0x03b6,
+ 0x03b7,
+ 0x03b8,
+ 0x03b9,
+ 0x03ba,
+ 0x03bb,
+ 0x03bc,
+ 0x03bd,
+ 0x03be,
+ 0x03bf,
+ 0x03c0,
+ 0x03c1,
+ 0x03c2,
+ 0x03c3,
+ 0x03c4,
+ 0x03c5,
+ 0x03c6,
+ 0x03c7,
+ 0x03c8,
+ 0
+};
+
+
+
static XalanDOMString s_atString;
static XalanDOMString s_textString;
@@ -1447,14 +1503,18 @@
static XalanDOMString s_oneString;
+static XalanDOMString s_alphaCountTable;
+
static XalanDOMString s_elalphaCountTable;
-static XalanDOMString s_alphaCountTable;
+static XalanDOMString s_elalphaTraditionalCountTable;
+
static ElemNumber::DecimalToRomanVectorType s_romanConvertTable;
static ElemNumber::NumberingResourceBundleMapType s_resourceBundles;
+
const XalanDOMString& ElemNumber::s_atString = ::s_atString;
const XalanDOMString& ElemNumber::s_textString = ::s_textString;
@@ -1471,9 +1531,11 @@
const XalanDOMString& ElemNumber::s_oneString = ::s_oneString;
+const XalanDOMString& ElemNumber::s_alphaCountTable = ::s_alphaCountTable;
+
const XalanDOMString& ElemNumber::s_elalphaCountTable = ::s_elalphaCountTable;
-const XalanDOMString& ElemNumber::s_alphaCountTable = ::s_alphaCountTable;
+const XalanDOMString& ElemNumber::s_elalphaTraditionalCountTable = ::s_elalphaTraditionalCountTable;
const ElemNumber::DecimalToRomanVectorType& ElemNumber::s_romanConvertTable =
::s_romanConvertTable;
@@ -1481,6 +1543,109 @@
const ElemNumber::NumberingResourceBundleMapType& ElemNumber::s_resourceBundles =
::s_resourceBundles;
+
+
+static void
+addTraditionalElalphaBundle(ElemNumber::NumberingResourceBundleMapType& theBundleMap)
+{
+
+ // The following are a bunch of static data the comprise the contents of the bundle.
+ static const XalanDOMChar elalphaAlphabet[] =
+ {
+ 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03b6, 0x03b7, 0x03b8,
+ 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf, 0x03c0,
+ 0x03c1, 0x03c2, 0x03c3, 0x03c4, 0x03c5, 0x03c6, 0x03c7, 0x03c8,
+ 0x03c9, 0
+ };
+
+ static const XalanDOMChar elalphaTraditionalAlphabet[] =
+ {
+ XalanUnicode::charLetter_A, XalanUnicode::charLetter_B, XalanUnicode::charLetter_C,
+ XalanUnicode::charLetter_D, XalanUnicode::charLetter_E, XalanUnicode::charLetter_F,
+ XalanUnicode::charLetter_G, XalanUnicode::charLetter_H, XalanUnicode::charLetter_I,
+ XalanUnicode::charLetter_J, XalanUnicode::charLetter_K, XalanUnicode::charLetter_L,
+ XalanUnicode::charLetter_M, XalanUnicode::charLetter_N, XalanUnicode::charLetter_O,
+ XalanUnicode::charLetter_P, XalanUnicode::charLetter_Q, XalanUnicode::charLetter_R,
+ XalanUnicode::charLetter_S, XalanUnicode::charLetter_T, XalanUnicode::charLetter_U,
+ XalanUnicode::charLetter_V, XalanUnicode::charLetter_W, XalanUnicode::charLetter_X,
+ XalanUnicode::charLetter_Y, XalanUnicode::charLetter_Z, 0
+ };
+
+ static const int elalphaNumberGroups[] =
+ {
+ 100, 10, 1
+ };
+
+ const size_t elalphaNumberGroupsCount = sizeof(elalphaNumberGroups) / sizeof(int);
+
+ static const int elalphaMultipliers[] = { 1000 };
+
+ const size_t elalphaMultipliersCount = sizeof(elalphaMultipliers) / sizeof(int);
+
+ static const XalanDOMChar elalphaMultiplierChars[] = { 0x03d9, 0 };
+
+ static const XalanDOMChar elalphaDigits[] =
+ {
+ 0x03b1, 0x03b2, 0x03b3, 0x03b4, 0x03b5, 0x03db, 0x03b6, 0x03b7, 0x03b8, 0
+ };
+
+ static const XalanDOMChar elalphaTens[] =
+ {
+ 0x03b9, 0x03ba, 0x03bb, 0x03bc, 0x03bd, 0x03be, 0x03bf, 0x03c0, 0x03df, 0
+ };
+
+ static const XalanDOMChar elalphaHundreds[] =
+ {
+ 0x03c1, 0x03c2, 0x03c4, 0x03c5, 0x03c6, 0x03c7, 0x03c8, 0x03c9, 0x03e1, 0
+ };
+
+ typedef XalanNumberingResourceBundle::DigitsTableVectorType DigitsTableVectorType;
+ typedef XalanNumberingResourceBundle::IntVectorType IntVectorType;
+
+ // Create the table of characters for the various digit positions...
+ DigitsTableVectorType theElalphaDigitsTable;
+
+ // Since we know the size, create the empty vectors in the table...
+ theElalphaDigitsTable.resize(3);
+
+ // Swap the empty tables with temporary ones...
+ XalanDOMCharVectorType(elalphaDigits, elalphaDigits + length(elalphaDigits)).swap(theElalphaDigitsTable[0]);
+ XalanDOMCharVectorType(elalphaTens, elalphaTens + length(elalphaTens)).swap(theElalphaDigitsTable[1]);
+ XalanDOMCharVectorType(elalphaHundreds, elalphaHundreds + length(elalphaHundreds)).swap(theElalphaDigitsTable[2]);
+
+ // This table will indicate which positions the vectors of digits are in
+ // the table...
+ IntVectorType theDigitsTableTable;
+
+ theDigitsTableTable.reserve(3);
+
+ // Push the positions on in reverse order, since that's how things work...
+ theDigitsTableTable.push_back(2);
+ theDigitsTableTable.push_back(1);
+ theDigitsTableTable.push_back(0);
+
+ XalanNumberingResourceBundle theElaphaBundle(
+ XalanDOMString(XALAN_STATIC_UCODE_STRING("el")),
+ XalanDOMString(XALAN_STATIC_UCODE_STRING("el")),
+ XalanDOMString(XALAN_STATIC_UCODE_STRING("el")),
+ XalanDOMCharVectorType(elalphaAlphabet, elalphaAlphabet + length(elalphaAlphabet)),
+ XalanDOMCharVectorType(elalphaTraditionalAlphabet, elalphaTraditionalAlphabet + length(elalphaTraditionalAlphabet)),
+ XalanNumberingResourceBundle::eLeftToRight,
+ XalanNumberingResourceBundle::eMultiplicativeAdditive,
+ XalanNumberingResourceBundle::ePrecedes,
+ ~0,
+ IntVectorType(elalphaNumberGroups, elalphaNumberGroups + elalphaNumberGroupsCount),
+ IntVectorType(elalphaMultipliers, elalphaMultipliers + elalphaMultipliersCount),
+ XalanDOMCharVectorType(),
+ XalanDOMCharVectorType(elalphaMultiplierChars, elalphaMultiplierChars + length(elalphaMultiplierChars)),
+ theElalphaDigitsTable,
+ theDigitsTableTable);
+
+ theBundleMap[elalphaNumberType] = theElaphaBundle;
+}
+
+
+
void
ElemNumber::initialize()
{
@@ -1504,6 +1669,8 @@
::s_elalphaCountTable = elalphaCountTable;
+ ::s_elalphaTraditionalCountTable = elalphaTraditionalCountTable;
+
::s_romanConvertTable.reserve(7);
::s_romanConvertTable.push_back(
@@ -1554,6 +1721,8 @@
StaticStringToDOMString(XALAN_STATIC_UCODE_STRING("I")),
1L,
StaticStringToDOMString(XALAN_STATIC_UCODE_STRING("I"))));
+
+ addTraditionalElalphaBundle(::s_resourceBundles);
}
@@ -1572,6 +1741,7 @@
clear(::s_alphaCountTable);
clear(::s_elalphaCountTable);
+ clear(::s_elalphaTraditionalCountTable);
DecimalToRomanVectorType().swap(::s_romanConvertTable);
1.24 +1 -2 xml-xalan/c/src/XSLT/ElemNumber.hpp
Index: ElemNumber.hpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/XSLT/ElemNumber.hpp,v
retrieving revision 1.23
retrieving revision 1.24
diff -u -r1.23 -r1.24
--- ElemNumber.hpp 2000/12/21 04:45:27 1.23
+++ ElemNumber.hpp 2001/01/26 21:18:44 1.24
@@ -58,7 +58,7 @@
#define XALAN_ELEMNUMBER_HEADER_GUARD
/**
- * $Id: ElemNumber.hpp,v 1.23 2000/12/21 04:45:27 dbertoni Exp $
+ * $Id: ElemNumber.hpp,v 1.24 2001/01/26 21:18:44 dbertoni Exp $
*
* $State: Exp $
*
@@ -320,7 +320,6 @@
long2roman(
long val,
bool prefixesAreOK);
-
private: