File indexing completed on 2024-06-09 04:53:08

0001 /*
0002     SPDX-FileCopyrightText: 2007-2009 Sergio Pistone <sergio_pistone@yahoo.com.ar>
0003     SPDX-FileCopyrightText: 2010-2022 Mladen Milinkovic <max@smoothware.net>
0004 
0005     SPDX-License-Identifier: GPL-2.0-or-later
0006 */
0007 
0008 #include "scripting_richstring.h"
0009 #include "scripting_list.h"
0010 
0011 #include <QRegularExpression>
0012 
0013 using namespace SubtitleComposer;
0014 
0015 Scripting::RichString::RichString(const SubtitleComposer::RichString &backend, QObject *parent) :
0016     QObject(parent),
0017     m_backend(backend)
0018 {}
0019 
0020 bool
0021 Scripting::RichString::isEmpty() const
0022 {
0023     return m_backend.isEmpty();
0024 }
0025 
0026 int
0027 Scripting::RichString::length() const
0028 {
0029     return m_backend.length();
0030 }
0031 
0032 int
0033 Scripting::RichString::count() const
0034 {
0035     return m_backend.length();
0036 }
0037 
0038 int
0039 Scripting::RichString::size() const
0040 {
0041     return m_backend.length();
0042 }
0043 
0044 QString
0045 Scripting::RichString::plainText() const
0046 {
0047     return m_backend.string();
0048 }
0049 
0050 void
0051 Scripting::RichString::setPlainText(const QString &string, int styleFlags)
0052 {
0053     m_backend.setString(string, styleFlags);
0054 }
0055 
0056 QString
0057 Scripting::RichString::richText() const
0058 {
0059     return m_backend.richString();
0060 }
0061 
0062 void
0063 Scripting::RichString::setRichText(const QString &string)
0064 {
0065     m_backend.setRichString(string);
0066 }
0067 
0068 const QChar
0069 Scripting::RichString::charAt(int index)
0070 {
0071     if(index < 0 || index >= m_backend.size())
0072         return '\0';
0073     return m_backend.at(index);
0074 }
0075 
0076 void
0077 Scripting::RichString::setCharAt(int index, const QChar &chr)
0078 {
0079     if(index >= 0 && index < m_backend.size())
0080         m_backend[index] = chr;
0081 }
0082 
0083 int
0084 Scripting::RichString::styleFlagsAt(int index) const
0085 {
0086     if(index < 0 || index >= m_backend.size())
0087         return 0;
0088     return m_backend.styleFlagsAt(index);
0089 }
0090 
0091 void
0092 Scripting::RichString::setStyleFlagsAt(int index, int styleFlags) const
0093 {
0094     if(index >= 0 && index < m_backend.size())
0095         m_backend.setStyleFlagsAt(index, styleFlags);
0096 }
0097 
0098 int
0099 Scripting::RichString::cummulativeStyleFlags() const
0100 {
0101     return m_backend.cummulativeStyleFlags();
0102 }
0103 
0104 bool
0105 Scripting::RichString::hasStyleFlags(int styleFlags) const
0106 {
0107     return m_backend.hasStyleFlags(styleFlags);
0108 }
0109 
0110 void
0111 Scripting::RichString::setStyleFlags(int index, int len, int styleFlags)
0112 {
0113     if(index < 0 || index >= m_backend.size())
0114         return;
0115     m_backend.setStyleFlags(index, len, styleFlags);
0116 }
0117 
0118 void
0119 Scripting::RichString::setStyleFlags(int index, int len, int styleFlags, bool on)
0120 {
0121     if(index < 0 || index >= m_backend.size())
0122         return;
0123     m_backend.setStyleFlags(index, len, styleFlags, on);
0124 }
0125 
0126 void
0127 Scripting::RichString::clear()
0128 {
0129     m_backend.clear();
0130 }
0131 
0132 void
0133 Scripting::RichString::truncate(int size)
0134 {
0135     if(size >= 0)
0136         m_backend.truncate(size);
0137 }
0138 
0139 QObject *
0140 Scripting::RichString::insert(int index, QObject *object)
0141 {
0142     if(index >= 0 && index <= m_backend.size()) {
0143         if(const Scripting::RichString * str = qobject_cast<const Scripting::RichString *>(object))
0144             m_backend.insert(index, str->m_backend);
0145     }
0146     return this;
0147 }
0148 
0149 QObject *
0150 Scripting::RichString::insertPlain(int index, const QString &str)
0151 {
0152     if(index >= 0 && index <= m_backend.size())
0153         m_backend.insert(index, str);
0154     return this;
0155 }
0156 
0157 QObject *
0158 Scripting::RichString::append(QObject *object)
0159 {
0160     if(const Scripting::RichString * str = qobject_cast<const Scripting::RichString *>(object))
0161         m_backend.append(str->m_backend);
0162     return this;
0163 }
0164 
0165 QObject *
0166 Scripting::RichString::appendPlain(const QString &str)
0167 {
0168     m_backend.append(str);
0169     return this;
0170 }
0171 
0172 QObject *
0173 Scripting::RichString::prepend(QObject *object)
0174 {
0175     if(const Scripting::RichString * str = qobject_cast<const Scripting::RichString *>(object))
0176         m_backend.prepend(str->m_backend);
0177     return this;
0178 }
0179 
0180 QObject *
0181 Scripting::RichString::prependPlain(const QString &str)
0182 {
0183     m_backend.prepend(str);
0184     return this;
0185 }
0186 
0187 QObject *
0188 Scripting::RichString::remove(int index, int len)
0189 {
0190     if(index >= 0 && index < m_backend.size())
0191         m_backend.remove(index, len);
0192     return this;
0193 }
0194 
0195 QObject *
0196 Scripting::RichString::removeAll(const QString &str, bool regExp, bool caseSensitive)
0197 {
0198     if(regExp)
0199         m_backend.remove(QRegularExpression(str, caseSensitive ? QRegularExpression::NoPatternOption : QRegularExpression::CaseInsensitiveOption));
0200     else
0201         m_backend.remove(str, caseSensitive ? Qt::CaseSensitive : Qt::CaseInsensitive);
0202     return this;
0203 }
0204 
0205 QObject *
0206 Scripting::RichString::replace(int index, int len, QObject *object)
0207 {
0208     if(const Scripting::RichString * replacement = qobject_cast<const Scripting::RichString *>(object)) {
0209         if(index >= 0 && index < m_backend.size())
0210             m_backend.replace(index, len, replacement->m_backend);
0211     }
0212     return this;
0213 }
0214 
0215 QObject *
0216 Scripting::RichString::replacePlain(int index, int len, const QString &replacement)
0217 {
0218     if(index >= 0 && index < m_backend.size())
0219         m_backend.replace(index, len, replacement);
0220     return this;
0221 }
0222 
0223 QObject *
0224 Scripting::RichString::replaceAll(const QString &before, QObject *object, bool regExp, bool caseSensitive)
0225 {
0226     if(const Scripting::RichString * after = qobject_cast<const Scripting::RichString *>(object)) {
0227         if(regExp)
0228             m_backend.replace(QRegularExpression(before, caseSensitive ? QRegularExpression::NoPatternOption : QRegularExpression::CaseInsensitiveOption), after->m_backend);
0229         else
0230             m_backend.replace(before, after->m_backend, caseSensitive ? Qt::CaseSensitive : Qt::CaseInsensitive);
0231     }
0232     return this;
0233 }
0234 
0235 QObject *
0236 Scripting::RichString::replaceAllPlain(const QString &before, const QString &after, bool regExp, bool caseSensitive)
0237 {
0238     if(regExp)
0239         m_backend.replace(QRegularExpression(before, caseSensitive ? QRegularExpression::NoPatternOption : QRegularExpression::CaseInsensitiveOption), after);
0240     else
0241         m_backend.replace(before, after, caseSensitive ? Qt::CaseSensitive : Qt::CaseInsensitive);
0242     return this;
0243 }
0244 
0245 Scripting::List *
0246 Scripting::RichString::split(const QString &sep, bool regExp, bool caseSensitive) const
0247 {
0248     RichStringList tokens;
0249     if(regExp)
0250         tokens = m_backend.split(QRegularExpression(sep, caseSensitive ? QRegularExpression::NoPatternOption : QRegularExpression::CaseInsensitiveOption), Qt::KeepEmptyParts);
0251     else
0252         tokens = m_backend.split(sep, Qt::KeepEmptyParts, caseSensitive ? Qt::CaseSensitive : Qt::CaseInsensitive);
0253 
0254     Scripting::RichString *parent = const_cast<Scripting::RichString *>(this);
0255 
0256     QList<QObject *> list;
0257     for(RichStringList::ConstIterator it = tokens.constBegin(), end = tokens.constEnd(); it != end; ++it)
0258         list.append(new Scripting::RichString(*it, parent));
0259 
0260     return new Scripting::List(list, Scripting::RichString::staticMetaObject.className(), parent);
0261 }
0262 
0263 QObject *
0264 Scripting::RichString::left(int len) const
0265 {
0266     return new RichString(m_backend.left(len), const_cast<Scripting::RichString *>(this));
0267 }
0268 
0269 QObject *
0270 Scripting::RichString::right(int len) const
0271 {
0272     return new RichString(m_backend.right(len), const_cast<Scripting::RichString *>(this));
0273 }
0274 
0275 QObject *
0276 Scripting::RichString::mid(int index, int len) const
0277 {
0278     if(index < 0 || index >= m_backend.size())
0279         return new RichString(SubtitleComposer::RichString(), const_cast<Scripting::RichString *>(this));
0280     return new RichString(m_backend.mid(index, len), const_cast<Scripting::RichString *>(this));
0281 }
0282 
0283 QObject *
0284 Scripting::RichString::toLower() const
0285 {
0286     return new RichString(m_backend.toLower(), const_cast<Scripting::RichString *>(this));
0287 }
0288 
0289 QObject *
0290 Scripting::RichString::toUpper() const
0291 {
0292     return new RichString(m_backend.toUpper(), const_cast<Scripting::RichString *>(this));
0293 }
0294 
0295 QObject *
0296 Scripting::RichString::simplified() const
0297 {
0298     return new RichString(m_backend.simplified(), const_cast<Scripting::RichString *>(this));
0299 }
0300 
0301 QObject *
0302 Scripting::RichString::trimmed() const
0303 {
0304     return new RichString(m_backend.trimmed(), const_cast<Scripting::RichString *>(this));
0305 }
0306 
0307 int
0308 Scripting::RichString::compareTo(QObject *object) const
0309 {
0310     const Scripting::RichString *string = qobject_cast<const Scripting::RichString *>(object);
0311     if(!string)
0312         return -2;
0313 
0314     if(m_backend < string->m_backend)
0315         return -1;
0316     else if(m_backend == string->m_backend)
0317         return 0;
0318     else
0319         return 1;
0320 }
0321 
0322 int
0323 Scripting::RichString::compareToPlain(const QString &string) const
0324 {
0325     if(static_cast<const QString &>(m_backend) < string)
0326         return -1;
0327     else if(static_cast<const QString &>(m_backend) == string)
0328         return 0;
0329     else
0330         return 1;
0331 }
0332 
0333