23 #include "alarmtext.h"
27 #ifdef KALARMCAL_USE_KRESOURCES
28 #include <kcal/todo.h>
31 #include <klocalizedstring.h>
33 #include <QStringList>
37 const int MAIL_FROM_LINE = 0;
38 const int MAIL_TO_LINE = 1;
39 const int MAIL_CC_LINE = 2;
40 const int MAIL_MIN_LINES = 4;
46 class AlarmText::Private
49 enum Type { None, Email, Script, Todo };
52 static void initialise();
53 static void setUpTranslations();
54 static int emailHeaderCount(
const QStringList&);
55 static QString todoTitle(
const QString& text);
57 static QString mFromPrefix;
58 static QString mToPrefix;
59 static QString mCcPrefix;
60 static QString mDatePrefix;
61 static QString mSubjectPrefix;
62 static QString mTitlePrefix;
63 static QString mLocnPrefix;
64 static QString mDuePrefix;
65 static QString mFromPrefixEn;
66 static QString mToPrefixEn;
67 static QString mCcPrefixEn;
68 static QString mDatePrefixEn;
69 static QString mSubjectPrefixEn;
70 static bool mInitialised;
72 QString mBody, mFrom, mTo, mCc, mTime, mSubject;
73 unsigned long mKMailSerialNum;
78 QString AlarmText::Private::mFromPrefix;
79 QString AlarmText::Private::mToPrefix;
80 QString AlarmText::Private::mCcPrefix;
81 QString AlarmText::Private::mDatePrefix;
82 QString AlarmText::Private::mSubjectPrefix;
83 QString AlarmText::Private::mTitlePrefix;
84 QString AlarmText::Private::mLocnPrefix;
85 QString AlarmText::Private::mDuePrefix;
86 QString AlarmText::Private::mFromPrefixEn;
87 QString AlarmText::Private::mToPrefixEn;
88 QString AlarmText::Private::mCcPrefixEn;
89 QString AlarmText::Private::mDatePrefixEn;
90 QString AlarmText::Private::mSubjectPrefixEn;
91 bool AlarmText::Private::mInitialised =
false;
93 void AlarmText::Private::initialise()
98 mFromPrefixEn = QLatin1String(
"From:");
99 mToPrefixEn = QLatin1String(
"To:");
100 mCcPrefixEn = QLatin1String(
"Cc:");
101 mDatePrefixEn = QLatin1String(
"Date:");
102 mSubjectPrefixEn = QLatin1String(
"Subject:");
109 Private::initialise();
114 : d(new Private(*other.d))
118 AlarmText::~AlarmText()
123 AlarmText& AlarmText::operator=(
const AlarmText& other)
134 if (text.startsWith(QLatin1String(
"#!")))
135 d->mType = Private::Script;
141 d->mType = Private::Script;
145 const QString& subject,
const QString& body,
unsigned long kmailSerialNumber)
148 d->mType = Private::Email;
158 #ifndef KALARMCAL_USE_KRESOURCES
165 d->mType = Private::Todo;
166 d->mSubject = todo->summary();
167 d->mBody = todo->description();
168 d->mTo = todo->location();
169 if (todo->hasDueDate())
171 KDateTime due = todo->dtDue(
false);
172 if (todo->hasStartDate() && todo->dtStart() != due)
174 d->mTime = todo->allDay() ? KGlobal::locale()->formatDate(due.date(), KLocale::ShortDate)
175 : KGlobal::locale()->formatDateTime(due.dateTime());
185 return d->displayText();
188 QString AlarmText::Private::displayText()
const
196 text = mFromPrefix + QLatin1Char(
'\t') + mFrom + QLatin1Char(
'\n');
197 text += mToPrefix + QLatin1Char(
'\t') + mTo + QLatin1Char(
'\n');
199 text += mCcPrefix + QLatin1Char(
'\t') + mCc + QLatin1Char(
'\n');
200 if (!mTime.isEmpty())
201 text += mDatePrefix + QLatin1Char(
'\t') + mTime + QLatin1Char(
'\n');
202 text += mSubjectPrefix + QLatin1Char(
'\t') + mSubject;
203 if (!mBody.isEmpty())
205 text += QLatin1String(
"\n\n");
212 if (!mSubject.isEmpty())
213 text = mTitlePrefix + QLatin1Char(
'\t') + mSubject + QLatin1Char(
'\n');
215 text += mLocnPrefix + QLatin1Char(
'\t') + mTo + QLatin1Char(
'\n');
216 if (!mTime.isEmpty())
217 text += mDuePrefix + QLatin1Char(
'\t') + mTime + QLatin1Char(
'\n');
218 if (!mBody.isEmpty())
221 text += QLatin1Char(
'\n');
228 return !text.isEmpty() ? text : mBody;
233 return (d->mType == Private::Email) ? d->mTo : QString();
238 return (d->mType == Private::Email) ? d->mFrom : QString();
243 return (d->mType == Private::Email) ? d->mCc : QString();
248 return (d->mType == Private::Email) ? d->mTime : QString();
253 return (d->mType == Private::Email) ? d->mSubject : QString();
258 return (d->mType == Private::Email) ? d->mBody : QString();
263 return (d->mType == Private::Todo) ? d->mSubject : QString();
268 return (d->mType == Private::Todo) ? d->mTo : QString();
273 return (d->mType == Private::Todo) ? d->mTime : QString();
278 return (d->mType == Private::Todo) ? d->mBody : QString();
286 if (!d->mBody.isEmpty())
288 if (d->mType != Private::Email)
290 return d->mFrom.isEmpty() && d->mTo.isEmpty() && d->mCc.isEmpty() && d->mTime.isEmpty() && d->mSubject.isEmpty();
295 return d->mType == Private::Email;
300 return d->mType == Private::Script;
305 return d->mType == Private::Todo;
310 return d->mKMailSerialNum;
321 static const QRegExp localfile(QLatin1String(
"^file:/+"));
326 text =
event.audioFile();
327 if (localfile.indexIn(text) >= 0)
328 text = text.mid(localfile.matchedLength() - 1);
331 text =
event.emailSubject();
334 text =
event.cleanText();
335 if (localfile.indexIn(text) >= 0)
336 text = text.mid(localfile.matchedLength() - 1);
339 text =
event.cleanText();
343 text =
event.cleanText();
356 subject = Private::todoTitle(text);
369 if (text.count(QLatin1Char(
'\n')) < maxLines)
372 for (
int i = 0; i < maxLines; ++i)
374 newline = text.indexOf(QLatin1Char(
'\n'), newline + 1);
378 if (newline ==
static_cast<int>(text.length()) - 1)
379 return text.left(newline);
382 return text.left(newline + (maxLines <= 1 ? 0 : 1)) + QLatin1String(
"...");
390 const QStringList lines = text.split(QLatin1Char(
'\n'), QString::SkipEmptyParts);
391 return Private::emailHeaderCount(lines);
401 const QStringList lines = text.split(QLatin1Char(
'\n'), QString::SkipEmptyParts);
402 const int n = Private::emailHeaderCount(lines);
406 return lines[n-1].mid(Private::mSubjectPrefix.length()).trimmed();
407 QString h = lines[0];
408 for (
int i = 1; i < n; ++i)
410 h += QLatin1Char(
'\n');
424 Private::initialise();
425 const QStringList lines = text.split(QLatin1Char(
'\n'), QString::SkipEmptyParts);
426 const int maxn = lines.count();
427 if (maxn >= MAIL_MIN_LINES
428 && lines[MAIL_FROM_LINE].startsWith(Private::mFromPrefixEn)
429 && lines[MAIL_TO_LINE].startsWith(Private::mToPrefixEn))
431 int n = MAIL_CC_LINE;
432 if (lines[MAIL_CC_LINE].startsWith(Private::mCcPrefixEn))
435 && lines[n].startsWith(Private::mDatePrefixEn)
436 && lines[n+1].startsWith(Private::mSubjectPrefixEn))
438 Private::setUpTranslations();
440 dispText = Private::mFromPrefix + lines[MAIL_FROM_LINE].mid(Private::mFromPrefixEn.length()) + QLatin1Char(
'\n');
441 dispText += Private::mToPrefix + lines[MAIL_TO_LINE].mid(Private::mToPrefixEn.length()) + QLatin1Char(
'\n');
442 if (n > MAIL_CC_LINE)
443 dispText += Private::mCcPrefix + lines[MAIL_CC_LINE].mid(Private::mCcPrefixEn.length()) + QLatin1Char(
'\n');
444 dispText += Private::mDatePrefix + lines[n].mid(Private::mDatePrefixEn.length()) + QLatin1Char(
'\n');
445 dispText += Private::mSubjectPrefix + lines[n+1].mid(Private::mSubjectPrefixEn.length());
446 int i = text.indexOf(Private::mSubjectPrefixEn);
447 i = text.indexOf(QLatin1Char(
'\n'), i);
449 dispText += text.mid(i);
464 Private::setUpTranslations();
465 const QStringList lines = text.split(QLatin1Char(
'\n'), QString::SkipEmptyParts);
466 const int maxn = lines.count();
467 if (maxn >= MAIL_MIN_LINES
468 && lines[MAIL_FROM_LINE].startsWith(Private::mFromPrefix)
469 && lines[MAIL_TO_LINE].startsWith(Private::mToPrefix))
471 int n = MAIL_CC_LINE;
472 if (lines[MAIL_CC_LINE].startsWith(Private::mCcPrefix))
475 && lines[n].startsWith(Private::mDatePrefix)
476 && lines[n+1].startsWith(Private::mSubjectPrefix))
480 calText = Private::mFromPrefixEn + lines[MAIL_FROM_LINE].mid(Private::mFromPrefix.length()) + QLatin1Char(
'\n');
481 calText += Private::mToPrefixEn + lines[MAIL_TO_LINE].mid(Private::mToPrefix.length()) + QLatin1Char(
'\n');
482 if (n > MAIL_CC_LINE)
483 calText += Private::mCcPrefixEn + lines[MAIL_CC_LINE].mid(Private::mCcPrefix.length()) + QLatin1Char(
'\n');
484 calText += Private::mDatePrefixEn + lines[n].mid(Private::mDatePrefix.length()) + QLatin1Char(
'\n');
485 calText += Private::mSubjectPrefixEn + lines[n+1].mid(Private::mSubjectPrefix.length());
486 int i = text.indexOf(Private::mSubjectPrefix);
487 i = text.indexOf(QLatin1Char(
'\n'), i);
489 calText += text.mid(i);
496 void AlarmText::Private::clear()
511 void AlarmText::Private::setUpTranslations()
514 if (mFromPrefix.isNull())
516 mFromPrefix = i18nc(
"@info/plain 'From' email address",
"From:");
517 mToPrefix = i18nc(
"@info/plain Email addressee",
"To:");
518 mCcPrefix = i18nc(
"@info/plain Copy-to in email headers",
"Cc:");
519 mDatePrefix = i18nc(
"@info/plain",
"Date:");
520 mSubjectPrefix = i18nc(
"@info/plain Email subject",
"Subject:");
522 mTitlePrefix = i18nc(
"@info/plain Todo calendar item's title field",
"To-do:");
523 mLocnPrefix = i18nc(
"@info/plain Todo calendar item's location field",
"Location:");
524 mDuePrefix = i18nc(
"@info/plain Todo calendar item's due date/time",
"Due:");
532 int AlarmText::Private::emailHeaderCount(
const QStringList& lines)
535 const int maxn = lines.count();
536 if (maxn >= MAIL_MIN_LINES
537 && lines[MAIL_FROM_LINE].startsWith(mFromPrefix)
538 && lines[MAIL_TO_LINE].startsWith(mToPrefix))
540 int n = MAIL_CC_LINE;
541 if (lines[MAIL_CC_LINE].startsWith(mCcPrefix))
544 && lines[n].startsWith(mDatePrefix)
545 && lines[n+1].startsWith(mSubjectPrefix))
554 QString AlarmText::Private::todoTitle(
const QString& text)
557 const QStringList lines = text.split(QLatin1Char(
'\n'), QString::SkipEmptyParts);
559 for (n = 0; n < lines.count() && lines[n].contains(QLatin1Char(
'\t')); ++n) ;
564 if (lines[i].startsWith(mTitlePrefix + QLatin1Char(
'\t')))
566 title = lines[i].mid(mTitlePrefix.length()).trimmed();
569 if (i < n && lines[i].startsWith(mLocnPrefix + QLatin1Char(
'\t')))
571 if (i < n && lines[i].startsWith(mDuePrefix + QLatin1Char(
'\t')))
576 if (!title.isEmpty())
578 if (n < lines.count())