diff options
Diffstat (limited to 'starmath')
-rw-r--r-- | starmath/inc/starmathdatabase.hxx | 140 | ||||
-rw-r--r-- | starmath/inc/strings.hrc | 8 | ||||
-rw-r--r-- | starmath/inc/strings.hxx | 4 | ||||
-rw-r--r-- | starmath/inc/token.hxx | 156 | ||||
-rw-r--r-- | starmath/inc/types.hxx | 1 | ||||
-rw-r--r-- | starmath/inc/visitors.hxx | 9 | ||||
-rw-r--r-- | starmath/qa/extras/data/tdf103430.mml | 4 | ||||
-rw-r--r-- | starmath/qa/extras/mmlimport-test.cxx | 2 | ||||
-rw-r--r-- | starmath/source/ElementsDockingWindow.cxx | 10 | ||||
-rw-r--r-- | starmath/source/mathmlexport.cxx | 78 | ||||
-rw-r--r-- | starmath/source/mathmlimport.cxx | 57 | ||||
-rw-r--r-- | starmath/source/mathmlimport.hxx | 2 | ||||
-rw-r--r-- | starmath/source/node.cxx | 25 | ||||
-rw-r--r-- | starmath/source/parse.cxx | 66 | ||||
-rw-r--r-- | starmath/source/starmathdatabase.cxx | 139 | ||||
-rw-r--r-- | starmath/source/visitors.cxx | 88 |
16 files changed, 520 insertions, 269 deletions
diff --git a/starmath/inc/starmathdatabase.hxx b/starmath/inc/starmathdatabase.hxx index 999b983f06b3..31e7f4651285 100644 --- a/starmath/inc/starmathdatabase.hxx +++ b/starmath/inc/starmathdatabase.hxx @@ -18,39 +18,137 @@ */ #include "token.hxx" -#include "types.hxx" + +// Starmath color types +// In order to add them to starmath, edit the SmColorTokenTableEntry lists on +// /core/starmath/source/starmathdatabase.css . + +// HTML +// https://developer.mozilla.org/en-US/docs/Web/CSS/color_value#Color_Keywords +/* CSS Level 1 */ +constexpr Color COL_SM_BLACK(0x000000); +constexpr Color COL_SM_SILVER(0xC0C0C0); +constexpr Color COL_SM_GRAY(0x808080); +constexpr Color COL_SM_WHITE(0xFFFFFF); +constexpr Color COL_SM_MAROON(0x800000); +constexpr Color COL_SM_RED(0xFF0000); +constexpr Color COL_SM_PURPLE(0x800080); +constexpr Color COL_SM_FUCHSIA(0xFF00FF); +constexpr Color COL_SM_GREEN(0x008000); +constexpr Color COL_SM_LIME(0x00FF00); +constexpr Color COL_SM_OLIVE(0x808000); +constexpr Color COL_SM_YELLOW(0xFFFF00); +constexpr Color COL_SM_NAVY(0x000080); +constexpr Color COL_SM_BLUE(0x0000FF); +constexpr Color COL_SM_TEAL(0x008080); +constexpr Color COL_SM_AQUA(0x00FFFF); +/* CSS Level 2 */ +// TODO +/* CSS Level 3 */ +// TODO +/* CSS Level 4 */ +constexpr Color COL_SM_REBECCAPURPLE(0x663399); +/* dvipsnames */ +// For now only five colors. +// In a future all of them. +// https://www.overleaf.com/learn/latex/Using_colours_in_LaTeX +constexpr Color COL_SM_DIV_APRICOT(0xFFB781); +constexpr Color COL_SM_DIV_AQUAMARINE(0x1BBEC1); +constexpr Color COL_SM_DIV_BITTERSWEET(0xCF4B16); +constexpr Color COL_SM_DIV_BLACK(0xCF4B16); +constexpr Color COL_SM_DIV_BLUE(0x102694); +/* Iconic colors */ +// https://design.ubuntu.com/brand/colour-palette/ +constexpr Color COL_SM_UBUNTU_ORANGE(0xE95420); +// https://www.debian.org/logos/ Picked from SVG logo +constexpr Color COL_SM_DEBIAN_MAGENTA(0xA80030); +// https://libreoffice.org/ +constexpr Color COL_SM_LO_GREEN(0x00A500); namespace starmathdatabase { +// Variables containing color information. +extern const SmColorTokenTableEntry aColorTokenTableParse[31]; +extern const SmColorTokenTableEntry aColorTokenTableHTML[20]; +extern const SmColorTokenTableEntry aColorTokenTableDVIPSNAMES[5]; + /** - * Identifies operator chars tokens for importing mathml. - * Identifies from char cChar - * @param cChar - * @return closing fences' token - */ + * Identifies operator chars tokens for importing mathml. + * Identifies from char cChar + * @param cChar + * @return closing fences' token + */ SmToken Identify_SmXMLOperatorContext_Impl(sal_Unicode cChar, bool bIsStretchy = true); /** - * Identifies opening / closing brace tokens for importing mathml. - * Identifies from char cChar - * @param cChar - * @return closing fences' token - */ + * Identifies opening / closing brace tokens for importing mathml. + * Identifies from char cChar + * @param cChar + * @return closing fences' token + */ SmToken Identify_PrefixPostfix_SmXMLOperatorContext_Impl(sal_Unicode cChar); /** - * Identifies opening brace tokens for importing mathml. - * Identifies from char cChar - * @param cChar - * @return closing fences' token - */ + * Identifies opening brace tokens for importing mathml. + * Identifies from char cChar + * @param cChar + * @return closing fences' token + */ SmToken Identify_Prefix_SmXMLOperatorContext_Impl(sal_Unicode cChar); /** - * Identifies closing brace tokens for importing mathml. - * Identifies from char cChar - * @param cChar - * @return closing fences' token - */ + * Identifies closing brace tokens for importing mathml. + * Identifies from char cChar + * @param cChar + * @return closing fences' token + */ SmToken Identify_Postfix_SmXMLOperatorContext_Impl(sal_Unicode cChar); + +/** + * Identifies color from color code cColor. + * It will be returned with the parser syntax. + * @param cColor + * @param parser color + */ +std::unique_ptr<SmColorTokenTableEntry> Identify_Color_Parser(sal_uInt32 cColor); + +/** + * Identifies color from color code cColor. + * It will be returned with the HTML syntax. + * @param cColor + * @param parser color + */ +std::unique_ptr<SmColorTokenTableEntry> Identify_Color_HTML(sal_uInt32 cColor); + +/** + * Identifies color from color code cColor. + * It will be returned with the dvipsnames syntax. + * @param cColor + * @param parser color + */ +std::unique_ptr<SmColorTokenTableEntry> Identify_Color_DVIPSNAMES(sal_uInt32 cColor); + +/** + * Identifies color from color name. + * It will be returned with the parser syntax. + * @param cColor + * @param parser color + */ +std::unique_ptr<SmColorTokenTableEntry> Identify_ColorName_Parser(const OUString& colorname); + +/** + * Identifies color from color name. + * It will be returned with the HTML syntax. + * @param cColor + * @param parser color + */ +std::unique_ptr<SmColorTokenTableEntry> Identify_ColorName_HTML(const OUString& colorname); + +/** + * Identifies color from color name. + * It will be returned with the dvipsnames syntax. + * @param cColor + * @param parser color + */ +std::unique_ptr<SmColorTokenTableEntry> Identify_ColorName_DVIPSNAMES(const OUString& colorname); } diff --git a/starmath/inc/strings.hrc b/starmath/inc/strings.hrc index fb9fecc8e4b5..c93de7c026d1 100644 --- a/starmath/inc/strings.hrc +++ b/starmath/inc/strings.hrc @@ -191,8 +191,8 @@ #define RID_COLORX_BLUE_HELP NC_("RID_COLORX_BLUE_HELP", "Color Blue" ) #define RID_COLORX_GREEN_HELP NC_("RID_COLORX_GREEN_HELP", "Color Green" ) #define RID_COLORX_RED_HELP NC_("RID_COLORX_RED_HELP", "Color Red" ) -#define RID_COLORX_CYAN_HELP NC_("RID_COLORX_CYAN_HELP", "Color Cyan" ) -#define RID_COLORX_MAGENTA_HELP NC_("RID_COLORX_MAGENTA_HELP", "Color Magenta" ) +#define RID_COLORX_AQUA_HELP NC_("RID_COLORX_AQUA_HELP", "Color Aqua" ) +#define RID_COLORX_FUCHSIA_HELP NC_("RID_COLORX_FUCHSIA_HELP", "Color Fuchsia" ) #define RID_COLORX_GRAY_HELP NC_("RID_COLORX_GRAY_HELP", "Color Gray" ) #define RID_COLORX_LIME_HELP NC_("RID_COLORX_LIME_HELP", "Color Lime" ) #define RID_COLORX_MAROON_HELP NC_("RID_COLORX_MAROON_HELP", "Color Maroon" ) @@ -326,8 +326,8 @@ #define STR_BLUE NC_("STR_BLUE", "blue" ) #define STR_GREEN NC_("STR_GREEN", "green" ) #define STR_RED NC_("STR_RED", "red" ) -#define STR_CYAN NC_("STR_CYAN", "cyan" ) -#define STR_MAGENTA NC_("STR_MAGENTA", "magenta" ) +#define STR_AQUA NC_("STR_AQUA", "aqua" ) +#define STR_FUCHSIA NC_("STR_FUCHSIA", "fuchsia" ) #define STR_GRAY NC_("STR_GRAY", "gray" ) #define STR_LIME NC_("STR_LIME", "lime" ) #define STR_MAROON NC_("STR_MAROON", "maroon" ) diff --git a/starmath/inc/strings.hxx b/starmath/inc/strings.hxx index 004e55a8f170..fe537df552b6 100644 --- a/starmath/inc/strings.hxx +++ b/starmath/inc/strings.hxx @@ -183,8 +183,8 @@ #define RID_COLORX_BLUE "color blue {<?>} " #define RID_COLORX_GREEN "color green {<?>} " #define RID_COLORX_RED "color red {<?>} " -#define RID_COLORX_CYAN "color cyan {<?>} " -#define RID_COLORX_MAGENTA "color magenta {<?>} " +#define RID_COLORX_AQUA "color aqua {<?>} " +#define RID_COLORX_FUCHSIA "color fuchsia {<?>} " #define RID_COLORX_GRAY "color gray {<?>} " #define RID_COLORX_LIME "color lime {<?>} " #define RID_COLORX_MAROON "color maroon {<?>} " diff --git a/starmath/inc/token.hxx b/starmath/inc/token.hxx index d5f90abcada4..0c3788fd8966 100644 --- a/starmath/inc/token.hxx +++ b/starmath/inc/token.hxx @@ -30,8 +30,10 @@ #define INCLUDED_STARMATH_INC_TOKEN_HXX #include <sal/types.h> +#include "types.hxx" #include <rtl/ustring.hxx> #include <o3tl/typed_flags_set.hxx> +#include <tools/color.hxx> // TokenGroups enum class TG { @@ -135,11 +137,91 @@ enum SmTokenType TASINH, TACOSH, TATANH, TACOTH, // Arctrigo hyperbolic TSQRT, TNROOT, TFACT, TABS, // roots, n! |z| // Color - TRGB, TRGBA, THEX, - TAQUA, TBLACK, TBLUE, TCYAN, TFUCHSIA, - TGRAY, TGREEN, TLIME, TMAGENTA, TMAROON, - TNAVY, TOLIVE, TPURPLE, TRED, TSILVER, - TTEAL, TWHITE, TYELLOW + TRGB, TRGBA, THEX, THTMLCOL, TDVIPSNAMESCOL, + TICONICCOL +}; + +struct SmTokenTableEntry +{ + const char* pIdent; + SmTokenType eType; + sal_Unicode cMathChar; + TG nGroup; + sal_uInt16 nLevel; +}; + +struct SmColorTokenTableEntry +{ + const char* pIdent; + const char* cIdent; + SmTokenType eType; + Color cColor; + + SmColorTokenTableEntry() + : pIdent("") + , cIdent("") + , eType(TERROR) + , cColor() + {} + + SmColorTokenTableEntry( const SmColorTokenTableEntry * amColorTokenTableEntry ) + : pIdent(amColorTokenTableEntry->pIdent) + , cIdent(amColorTokenTableEntry->cIdent) + , eType(amColorTokenTableEntry->eType) + , cColor(amColorTokenTableEntry->cColor) + {} + + SmColorTokenTableEntry( const std::unique_ptr<SmColorTokenTableEntry> amColorTokenTableEntry ) + : pIdent(amColorTokenTableEntry->pIdent) + , cIdent(amColorTokenTableEntry->cIdent) + , eType(amColorTokenTableEntry->eType) + , cColor(amColorTokenTableEntry->cColor) + {} + + SmColorTokenTableEntry( const char* name, const char* codename, SmTokenType ctype, Color ncolor) + : pIdent(name) + , cIdent(codename) + , eType(ctype) + , cColor(ncolor) + {} + + SmColorTokenTableEntry( const char* name, const char* codename, SmTokenType ctype, sal_uInt32 ncolor) + : pIdent(name) + , cIdent(codename) + , eType(ctype) + , cColor(ncolor) + {} + + bool operator == ( const OUString & colorname ) const + { + return colorname.compareToIgnoreAsciiCaseAscii( pIdent ) == 0; + } + + bool operator == ( sal_uInt32 colorcode ) const + { + return colorcode == cColor.mValue; + } + + bool operator == ( Color colorcode ) const + { + return colorcode == cColor; + } + + bool equals( const OUString & colorname ) const + { + return colorname.compareToIgnoreAsciiCaseAscii( pIdent ) == 0; + } + + bool equals( sal_uInt32 colorcode ) const + { + return colorcode == cColor.mValue; + } + + bool equals( Color colorcode ) const + { + return colorcode == cColor; + } + }; struct SmToken @@ -177,15 +259,63 @@ struct SmToken , nLevel(nTokenLevel) , nRow(0) , nCol(0){} -}; -struct SmTokenTableEntry -{ - const char* pIdent; - SmTokenType eType; - sal_Unicode cMathChar; - TG nGroup; - sal_uInt16 nLevel; + void operator = (const SmTokenTableEntry & aTokenTableEntry) + { + aText = OUString::createFromAscii(aTokenTableEntry.pIdent); + eType = aTokenTableEntry.eType; + cMathChar = aTokenTableEntry.cMathChar; + nGroup = aTokenTableEntry.nGroup; + nLevel = aTokenTableEntry.nLevel; + nRow = 0; + nCol = 0; + } + + void operator = (const SmTokenTableEntry * aTokenTableEntry) + { + aText = OUString::createFromAscii(aTokenTableEntry->pIdent); + eType = aTokenTableEntry->eType; + cMathChar = aTokenTableEntry->cMathChar; + nGroup = aTokenTableEntry->nGroup; + nLevel = aTokenTableEntry->nLevel; + nRow = 0; + nCol = 0; + } + + void operator = (const SmColorTokenTableEntry & aTokenTableEntry) + { + aText = OUString::number(aTokenTableEntry.cColor.mValue, 16); + eType = aTokenTableEntry.eType; + cMathChar = MS_NULLCHAR; + nGroup = TG::Color; + nLevel = 0; + nRow = 0; + nCol = 0; + } + + void operator = (const SmColorTokenTableEntry * aTokenTableEntry) + { + aText = OUString::number(aTokenTableEntry->cColor.mValue, 16); + eType = aTokenTableEntry->eType; + cMathChar = MS_NULLCHAR; + nGroup = TG::Color; + nLevel = 0; + nRow = 0; + nCol = 0; + } + + void operator = (const std::unique_ptr<SmColorTokenTableEntry> & aTokenTableEntry) + { + aText = OUString::number(aTokenTableEntry->cColor.mValue, 16); + eType = aTokenTableEntry->eType; + cMathChar = MS_NULLCHAR; + nGroup = TG::Color; + nLevel = 0; + nRow = 0; + nCol = 0; + } + + }; #endif diff --git a/starmath/inc/types.hxx b/starmath/inc/types.hxx index 6efd585fb28d..56be51ee92b0 100644 --- a/starmath/inc/types.hxx +++ b/starmath/inc/types.hxx @@ -33,6 +33,7 @@ enum SmPrintSize { PRINT_SIZE_NORMAL, PRINT_SIZE_SCALED, PRINT_SIZE_ZOOMED }; //! (see %alpha ... %gamma for example) sal_Unicode const MS_NONE = '\0'; +sal_Unicode const MS_NULLCHAR = '\0'; sal_Unicode const MS_FACT = 0x0021; sal_Unicode const MS_INFINITY = 0x221E; sal_Unicode const MS_SLASH = 0x002F; diff --git a/starmath/inc/visitors.hxx b/starmath/inc/visitors.hxx index 4d3c4decae23..ff9ca79261ec 100644 --- a/starmath/inc/visitors.hxx +++ b/starmath/inc/visitors.hxx @@ -473,6 +473,15 @@ private: } /** + * Appends rText to the OUStringBuffer ( maCmdText ). + * @param rText + * @return + */ + void Append( const char* rText ) { + maCmdText.append( OUString::createFromAscii(rText) ); + } + + /** * Append a blank for separation, if needed. * It is needed if last char is not ' '. * @return diff --git a/starmath/qa/extras/data/tdf103430.mml b/starmath/qa/extras/data/tdf103430.mml index 92fba05dc295..f8ea8f8d2d0c 100644 --- a/starmath/qa/extras/data/tdf103430.mml +++ b/starmath/qa/extras/data/tdf103430.mml @@ -8,7 +8,9 @@ <mi mathvariant="normal" mathcolor="blue">y</mi> </mrow> <mrow> - <mo fontstyle="italic" fontweight="bold" mathvariant="normal" form="prefix" rspace="0">d</mo> + <mstyle mathcolor="#ffb781"> + <mo fontstyle="italic" fontweight="bold" mathvariant="normal" form="prefix" rspace="0">d</mo> + </mstyle> <mi fontfamily="serif" mathvariant="sans-serif-bold-italic" mathcolor="red">x</mi> </mrow> </mfrac> diff --git a/starmath/qa/extras/mmlimport-test.cxx b/starmath/qa/extras/mmlimport-test.cxx index 4b204787a3cb..80b608757618 100644 --- a/starmath/qa/extras/mmlimport-test.cxx +++ b/starmath/qa/extras/mmlimport-test.cxx @@ -148,7 +148,7 @@ void Test::testtdf99556() void Test::testTdf103430() { loadURL(m_directories.getURLFromSrc("starmath/qa/extras/data/tdf103430.mml")); - CPPUNIT_ASSERT_EQUAL(OUString("frac { { nitalic d ^ 2 nitalic color blue y } } { { nitalic d font sans bold italic color red x } }"), + CPPUNIT_ASSERT_EQUAL(OUString("frac { { nitalic d ^ 2 nitalic color blue y } } { { color apricot nitalic d font sans bold italic color red x } }"), mxDocShell->GetText()); } diff --git a/starmath/source/ElementsDockingWindow.cxx b/starmath/source/ElementsDockingWindow.cxx index ab9d72343be2..63edc2c2bf56 100644 --- a/starmath/source/ElementsDockingWindow.cxx +++ b/starmath/source/ElementsDockingWindow.cxx @@ -185,7 +185,7 @@ const SmElementDescr SmElementsControl::m_aAttributesList[] = {nullptr, nullptr}, {RID_COLORX_BLACK, RID_COLORX_BLACK_HELP}, {RID_COLORX_BLUE, RID_COLORX_BLUE_HELP}, {RID_COLORX_GREEN, RID_COLORX_GREEN_HELP}, {RID_COLORX_RED, RID_COLORX_RED_HELP}, - {RID_COLORX_CYAN, RID_COLORX_CYAN_HELP}, {RID_COLORX_MAGENTA, RID_COLORX_MAGENTA_HELP}, + {RID_COLORX_AQUA, RID_COLORX_AQUA_HELP}, {RID_COLORX_FUCHSIA, RID_COLORX_FUCHSIA_HELP}, {RID_COLORX_YELLOW, RID_COLORX_YELLOW_HELP}, {RID_COLORX_GRAY, RID_COLORX_GRAY_HELP}, {RID_COLORX_LIME, RID_COLORX_LIME_HELP}, {RID_COLORX_MAROON, RID_COLORX_MAROON_HELP}, {RID_COLORX_NAVY, RID_COLORX_NAVY_HELP}, {RID_COLORX_OLIVE, RID_COLORX_OLIVE_HELP}, @@ -911,10 +911,10 @@ void SmElementsControl::addElements(const SmElementDescr aElementsArray[], sal_u addElement(aParser, "color green { \"" + SmResId(STR_GREEN) + "\" }", aElement, SmResId(pElementHelp)); else if (aElement == RID_COLORX_RED) addElement(aParser, "color red { \"" + SmResId(STR_RED) + "\" }", aElement, SmResId(pElementHelp)); - else if (aElement == RID_COLORX_CYAN) - addElement(aParser, "color cyan { \"" + SmResId(STR_CYAN) + "\" }", aElement, SmResId(pElementHelp)); - else if (aElement == RID_COLORX_MAGENTA) - addElement(aParser, "color magenta { \"" + SmResId(STR_MAGENTA) + "\" }", aElement, SmResId(pElementHelp)); + else if (aElement == RID_COLORX_AQUA) + addElement(aParser, "color aqua { \"" + SmResId(STR_AQUA) + "\" }", aElement, SmResId(pElementHelp)); + else if (aElement == RID_COLORX_FUCHSIA) + addElement(aParser, "color fuchsia { \"" + SmResId(STR_FUCHSIA) + "\" }", aElement, SmResId(pElementHelp)); else if (aElement == RID_COLORX_YELLOW) addElement(aParser, "color yellow { \"" + SmResId(STR_YELLOW) + "\" }", aElement, SmResId(pElementHelp)); else if (aElement == RID_COLORX_GRAY) diff --git a/starmath/source/mathmlexport.cxx b/starmath/source/mathmlexport.cxx index f570ff561552..27d9d2b8696b 100644 --- a/starmath/source/mathmlexport.cxx +++ b/starmath/source/mathmlexport.cxx @@ -64,6 +64,7 @@ #include <document.hxx> #include <utility.hxx> #include "cfgitem.hxx" +#include <starmathdatabase.hxx> using namespace ::com::sun::star::beans; using namespace ::com::sun::star::document; @@ -1139,6 +1140,7 @@ void SmXMLExport::ExportFont(const SmNode *pNode, int nLevel) int nItalic = -1; // for the following variables: -1 = yet undefined; 0 = false; 1 = true; int nSansSerifFixed = -1; SmTokenType eNodeType = TUNKNOWN; + for (;;) { eNodeType = pNode->GetToken().eType; @@ -1168,64 +1170,36 @@ void SmXMLExport::ExportFont(const SmNode *pNode, int nLevel) break; } + sal_uInt32 nc; switch (pNode->GetToken().eType) { case TPHANTOM: // No attribute needed. An <mphantom> element will be used below. break; - case TBLACK: - AddAttribute(XML_NAMESPACE_MATH, XML_COLOR, XML_BLACK); - break; - case TWHITE: - AddAttribute(XML_NAMESPACE_MATH, XML_COLOR, XML_WHITE); - break; - case TRED: - AddAttribute(XML_NAMESPACE_MATH, XML_COLOR, XML_RED); - break; - case TGREEN: - AddAttribute(XML_NAMESPACE_MATH, XML_COLOR, XML_GREEN); - break; - case TBLUE: - AddAttribute(XML_NAMESPACE_MATH, XML_COLOR, XML_BLUE); - break; - case TCYAN: - AddAttribute(XML_NAMESPACE_MATH, XML_COLOR, XML_AQUA); - break; - case TMAGENTA: - AddAttribute(XML_NAMESPACE_MATH, XML_COLOR, XML_FUCHSIA); - break; - case TYELLOW: - AddAttribute(XML_NAMESPACE_MATH, XML_COLOR, XML_YELLOW); - break; - case TSILVER: - AddAttribute(XML_NAMESPACE_MATH, XML_COLOR, XML_SILVER); - break; - case TGRAY: - AddAttribute(XML_NAMESPACE_MATH, XML_COLOR, XML_GRAY); - break; - case TMAROON: - AddAttribute(XML_NAMESPACE_MATH, XML_COLOR, XML_MAROON); - break; - case TOLIVE: - AddAttribute(XML_NAMESPACE_MATH, XML_COLOR, XML_OLIVE); - break; - case TLIME: - AddAttribute(XML_NAMESPACE_MATH, XML_COLOR, XML_LIME); - break; - case TAQUA: - AddAttribute(XML_NAMESPACE_MATH, XML_COLOR, XML_AQUA); - break; - case TTEAL: - AddAttribute(XML_NAMESPACE_MATH, XML_COLOR, XML_TEAL); - break; - case TNAVY: - AddAttribute(XML_NAMESPACE_MATH, XML_COLOR, XML_NAVY); - break; - case TFUCHSIA: - AddAttribute(XML_NAMESPACE_MATH, XML_COLOR, XML_FUCHSIA); + case THTMLCOL: + { + std::unique_ptr<SmColorTokenTableEntry> aSmColorTokenTableEntry; + nc = pNode->GetToken().aText.toUInt32(16); + aSmColorTokenTableEntry = starmathdatabase::Identify_Color_HTML( nc ); + OUString sssStr = OUString::createFromAscii( aSmColorTokenTableEntry->cIdent ); + AddAttribute(XML_NAMESPACE_MATH, XML_MATHCOLOR, sssStr); + } break; - case TPURPLE: - AddAttribute(XML_NAMESPACE_MATH, XML_COLOR, XML_PURPLE); + case TRGB: + case TRGBA: + case THEX: + case TDVIPSNAMESCOL: + case TICONICCOL: + { + OUStringBuffer sStrBuf; + sStrBuf.append('#'); + std::unique_ptr<SmColorTokenTableEntry> aSmColorTokenTableEntry; + nc = pNode->GetToken().aText.toUInt32(16); + aSmColorTokenTableEntry = starmathdatabase::Identify_Color_HTML( nc ); + sStrBuf.append( aSmColorTokenTableEntry->cColor.AsRGBHexString() ); + OUString ssStr(sStrBuf.makeStringAndClear()); + AddAttribute(XML_NAMESPACE_MATH, XML_MATHCOLOR, ssStr); + } break; case TSIZE: { diff --git a/starmath/source/mathmlimport.cxx b/starmath/source/mathmlimport.cxx index 587ba3ca6458..7a3ca34b9a5a 100644 --- a/starmath/source/mathmlimport.cxx +++ b/starmath/source/mathmlimport.cxx @@ -694,6 +694,19 @@ void SmXMLContext_Helper::ApplyAttrs() pFontNode->SetSubNodes(nullptr, popOrZero(rNodeStack)); rNodeStack.push_front(std::move(pFontNode)); } + if (!sColor.isEmpty()) + { + std::unique_ptr<SmColorTokenTableEntry> aSmColorTokenTableEntry; + aSmColorTokenTableEntry = starmathdatabase::Identify_ColorName_HTML( sColor ); + if( aSmColorTokenTableEntry ) + { + aToken = aSmColorTokenTableEntry; + std::unique_ptr<SmFontNode> pFontNode(new SmFontNode(aToken)); + pFontNode->SetSubNodes(nullptr, popOrZero(rNodeStack)); + rNodeStack.push_front(std::move(pFontNode)); + } + // If not known, not implemented yet. Giving up. + } if (!sFontFamily.isEmpty()) { if (sFontFamily.equalsIgnoreAsciiCase(GetXMLToken(XML_FIXED))) @@ -711,21 +724,6 @@ void SmXMLContext_Helper::ApplyAttrs() pFontNode->SetSubNodes(nullptr, popOrZero(rNodeStack)); rNodeStack.push_front(std::move(pFontNode)); } - if (sColor.isEmpty()) - return; - - //Again we can only handle a small set of colours in - //StarMath for now. - const SvXMLTokenMap& rTokenMap = - rContext.GetSmImport().GetColorTokenMap(); - sal_uInt16 tok = rTokenMap.Get(XML_NAMESPACE_MATH, sColor); - if (tok != XML_TOK_UNKNOWN) - { - aToken.eType = static_cast<SmTokenType>(tok); - std::unique_ptr<SmFontNode> pFontNode(new SmFontNode(aToken)); - pFontNode->SetSubNodes(nullptr, popOrZero(rNodeStack)); - rNodeStack.push_front(std::move(pFontNode)); - } } namespace { @@ -1980,35 +1978,6 @@ uno::Reference< xml::sax::XFastContextHandler > SAL_CALL SmXMLFlatDocContext_Imp } } -const SvXMLTokenMapEntry aColorTokenMap[] = -{ - { XML_NAMESPACE_MATH, XML_BLACK, TBLACK}, - { XML_NAMESPACE_MATH, XML_WHITE, TWHITE}, - { XML_NAMESPACE_MATH, XML_RED, TRED}, - { XML_NAMESPACE_MATH, XML_GREEN, TGREEN}, - { XML_NAMESPACE_MATH, XML_BLUE, TBLUE}, - { XML_NAMESPACE_MATH, XML_AQUA, TAQUA}, - { XML_NAMESPACE_MATH, XML_FUCHSIA, TFUCHSIA}, - { XML_NAMESPACE_MATH, XML_YELLOW, TYELLOW}, - { XML_NAMESPACE_MATH, XML_NAVY, TNAVY}, - { XML_NAMESPACE_MATH, XML_TEAL, TTEAL}, - { XML_NAMESPACE_MATH, XML_MAROON, TMAROON}, - { XML_NAMESPACE_MATH, XML_PURPLE, TPURPLE}, - { XML_NAMESPACE_MATH, XML_OLIVE, TOLIVE}, - { XML_NAMESPACE_MATH, XML_GRAY, TGRAY}, - { XML_NAMESPACE_MATH, XML_SILVER, TSILVER}, - { XML_NAMESPACE_MATH, XML_LIME, TLIME}, - XML_TOKEN_MAP_END -}; - - -const SvXMLTokenMap& SmXMLImport::GetColorTokenMap() -{ - if (!pColorTokenMap) - pColorTokenMap.reset(new SvXMLTokenMap(aColorTokenMap)); - return *pColorTokenMap; -} - uno::Reference< xml::sax::XFastContextHandler > SmXMLDocContext_Impl::createFastChildContext( sal_Int32 nElement, const uno::Reference<xml::sax::XFastAttributeList>& /*xAttrList*/) diff --git a/starmath/source/mathmlimport.hxx b/starmath/source/mathmlimport.hxx index 6789a82b7cc1..2ebaddee9ab7 100644 --- a/starmath/source/mathmlimport.hxx +++ b/starmath/source/mathmlimport.hxx @@ -89,8 +89,6 @@ public: const css::uno::Reference< css::xml::sax::XFastAttributeList >& xAttrList ) override; - const SvXMLTokenMap &GetColorTokenMap(); - SmNodeStack & GetNodeStack() { return aNodeStack; } bool GetSuccess() const { return bSuccess; } diff --git a/starmath/source/node.cxx b/starmath/source/node.cxx index 957c91cb33c6..3c78de3ba5b0 100644 --- a/starmath/source/node.cxx +++ b/starmath/source/node.cxx @@ -26,6 +26,7 @@ #include "mathtype.hxx" #include "tmpdevice.hxx" #include <visitors.hxx> +#include <starmathdatabase.hxx> #include <comphelper/string.hxx> #include <tools/color.hxx> @@ -1626,28 +1627,14 @@ void SmFontNode::Arrange(OutputDevice &rDev, const SmFormat &rFormat) case TNBOLD : ClearAttribut(FontAttribute::Bold); break; case TNITALIC : ClearAttribut(FontAttribute::Italic); break; - case TBLACK : SetColor(COL_BLACK); break; - case TWHITE : SetColor(COL_WHITE); break; - case TRED : SetColor(COL_LIGHTRED); break; - case TGREEN : SetColor(COL_GREEN); break; - case TBLUE : SetColor(COL_LIGHTBLUE); break; - case TCYAN : SetColor(COL_LIGHTCYAN); break; // as in Calc - case TMAGENTA : SetColor(COL_LIGHTMAGENTA); break; // as in Calc - case TYELLOW : SetColor(COL_YELLOW); break; - case TTEAL : SetColor(COL_CYAN); break; - case TSILVER : SetColor(COL_LIGHTGRAY); break; - case TGRAY : SetColor(COL_GRAY); break; - case TMAROON : SetColor(COL_RED); break; - case TPURPLE : SetColor(COL_MAGENTA); break; - case TLIME : SetColor(COL_LIGHTGREEN); break; - case TOLIVE : SetColor(COL_BROWN); break; - case TNAVY : SetColor(COL_BLUE); break; - case TAQUA : SetColor(COL_LIGHTCYAN); break; - case TFUCHSIA : SetColor(COL_LIGHTMAGENTA); break; + // Using HTML CSS Level 1 standard case TRGB : case TRGBA : + case THTMLCOL : + case TDVIPSNAMESCOL: + case TICONICCOL : case THEX : - nc = GetToken().aText.toUInt32(); + nc = GetToken().aText.toUInt32(16); SetColor(Color(nc)); break; diff --git a/starmath/source/parse.cxx b/starmath/source/parse.cxx index 803f97425a6d..86864bd612b2 100644 --- a/starmath/source/parse.cxx +++ b/starmath/source/parse.cxx @@ -35,6 +35,7 @@ #include "cfgitem.hxx" #include <cassert> #include <stack> +#include <starmathdatabase.hxx> using namespace ::com::sun::star::i18n; @@ -261,32 +262,6 @@ const SmTokenTableEntry aTokenTable[] = { "wp" , TWP, MS_WP, TG::Standalone, 5} }; -//Definition of color keywords -const SmTokenTableEntry aColorTokenTable[] = -{ - { "aqua", TAQUA, '\0', TG::Color, 0}, - { "black", TBLACK, '\0', TG::Color, 0}, - { "blue", TBLUE, '\0', TG::Color, 0}, - { "cyan", TCYAN, '\0', TG::Color, 0}, - { "fuchsia", TFUCHSIA, '\0', TG::Color, 0}, - { "gray", TGRAY, '\0', TG::Color, 0}, - { "green", TGREEN, '\0', TG::Color, 0}, - { "hex" , THEX, '\0', TG::Color, 0}, - { "lime", TLIME, '\0', TG::Color, 0}, - { "magenta", TMAGENTA, '\0', TG::Color, 0}, - { "maroon", TMAROON, '\0', TG::Color, 0}, - { "navy", TNAVY, '\0', TG::Color, 0}, - { "olive", TOLIVE, '\0', TG::Color, 0}, - { "purple", TPURPLE, '\0', TG::Color, 0}, - { "red", TRED, '\0', TG::Color, 0}, - { "rgb", TRGB, '\0', TG::Color, 0}, - //{ "rgba", TRGBA, '\0', TG::Color, 0}, - { "silver", TSILVER, '\0', TG::Color, 0}, - { "teal", TTEAL, '\0', TG::Color, 0}, - { "white", TWHITE, '\0', TG::Color, 0}, - { "yellow", TYELLOW, '\0', TG::Color, 0} -}; - // First character may be any alphabetic const sal_Int32 coStartFlags = KParseTokens::ANY_LETTER | KParseTokens::IGNORE_LEADING_WS; @@ -332,18 +307,6 @@ static const SmTokenTableEntry * GetTokenTableEntry( const OUString &rName ) return nullptr; //not found } -//Returns the SmTokenTableEntry for a keyword -static const SmTokenTableEntry * GetColorTokenTableEntry( const OUString &rName ) -{ - if (rName.isEmpty())return nullptr; //avoid null pointer exceptions - //Looks for the first keyword after or equal to rName in alphabetical order. - auto findIter = std::lower_bound( std::begin(aColorTokenTable), - std::end(aColorTokenTable), rName, findCompare ); - if ( findIter != std::end(aColorTokenTable) - && rName.equalsIgnoreAsciiCaseAscii( findIter->pIdent )) - return &*findIter; //check is equal - return nullptr; //not found -} static bool IsDelimiter( const OUString &rTxt, sal_Int32 nPos ) { // returns 'true' iff cChar is '\0' or a delimiter @@ -1044,16 +1007,21 @@ void SmParser::NextTokenColor() sal_Int32 n = aRes.EndPos - nRealStart; assert(n >= 0); OUString aName( m_aBufferString.copy( nRealStart, n ) ); - const SmTokenTableEntry *pEntry = GetColorTokenTableEntry( aName ); - if (pEntry) + std::unique_ptr<SmColorTokenTableEntry> aSmColorTokenTableEntry; + aSmColorTokenTableEntry = starmathdatabase::Identify_ColorName_Parser( aName ); + if ( aSmColorTokenTableEntry ) m_aCurToken = aSmColorTokenTableEntry; + else m_aCurToken.eType = TNONE; + } + else if (aRes.TokenType & KParseType::ONE_SINGLE_CHAR) + { + if( m_aBufferString[ nRealStart ] == '#' && !m_aBufferString.match("##", nRealStart) ) { - m_aCurToken.eType = pEntry->eType; - m_aCurToken.cMathChar = pEntry->cMathChar; - m_aCurToken.nGroup = pEntry->nGroup; - m_aCurToken.nLevel = pEntry->nLevel; - m_aCurToken.aText = OUString::createFromAscii( pEntry->pIdent ); + m_aCurToken.eType = THEX; + m_aCurToken.cMathChar = '\0'; + m_aCurToken.nGroup = TG::Color; + m_aCurToken.nLevel = 0; + m_aCurToken.aText = "hex"; } - else m_aCurToken.eType = TNONE; } else m_aCurToken.eType = TNONE; if (TEND != m_aCurToken.eType) m_nBufferIndex = aRes.EndPos; @@ -2142,7 +2110,7 @@ std::unique_ptr<SmStructureNode> SmParser::DoColor() nb = m_aCurToken.aText.toUInt32(); if( nb > 255 )return DoError(SmParseError::ColorExpected); nc = nb | ng << 8 | nr << 16 | sal_uInt32(0) << 24; - aToken.aText = OUString::number(nc); + aToken.aText = OUString::number(nc, 16); } else if( m_aCurToken.eType == TRGBA ) //loads r, g and b { @@ -2168,7 +2136,7 @@ std::unique_ptr<SmStructureNode> SmParser::DoColor() na = m_aCurToken.aText.toUInt32(); if( na > 255 )return DoError(SmParseError::ColorExpected); nc = nb | ng << 8 | nr << 16 | na << 24; - aToken.aText = OUString::number(nc); + aToken.aText = OUString::number(nc, 16); } else if( m_aCurToken.eType == THEX ) //loads hex code { @@ -2177,7 +2145,7 @@ std::unique_ptr<SmStructureNode> SmParser::DoColor() if( lcl_IsNotWholeNumber16(m_aCurToken.aText) ) return DoError(SmParseError::ColorExpected); nc = m_aCurToken.aText.toUInt32(16); - aToken.aText = OUString::number(nc); + aToken.aText = OUString::number(nc, 16); } NextToken(); } diff --git a/starmath/source/starmathdatabase.cxx b/starmath/source/starmathdatabase.cxx index 9b1dd659bef5..ecab361f73c0 100644 --- a/starmath/source/starmathdatabase.cxx +++ b/starmath/source/starmathdatabase.cxx @@ -356,3 +356,142 @@ SmToken starmathdatabase::Identify_PrefixPostfix_SmXMLOperatorContext_Impl(sal_U return SmToken(TERROR, MS_NONE, "", TG::NONE, SAL_MAX_UINT16); } } + +const SmColorTokenTableEntry starmathdatabase::aColorTokenTableParse[] + = { { "apricot", "Apricot", TDVIPSNAMESCOL, COL_SM_DIV_APRICOT }, + { "aqua", "aqua", THTMLCOL, COL_SM_AQUA }, + { "aquamarine", "Aquamarine", TDVIPSNAMESCOL, COL_SM_DIV_AQUAMARINE }, + { "bittersweet", "Bittersweet", TDVIPSNAMESCOL, COL_SM_DIV_BITTERSWEET }, + { "black", "black", THTMLCOL, COL_SM_BLACK }, + { "blue", "blue", THTMLCOL, COL_SM_BLUE }, + { "cyan", "cyan", THTMLCOL, COL_SM_BLACK }, + { "debian", "", TICONICCOL, COL_SM_DEBIAN_MAGENTA }, + { "dblack", "Black", TDVIPSNAMESCOL, COL_SM_BLACK }, + { "dblue", "Blue", TDVIPSNAMESCOL, COL_SM_BLACK }, + { "fuchsia", "fuchsia", THTMLCOL, COL_SM_FUCHSIA }, + { "gray", "gray", THTMLCOL, COL_SM_GRAY }, + { "green", "green", THTMLCOL, COL_SM_GREEN }, + { "hex", "hex", THEX, COL_SM_BLACK }, + { "lime", "lime", THTMLCOL, COL_SM_LIME }, + { "lo", "", TICONICCOL, COL_SM_LO_GREEN }, + { "magenta", "magenta", THTMLCOL, COL_SM_FUCHSIA }, + { "maroon", "maroon", THTMLCOL, COL_SM_MAROON }, + { "navy", "navy", THTMLCOL, COL_SM_NAVY }, + { "olive", "olive", THTMLCOL, COL_SM_OLIVE }, + { "purple", "purple", THTMLCOL, COL_SM_PURPLE }, + { "rebeccapurple", "rebeccapurple", THTMLCOL, COL_SM_REBECCAPURPLE }, + { "red", "red", THTMLCOL, COL_SM_RED }, + { "rgb", "rgb", TRGB, COL_AUTO }, + { "rgba", "rgba", TRGBA, COL_AUTO }, + { "silver", "silver", THTMLCOL, COL_SM_SILVER }, + { "teal", "teal", THTMLCOL, COL_SM_TEAL }, + { "ubuntu", "", TICONICCOL, COL_SM_UBUNTU_ORANGE }, + { "white", "white", THTMLCOL, COL_SM_WHITE }, + { "yellow", "yellow", THTMLCOL, COL_SM_YELLOW } }; + +const SmColorTokenTableEntry starmathdatabase::aColorTokenTableHTML[] + = { { "aqua", "aqua", THTMLCOL, COL_SM_AQUA }, + { "black", "black", THTMLCOL, COL_SM_BLACK }, + { "blue", "blue", THTMLCOL, COL_SM_BLUE }, + { "cyan", "cyan", THTMLCOL, COL_SM_BLACK }, + { "fuchsia", "fuchsia", THTMLCOL, COL_SM_FUCHSIA }, + { "gray", "gray", THTMLCOL, COL_SM_GRAY }, + { "green", "green", THTMLCOL, COL_SM_GREEN }, + { "hex", "hex", THEX, COL_SM_BLACK }, + { "lime", "lime", THTMLCOL, COL_SM_LIME }, + { "magenta", "magenta", THTMLCOL, COL_SM_FUCHSIA }, + { "maroon", "maroon", THTMLCOL, COL_SM_MAROON }, + { "navy", "navy", THTMLCOL, COL_SM_NAVY }, + { "olive", "olive", THTMLCOL, COL_SM_OLIVE }, + { "purple", "purple", THTMLCOL, COL_SM_PURPLE }, + { "rebeccapurple", "rebeccapurple", THTMLCOL, COL_SM_REBECCAPURPLE }, + { "red", "red", THTMLCOL, COL_SM_RED }, + { "silver", "silver", THTMLCOL, COL_SM_SILVER }, + { "teal", "teal", THTMLCOL, COL_SM_TEAL }, + { "white", "white", THTMLCOL, COL_SM_WHITE }, + { "yellow", "yellow", THTMLCOL, COL_SM_YELLOW } }; + +const SmColorTokenTableEntry starmathdatabase::aColorTokenTableDVIPSNAMES[] = { + { "apricot", "Apricot", TDVIPSNAMESCOL, COL_SM_DIV_APRICOT }, + { "aquamarine", "Aquamarine", TDVIPSNAMESCOL, COL_SM_DIV_AQUAMARINE }, + { "bittersweet", "Bittersweet", TDVIPSNAMESCOL, COL_SM_DIV_BITTERSWEET }, + { "dblack", "Black", TDVIPSNAMESCOL, COL_SM_BLACK }, + { "dblue", "Blue", TDVIPSNAMESCOL, COL_SM_BLACK }, +}; + +std::unique_ptr<SmColorTokenTableEntry> starmathdatabase::Identify_Color_Parser(sal_uInt32 cColor) +{ + for (auto i = std::begin(aColorTokenTableParse); i < std::end(aColorTokenTableParse); ++i) + if (i->equals(cColor)) + return std::unique_ptr<SmColorTokenTableEntry>(new SmColorTokenTableEntry(i)); + if ((cColor & 0x00FFFFFF) == cColor) + return std::unique_ptr<SmColorTokenTableEntry>( + new SmColorTokenTableEntry("", "", TRGB, cColor)); + else + return std::unique_ptr<SmColorTokenTableEntry>( + new SmColorTokenTableEntry("", "", TRGBA, cColor)); +} + +std::unique_ptr<SmColorTokenTableEntry> starmathdatabase::Identify_Color_HTML(sal_uInt32 cColor) +{ + for (auto i = std::begin(aColorTokenTableHTML); i < std::end(aColorTokenTableHTML); ++i) + if (i->equals(cColor)) + return std::unique_ptr<SmColorTokenTableEntry>(new SmColorTokenTableEntry(i)); + if ((cColor & 0x00FFFFFF) == cColor) + return std::unique_ptr<SmColorTokenTableEntry>( + new SmColorTokenTableEntry("", "", TRGB, cColor)); + else + return std::unique_ptr<SmColorTokenTableEntry>( + new SmColorTokenTableEntry("", "", TRGBA, cColor)); +} + +std::unique_ptr<SmColorTokenTableEntry> +starmathdatabase::Identify_Color_DVIPSNAMES(sal_uInt32 cColor) +{ + for (auto i = std::begin(aColorTokenTableDVIPSNAMES); i < std::end(aColorTokenTableDVIPSNAMES); + ++i) + if (i->equals(cColor)) + return std::unique_ptr<SmColorTokenTableEntry>(new SmColorTokenTableEntry(i)); + if ((cColor & 0x00FFFFFF) == cColor) + return std::unique_ptr<SmColorTokenTableEntry>( + new SmColorTokenTableEntry("", "", TRGB, cColor)); + else + return std::unique_ptr<SmColorTokenTableEntry>( + new SmColorTokenTableEntry("", "", TRGBA, cColor)); +} + +std::unique_ptr<SmColorTokenTableEntry> +starmathdatabase::Identify_ColorName_Parser(const OUString& colorname) +{ + if (colorname.isEmpty()) + return nullptr; + for (auto i = std::begin(aColorTokenTableParse); i < std::end(aColorTokenTableParse); ++i) + if (i->equals(colorname)) + return std::unique_ptr<SmColorTokenTableEntry>(new SmColorTokenTableEntry(i)); + return nullptr; +} + +std::unique_ptr<SmColorTokenTableEntry> +starmathdatabase::Identify_ColorName_HTML(const OUString& colorname) +{ + if (colorname.isEmpty()) + return nullptr; + for (auto i = std::begin(aColorTokenTableParse); i < std::end(aColorTokenTableParse); ++i) + if (i->equals(colorname)) + return std::unique_ptr<SmColorTokenTableEntry>(new SmColorTokenTableEntry(i)); + if (colorname[0] == '#' && colorname.getLength() == 7) + return std::unique_ptr<SmColorTokenTableEntry>( + new SmColorTokenTableEntry("", "", TRGB, colorname.copy(1, 6).toUInt32(16))); + return nullptr; +} + +std::unique_ptr<SmColorTokenTableEntry> +starmathdatabase::Identify_ColorName_DVIPSNAMES(const OUString& colorname) +{ + if (colorname.isEmpty()) + return nullptr; + for (auto i = std::begin(aColorTokenTableParse); i < std::end(aColorTokenTableParse); ++i) + if (i->equals(colorname)) + return std::unique_ptr<SmColorTokenTableEntry>(new SmColorTokenTableEntry(i)); + return nullptr; +} diff --git a/starmath/source/visitors.cxx b/starmath/source/visitors.cxx index 08f9d33e024f..924690282e42 100644 --- a/starmath/source/visitors.cxx +++ b/starmath/source/visitors.cxx @@ -16,6 +16,7 @@ #include <cursor.hxx> #include <cassert> #include "mathtype.hxx" +#include <starmathdatabase.hxx> // SmDefaultingVisitor @@ -2088,6 +2089,7 @@ void SmNodeToTextVisitor::Visit( SmFontNode* pNode ) { sal_uInt32 nc; sal_uInt8 nr, ng, nb; + std::unique_ptr<SmColorTokenTableEntry> aSmColorTokenTableEntry; switch ( pNode->GetToken( ).eType ) { case TBOLD: @@ -2133,63 +2135,23 @@ void SmNodeToTextVisitor::Visit( SmFontNode* pNode ) Separate( ); } break; - case TBLACK: - Append( "color black " ); - break; - case TWHITE: - Append( "color white " ); - break; - case TRED: - Append( "color red " ); - break; - case TGREEN: - Append( "color green " ); - break; - case TBLUE: - Append( "color blue " ); - break; - case TCYAN: - Append( "color cyan " ); - break; - case TMAGENTA: - Append( "color magenta " ); - break; - case TYELLOW: - Append( "color yellow " ); - break; - case TGRAY: - Append( "color gray " ); - break; - case TLIME: - Append( "color lime " ); - break; - case TMAROON: - Append( "color maroon " ); - break; - case TNAVY: - Append( "color navy " ); - break; - case TOLIVE: - Append( "color olive " ); - break; - case TPURPLE: - Append( "color purple " ); - break; - case TSILVER: - Append( "color silver " ); - break; - case TTEAL: - Append( "color teal " ); - break; - case TAQUA: - Append( "color aqua " ); - break; - case TFUCHSIA: - Append("color fuchsia "); + case THTMLCOL: + case TDVIPSNAMESCOL: + case TICONICCOL: + nc = pNode->GetToken().aText.toUInt32(16); + Append( "color " ); + aSmColorTokenTableEntry = starmathdatabase::Identify_Color_Parser( nc ); + Append( aSmColorTokenTableEntry->pIdent ); break; case TRGB: + nc = pNode->GetToken().aText.toUInt32(16); + aSmColorTokenTableEntry = starmathdatabase::Identify_Color_Parser( nc ); + if ( aSmColorTokenTableEntry ) { + Append( "color " ); + Append( aSmColorTokenTableEntry->pIdent ); + break; + } Append( "color rgb " ); - nc = pNode->GetToken().aText.toUInt32(); nb = nc % 256; nc /= 256; ng = nc % 256; @@ -2203,8 +2165,15 @@ void SmNodeToTextVisitor::Visit( SmFontNode* pNode ) Separate(); break; case TRGBA: + nc = pNode->GetToken().aText.toUInt32(16); + aSmColorTokenTableEntry = starmathdatabase::Identify_Color_Parser( nc ); + if ( aSmColorTokenTableEntry ) { + Append( "color " ); + Append( aSmColorTokenTableEntry->pIdent ); + break; + } Append( "color rgba " ); - nc = pNode->GetToken().aText.toUInt32(); + nc = pNode->GetToken().aText.toUInt32(16); nb = nc % 256; nc /= 256; ng = nc % 256; @@ -2221,8 +2190,15 @@ void SmNodeToTextVisitor::Visit( SmFontNode* pNode ) Separate(); break; case THEX: + nc = pNode->GetToken().aText.toUInt32(16); + aSmColorTokenTableEntry = starmathdatabase::Identify_Color_Parser( nc ); + if ( aSmColorTokenTableEntry ) { + Append( "color " ); + Append( aSmColorTokenTableEntry->pIdent ); + break; + } Append( "color hex " ); - nc = pNode->GetToken().aText.toUInt32(); + nc = pNode->GetToken().aText.toUInt32(16); Append(OUString::number(nc,16)); Separate(); break; |