diff --git a/code/nel/include/nel/gui/group_html.h b/code/nel/include/nel/gui/group_html.h index 314e07548..66f896970 100644 --- a/code/nel/include/nel/gui/group_html.h +++ b/code/nel/include/nel/gui/group_html.h @@ -438,25 +438,20 @@ namespace NLGUI return _PRE.back(); } - // UL mode - std::vector _UL; - inline bool getUL() const - { - if (_UL.empty()) - return false; - return _UL.back(); - } - // DL list - std::vector _DL; - inline bool getDL() const - { - if (_DL.empty()) - return false; - return _DL.back(); - } + class HTMLDListElement { + public: + HTMLDListElement() + : DT(false), DD(false) + { } - // OL + public: + bool DT; + bool DD; + }; + std::vector _DL; + + // OL and UL class HTMLOListElement { public: HTMLOListElement(int start, std::string type) @@ -469,7 +464,7 @@ namespace NLGUI std::string Type; bool First; }; - std::vector _OL; + std::vector _UL; // A mode std::vector _A; @@ -482,7 +477,6 @@ namespace NLGUI // IL mode bool _LI; - bool _DT; // Current text color std::vector _TextColor; diff --git a/code/nel/src/gui/group_html.cpp b/code/nel/src/gui/group_html.cpp index 1693cb08a..b4cadc3f4 100644 --- a/code/nel/src/gui/group_html.cpp +++ b/code/nel/src/gui/group_html.cpp @@ -1709,9 +1709,9 @@ namespace NLGUI _SelectOption = true; break; case HTML_LI: - if (getUL()) + if (!_UL.empty()) { - // First LI ? + // UL, OL top margin if this is the first LI if (!_LI) { _LI = true; @@ -1721,35 +1721,24 @@ namespace NLGUI { newParagraph(LIBeginSpace); } - ucstring str; - str += (ucchar)0x2219; - str += (ucchar)' '; - addString (str); - flushString (); - getParagraph()->setFirstViewIndent(LIIndent); - } - else if (!_OL.empty()) - { - if (_OL.back().First) - { - _OL.back().First = false; - newParagraph(ULBeginSpace); - } - else - { - newParagraph(LIBeginSpace); - } // OL list index can be overridden by
  • attribute if (present[HTML_LI_VALUE] && value[HTML_LI_VALUE]) - fromString(value[HTML_LI_VALUE], _OL.back().Value); + fromString(value[HTML_LI_VALUE], _UL.back().Value); ucstring str; - str.fromUtf8(_OL.back().getListMarkerText() + ". "); - addString(str); - flushString(); - getParagraph()->setFirstViewIndent(LIIndent); - _OL.back().Value++; + str.fromUtf8(_UL.back().getListMarkerText()); + addString (str); + + sint32 indent = LIIndent; + // list-style-type: outside + if (_CurrentViewLink) + indent -= _CurrentViewLink->getMaxUsedW(); + getParagraph()->setFirstViewIndent(indent); + + flushString (); + + _UL.back().Value++; } break; case HTML_P: @@ -1934,10 +1923,16 @@ namespace NLGUI } break; case HTML_UL: + if (_UL.empty()) + _UL.push_back(HTMLOListElement(1, "disc")); + else if (_UL.size() == 1) + _UL.push_back(HTMLOListElement(1, "circle")); + else + _UL.push_back(HTMLOListElement(1, "square")); + // if LI is already present + _LI = _UL.size() > 1 || _DL.size() > 1; _Indent += ULIndent; - _LI = false; endParagraph(); - _UL.push_back(true); break; case HTML_OBJECT: _ObjectType = ""; @@ -1996,42 +1991,56 @@ namespace NLGUI _IgnoreText = true; break; case HTML_DL: - _DL.push_back(true); + _DL.push_back(HTMLDListElement()); + _LI = _DL.size() > 1 || !_UL.empty(); endParagraph(); break; case HTML_DT: - if (getDL()) + if (!_DL.empty()) { - newParagraph(0); - // see if this is the first
    , closing tag not required - if (!_DT) + if (!_DL.back().DT) { - _DT = true; + _DL.back().DT = true; _FontWeight.push_back(FONT_WEIGHT_BOLD); } - if (_DL.size() > 1) + if (!_LI) { - uint indent = (_DL.size()-1) * ULIndent; - getParagraph()->setFirstViewIndent(indent); + _LI = true; + newParagraph(ULBeginSpace); + } + else + { + newParagraph(LIBeginSpace); } } break; case HTML_DD: - if (getDL()) + if (!_DL.empty()) { - newParagraph(0); - // if there was no closing tag for
    , then remove
    style - if (_DT) + if (_DL.back().DT) { - _DT = false; + _DL.back().DT = false; popIfNotEmpty (_FontWeight); } - uint indent = _DL.size()*ULIndent; - getParagraph()->setFirstViewIndent(indent); + if (!_DL.back().DD) + { + _Indent += ULIndent; + _DL.back().DD = true; + } + + if (!_LI) + { + _LI = true; + newParagraph(ULBeginSpace); + } + else + { + newParagraph(LIBeginSpace); + } } break; case HTML_OL: @@ -2044,7 +2053,9 @@ namespace NLGUI if (present[HTML_OL_TYPE] && value[HTML_OL_TYPE]) type = value[HTML_OL_TYPE]; - _OL.push_back(HTMLOListElement(start, type)); + _UL.push_back(HTMLOListElement(start, type)); + // if LI is already present + _LI = _UL.size() > 1 || _DL.size() > 1; _Indent += ULIndent; endParagraph(); } @@ -2218,46 +2229,58 @@ namespace NLGUI } break; case HTML_OL: - if (!_OL.empty()) - { - _Indent -= ULIndent; - _Indent = std::max(_Indent, (uint)0); - endParagraph(); - popIfNotEmpty(_OL); - } - break; case HTML_UL: - if (getUL()) + if (!_UL.empty()) { - _Indent -= ULIndent; - _Indent = std::max(_Indent, (uint)0); + if (_Indent > ULIndent) + _Indent = _Indent - ULIndent; + else + _Indent = 0; + endParagraph(); - popIfNotEmpty (_UL); + popIfNotEmpty(_UL); } break; case HTML_DL: - if (getDL()) + if (!_DL.empty()) { endParagraph(); - popIfNotEmpty (_DL); - if (_DT) { - _DT = false; + + // unclosed DT + if (_DL.back().DT) + { popIfNotEmpty (_FontWeight); } + + // unclosed DD + if (_DL.back().DD) + { + if (_Indent > ULIndent) + _Indent = _Indent - ULIndent; + else + _Indent = 0; + } + + popIfNotEmpty (_DL); } break; case HTML_DT: - if (getDL()) + if (!_DL.empty()) { - if (_DT) - { - _DT = false; - popIfNotEmpty (_FontWeight); - } + _DL.back().DT = false; + popIfNotEmpty (_FontWeight); } break; case HTML_DD: - // style not changed + if (!_DL.empty()) + { + if (_Indent > ULIndent) + _Indent = _Indent - ULIndent; + else + _Indent = 0; + + _DL.back().DD = false; + } break; case HTML_SPAN: popIfNotEmpty (_FontSize); @@ -2368,7 +2391,6 @@ namespace NLGUI _CurrentViewImage = NULL; _Indent = 0; _LI = false; - _DT = false; _SelectOption = false; _GroupListAdaptor = NULL; _UrlFragment.clear(); @@ -4047,10 +4069,8 @@ namespace NLGUI _FontStrikeThrough.clear(); _Indent = 0; _LI = false; - _DT = false; _UL.clear(); _DL.clear(); - _OL.clear(); _A.clear(); _Link.clear(); _LinkTitle.clear(); @@ -5527,7 +5547,22 @@ namespace NLGUI sint32 number = Value; bool upper = false; - if (Type == "a" || Type == "A") + if (Type == "disc") + { + // (ucchar)0x2219; + ret = "\xe2\x88\x99 "; + } + else if (Type == "circle") + { + // (uchar)0x26AA; + ret = "\xe2\x9a\xaa "; + } + else if (Type == "square") + { + // (ucchar)0x25AA; + ret = "\xe2\x96\xaa "; + } + else if (Type == "a" || Type == "A") { // @see toAlphabeticOrNumeric in WebKit static const char lower[26] = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', @@ -5549,6 +5584,7 @@ namespace NLGUI number /= size; } } + ret += ". "; } else if (Type == "i" || Type == "I") { @@ -5592,10 +5628,11 @@ namespace NLGUI ret = toUpper(ret); } } + ret += ". "; } else { - ret = toString(Value); + ret = toString(Value) + ". "; } return ret;