kpimtextedit/richtextbuilders
kplaintextmarkupbuilder.cpp
00001 /* 00002 This file is part of KDE. 00003 00004 Copyright (c) 2008 Stephen Kelly <steveire@gmail.com> 00005 00006 This library is free software; you can redistribute it and/or modify it 00007 under the terms of the GNU Library General Public License as published by 00008 the Free Software Foundation; either version 2 of the License, or (at your 00009 option) any later version. 00010 00011 This library is distributed in the hope that it will be useful, but WITHOUT 00012 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 00013 FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public 00014 License for more details. 00015 00016 You should have received a copy of the GNU Library General Public License 00017 along with this library; see the file COPYING.LIB. If not, write to the 00018 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 00019 02110-1301, USA. 00020 */ 00021 00022 #include "kplaintextmarkupbuilder.h" 00023 00024 #include <KLocale> 00025 00026 class KPlainTextMarkupBuilderPrivate 00027 { 00028 public: 00029 KPlainTextMarkupBuilderPrivate(KPlainTextMarkupBuilder *b) : q_ptr(b) { 00030 00031 } 00032 00041 QString getLetterString(int itemNumber); 00042 00047 QString getReferences(); 00048 00049 QStringList m_urls; 00050 QList<QTextListFormat::Style> currentListItemStyles; 00051 QList<int> currentListItemNumbers; 00052 00053 QString activeLink; 00054 00055 QString m_text; 00056 00057 KPlainTextMarkupBuilder *q_ptr; 00058 00059 Q_DECLARE_PUBLIC(KPlainTextMarkupBuilder) 00060 00061 }; 00062 00063 QString KPlainTextMarkupBuilderPrivate::getLetterString(int itemNumber) 00064 { 00065 QString letterString; 00066 while (true) { 00067 // Create the letter string by prepending one char at a time. 00068 // The itemNumber is converted to a number in the base 36 (number of letters in the 00069 // alphabet plus 10) after being increased by 10 (to pass out the digits 0 to 9). 00070 letterString.prepend(QString("%1").arg((itemNumber % LETTERSINALPHABET) + DIGITSOFFSET, 00071 0, // no padding while building this string. 00072 LETTERSINALPHABET + DIGITSOFFSET)); 00073 if ((itemNumber >= LETTERSINALPHABET)) { 00074 itemNumber = itemNumber / LETTERSINALPHABET; 00075 itemNumber--; 00076 } else { 00077 break; 00078 } 00079 } 00080 return letterString; 00081 } 00082 00083 QString KPlainTextMarkupBuilderPrivate::getReferences() 00084 { 00085 QString refs; 00086 if (!m_urls.isEmpty()) { 00087 refs.append(i18nc("Beginning of the references section, which lists all external references", 00088 "\n---- References ----\n")); 00089 00090 int index = 1; 00091 while (!m_urls.isEmpty()) { 00092 refs.append(QString("[%1] %2\n").arg(index++).arg(m_urls.takeFirst())); 00093 } 00094 } 00095 return refs; 00096 } 00097 00098 KPlainTextMarkupBuilder::KPlainTextMarkupBuilder() : d_ptr(new KPlainTextMarkupBuilderPrivate(this)) 00099 { 00100 Q_D(KPlainTextMarkupBuilder); 00101 d->m_urls = QStringList(); 00102 } 00103 00104 void KPlainTextMarkupBuilder::beginStrong() 00105 { 00106 Q_D(KPlainTextMarkupBuilder); 00107 d->m_text.append("*"); 00108 } 00109 void KPlainTextMarkupBuilder::endStrong() 00110 { 00111 Q_D(KPlainTextMarkupBuilder); 00112 d->m_text.append("*"); 00113 } 00114 void KPlainTextMarkupBuilder::beginEmph() 00115 { 00116 Q_D(KPlainTextMarkupBuilder); 00117 d->m_text.append("/"); 00118 } 00119 void KPlainTextMarkupBuilder::endEmph() 00120 { 00121 Q_D(KPlainTextMarkupBuilder); 00122 d->m_text.append("/"); 00123 } 00124 void KPlainTextMarkupBuilder::beginUnderline() 00125 { 00126 Q_D(KPlainTextMarkupBuilder); 00127 d->m_text.append("_"); 00128 } 00129 void KPlainTextMarkupBuilder::endUnderline() 00130 { 00131 Q_D(KPlainTextMarkupBuilder); 00132 d->m_text.append("_"); 00133 } 00134 void KPlainTextMarkupBuilder::beginStrikeout() 00135 { 00136 Q_D(KPlainTextMarkupBuilder); 00137 d->m_text.append("-"); 00138 } 00139 void KPlainTextMarkupBuilder::endStrikeout() 00140 { 00141 Q_D(KPlainTextMarkupBuilder); 00142 d->m_text.append("-"); 00143 } 00144 00145 void KPlainTextMarkupBuilder::beginAnchor(const QString &href, const QString &name) 00146 { 00147 Q_D(KPlainTextMarkupBuilder); 00148 Q_UNUSED(name); 00149 if (!d->m_urls.contains(href)) { 00150 00151 d->m_urls.append(href); 00152 } 00153 d->activeLink = href; 00154 } 00155 00156 void KPlainTextMarkupBuilder::endAnchor() 00157 { 00158 Q_D(KPlainTextMarkupBuilder); 00159 d->m_text.append(QString("[%1]").arg(d->m_urls.indexOf(d->activeLink) + 1)); 00160 } 00161 00162 void KPlainTextMarkupBuilder::endParagraph() 00163 { 00164 Q_D(KPlainTextMarkupBuilder); 00165 d->m_text.append("\n"); 00166 } 00167 00168 void KPlainTextMarkupBuilder::addNewline() 00169 { 00170 Q_D(KPlainTextMarkupBuilder); 00171 d->m_text.append("\n"); 00172 } 00173 00174 void KPlainTextMarkupBuilder::insertHorizontalRule(int width) 00175 { 00176 Q_UNUSED(width) 00177 Q_D(KPlainTextMarkupBuilder); 00178 00179 d->m_text.append("--------------------\n"); 00180 } 00181 00182 void KPlainTextMarkupBuilder::insertImage(const QString &src, qreal width, qreal height) 00183 { 00184 Q_D(KPlainTextMarkupBuilder); 00185 Q_UNUSED(width) 00186 Q_UNUSED(height) 00187 00188 if (!d->m_urls.contains(src)) { 00189 d->m_urls.append(src); 00190 } 00191 d->m_text.append(QString("[%1]").arg(d->m_urls.indexOf(src) + 1)); 00192 } 00193 00194 00195 void KPlainTextMarkupBuilder::beginList(QTextListFormat::Style style) 00196 { 00197 Q_D(KPlainTextMarkupBuilder); 00198 d->currentListItemStyles.append(style); 00199 d->currentListItemNumbers.append(0); 00200 } 00201 00202 void KPlainTextMarkupBuilder::endList() 00203 { 00204 Q_D(KPlainTextMarkupBuilder); 00205 if (!d->currentListItemNumbers.isEmpty()) { 00206 d->currentListItemStyles.removeLast(); 00207 d->currentListItemNumbers.removeLast(); 00208 } 00209 } 00210 void KPlainTextMarkupBuilder::beginListItem() 00211 { 00212 Q_D(KPlainTextMarkupBuilder); 00213 for (int i = 0; i < d->currentListItemNumbers.size(); i++) { 00214 d->m_text.append(" "); 00215 } 00216 00217 int itemNumber = d->currentListItemNumbers.last(); 00218 QString letterString; 00219 00220 switch (d->currentListItemStyles.last()) { 00221 case QTextListFormat::ListDisc: 00222 d->m_text.append(" * "); 00223 break; 00224 case QTextListFormat::ListCircle: 00225 d->m_text.append(" o "); 00226 break; 00227 case QTextListFormat::ListSquare: 00228 d->m_text.append(" - "); 00229 break; 00230 case QTextListFormat::ListDecimal: 00231 d->m_text.append(QString(" %1. ").arg(itemNumber + 1)); 00232 break; 00233 case QTextListFormat::ListLowerAlpha: 00234 d->m_text.append(QString(" %1. ").arg(d->getLetterString(itemNumber))); 00235 break; 00236 case QTextListFormat::ListUpperAlpha: 00237 d->m_text.append(QString(" %1. ").arg(d->getLetterString(itemNumber).toUpper())); 00238 break; 00239 default: 00240 break; 00241 } 00242 } 00243 00244 void KPlainTextMarkupBuilder::endListItem() 00245 { 00246 Q_D(KPlainTextMarkupBuilder); 00247 d->currentListItemNumbers.last() = d->currentListItemNumbers.last() + 1; 00248 } 00249 00250 00251 void KPlainTextMarkupBuilder::beginSuperscript() 00252 { 00253 Q_D(KPlainTextMarkupBuilder); 00254 d->m_text.append("^{"); 00255 } 00256 00257 void KPlainTextMarkupBuilder::endSuperscript() 00258 { 00259 Q_D(KPlainTextMarkupBuilder); 00260 d->m_text.append("}"); 00261 } 00262 00263 void KPlainTextMarkupBuilder::beginSubscript() 00264 { 00265 Q_D(KPlainTextMarkupBuilder); 00266 d->m_text.append("_{"); 00267 } 00268 00269 void KPlainTextMarkupBuilder::endSubscript() 00270 { 00271 Q_D(KPlainTextMarkupBuilder); 00272 d->m_text.append("}"); 00273 } 00274 00275 void KPlainTextMarkupBuilder::appendLiteralText(const QString &text) 00276 { 00277 Q_D(KPlainTextMarkupBuilder); 00278 d->m_text.append(text); 00279 } 00280 00281 QString& KPlainTextMarkupBuilder::getResult() 00282 { 00283 Q_D(KPlainTextMarkupBuilder); 00284 QString &ret = d->m_text; 00285 ret.append(d->getReferences()); 00286 return ret; 00287 } 00288