/**************************************************************************** ** ** Copyright (C) 2019 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the tools applications of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:GPL-EXCEPT$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see https://www.qt.io/terms-conditions. For further ** information use the contact form at https://www.qt.io/contact-us. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3 as published by the Free Software ** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT ** included in the packaging of this file. Please review the following ** information to ensure the GNU General Public License requirements will ** be met: https://www.gnu.org/licenses/gpl-3.0.html. ** ** $QT_END_LICENSE$ ** ****************************************************************************/ /* openedlist.cpp */ #include "openedlist.h" #include "atom.h" #include QT_BEGIN_NAMESPACE static const char roman[] = "m\2d\5c\2l\5x\2v\5i"; OpenedList::OpenedList(ListStyle style) : sty(style), ini(1), nex(0) { } OpenedList::OpenedList(const Location &location, const QString &hint) : sty(Bullet), ini(1) { QRegExp hintSyntax("(\\W*)([0-9]+|[A-Z]+|[a-z]+)(\\W*)"); if (hintSyntax.exactMatch(hint)) { bool ok; int asNumeric = hint.toInt(&ok); int asRoman = fromRoman(hintSyntax.cap(2)); int asAlpha = fromAlpha(hintSyntax.cap(2)); if (ok) { sty = Numeric; ini = asNumeric; } else if (asRoman > 0 && asRoman != 100 && asRoman != 500) { sty = (hint == hint.toLower()) ? LowerRoman : UpperRoman; ini = asRoman; } else { sty = (hint == hint.toLower()) ? LowerAlpha : UpperAlpha; ini = asAlpha; } pref = hintSyntax.cap(1); suff = hintSyntax.cap(3); } else if (!hint.isEmpty()) { location.warning(tr("Unrecognized list style '%1'").arg(hint)); } nex = ini - 1; } QString OpenedList::styleString() const { switch (style()) { case Bullet: default: return ATOM_LIST_BULLET; case Tag: return ATOM_LIST_TAG; case Value: return ATOM_LIST_VALUE; case Numeric: return ATOM_LIST_NUMERIC; case UpperAlpha: return ATOM_LIST_UPPERALPHA; case LowerAlpha: return ATOM_LIST_LOWERALPHA; case UpperRoman: return ATOM_LIST_UPPERROMAN; case LowerRoman: return ATOM_LIST_LOWERROMAN; } } QString OpenedList::numberString() const { return QString::number(number()); /* switch ( style() ) { case Numeric: return QString::number( number() ); case UpperAlpha: return toAlpha( number() ).toUpper(); case LowerAlpha: return toAlpha( number() ); case UpperRoman: return toRoman( number() ).toUpper(); case LowerRoman: return toRoman( number() ); case Bullet: default: return "*"; }*/ } QString OpenedList::toAlpha(int n) { QString str; while (n > 0) { n--; str.prepend((n % 26) + 'a'); n /= 26; } return str; } int OpenedList::fromAlpha(const QString &str) { int n = 0; int u; for (int i = 0; i < str.length(); i++) { u = str[i].toLower().unicode(); if (u >= 'a' && u <= 'z') { n *= 26; n += u - 'a' + 1; } else { return 0; } } return n; } QString OpenedList::toRoman(int n) { /* See p. 30 of Donald E. Knuth's "TeX: The Program". */ QString str; int j = 0; int k; int u; int v = 1000; for (;;) { while (n >= v) { str += roman[j]; n -= v; } if (n <= 0) break; k = j + 2; u = v / roman[k - 1]; if (roman[k - 1] == 2) { k += 2; u /= 5; } if (n + u >= v) { str += roman[k]; n += u; } else { j += 2; v /= roman[j - 1]; } } return str; } int OpenedList::fromRoman(const QString &str) { int n = 0; int j; int u; int v = 0; for (int i = str.length() - 1; i >= 0; i--) { j = 0; u = 1000; while (roman[j] != 'i' && roman[j] != str[i].toLower()) { j += 2; u /= roman[j - 1]; } if (u < v) { n -= u; } else { n += u; } v = u; } if (str.toLower() == toRoman(n)) { return n; } else { return 0; } } QT_END_NAMESPACE