23 #include "alarmtext.h"
27 #ifdef KALARMCAL_USE_KRESOURCES
28 #include <kcal/todo.h>
32 #include <QStringList>
37 class AlarmText::Private
40 enum Type { None, Email, Script, Todo };
43 static void initialise();
44 static void setUpTranslations();
45 static int emailHeaderCount(
const QStringList&);
46 static QString todoTitle(
const QString& text);
48 static QString mFromPrefix;
49 static QString mToPrefix;
50 static QString mCcPrefix;
51 static QString mDatePrefix;
52 static QString mSubjectPrefix;
53 static QString mTitlePrefix;
54 static QString mLocnPrefix;
55 static QString mDuePrefix;
56 static QString mFromPrefixEn;
57 static QString mToPrefixEn;
58 static QString mCcPrefixEn;
59 static QString mDatePrefixEn;
60 static QString mSubjectPrefixEn;
61 static bool mInitialised;
63 QString mBody, mFrom, mTo, mCc, mTime, mSubject;
64 unsigned long mKMailSerialNum;
69 QString AlarmText::Private::mFromPrefix;
70 QString AlarmText::Private::mToPrefix;
71 QString AlarmText::Private::mCcPrefix;
72 QString AlarmText::Private::mDatePrefix;
73 QString AlarmText::Private::mSubjectPrefix;
74 QString AlarmText::Private::mTitlePrefix;
75 QString AlarmText::Private::mLocnPrefix;
76 QString AlarmText::Private::mDuePrefix;
77 QString AlarmText::Private::mFromPrefixEn;
78 QString AlarmText::Private::mToPrefixEn;
79 QString AlarmText::Private::mCcPrefixEn;
80 QString AlarmText::Private::mDatePrefixEn;
81 QString AlarmText::Private::mSubjectPrefixEn;
82 bool AlarmText::Private::mInitialised =
false;
84 void AlarmText::Private::initialise()
89 mFromPrefixEn = QLatin1String(
"From:");
90 mToPrefixEn = QLatin1String(
"To:");
91 mCcPrefixEn = QLatin1String(
"Cc:");
92 mDatePrefixEn = QLatin1String(
"Date:");
93 mSubjectPrefixEn = QLatin1String(
"Subject:");
100 Private::initialise();
105 : d(new Private(*other.d))
109 AlarmText::~AlarmText()
114 AlarmText& AlarmText::operator=(
const AlarmText& other)
125 if (text.startsWith(QLatin1String(
"#!")))
126 d->mType = Private::Script;
132 d->mType = Private::Script;
136 const QString& subject,
const QString& body,
unsigned long kmailSerialNumber)
139 d->mType = Private::Email;
149 #ifndef KALARMCAL_USE_KRESOURCES
156 d->mType = Private::Todo;
157 d->mSubject = todo->summary();
158 d->mBody = todo->description();
159 d->mTo = todo->location();
160 if (todo->hasDueDate())
162 KDateTime due = todo->dtDue(
false);
163 if (todo->hasStartDate() && todo->dtStart() != due)
165 d->mTime = todo->allDay() ? KGlobal::locale()->formatDate(due.date(), KLocale::ShortDate)
166 : KGlobal::locale()->formatDateTime(due.dateTime());
176 return d->displayText();
179 QString AlarmText::Private::displayText()
const
187 text = mFromPrefix +
'\t' + mFrom +
'\n';
188 text += mToPrefix +
'\t' + mTo +
'\n';
190 text += mCcPrefix +
'\t' + mCc +
'\n';
191 if (!mTime.isEmpty())
192 text += mDatePrefix +
'\t' + mTime +
'\n';
193 text += mSubjectPrefix +
'\t' + mSubject;
194 if (!mBody.isEmpty())
203 if (!mSubject.isEmpty())
204 text = mTitlePrefix +
'\t' + mSubject +
'\n';
206 text += mLocnPrefix +
'\t' + mTo +
'\n';
207 if (!mTime.isEmpty())
208 text += mDuePrefix +
'\t' + mTime +
'\n';
209 if (!mBody.isEmpty())
219 return !text.isEmpty() ? text : mBody;
224 return (d->mType == Private::Email) ? d->mTo : QString();
229 return (d->mType == Private::Email) ? d->mFrom : QString();
234 return (d->mType == Private::Email) ? d->mCc : QString();
239 return (d->mType == Private::Email) ? d->mTime : QString();
244 return (d->mType == Private::Email) ? d->mSubject : QString();
249 return (d->mType == Private::Email) ? d->mBody : QString();
254 return (d->mType == Private::Todo) ? d->mSubject : QString();
259 return (d->mType == Private::Todo) ? d->mTo : QString();
264 return (d->mType == Private::Todo) ? d->mTime : QString();
269 return (d->mType == Private::Todo) ? d->mBody : QString();
277 if (!d->mBody.isEmpty())
279 if (d->mType != Private::Email)
281 return d->mFrom.isEmpty() && d->mTo.isEmpty() && d->mCc.isEmpty() && d->mTime.isEmpty() && d->mSubject.isEmpty();
286 return d->mType == Private::Email;
291 return d->mType == Private::Script;
296 return d->mType == Private::Todo;
301 return d->mKMailSerialNum;
312 static const QRegExp localfile(
"^file:/+");
317 text =
event.audioFile();
318 if (localfile.indexIn(text) >= 0)
319 text = text.mid(localfile.matchedLength() - 1);
322 text =
event.emailSubject();
325 text =
event.cleanText();
326 if (localfile.indexIn(text) >= 0)
327 text = text.mid(localfile.matchedLength() - 1);
330 text =
event.cleanText();
334 text =
event.cleanText();
337 if (!subject.isNull())
347 subject = Private::todoTitle(text);
348 if (!subject.isEmpty())
360 if (text.count(
'\n') < maxLines)
363 for (
int i = 0; i < maxLines; ++i)
365 newline = text.indexOf(
'\n', newline + 1);
369 if (newline == static_cast<int>(text.length()) - 1)
370 return text.left(newline);
373 return text.left(newline + (maxLines <= 1 ? 0 : 1)) + QLatin1String(
"...");
381 QStringList lines = text.split(
'\n', QString::SkipEmptyParts);
382 return Private::emailHeaderCount(lines);
392 QStringList lines = text.split(
'\n', QString::SkipEmptyParts);
393 int n = Private::emailHeaderCount(lines);
397 return lines[n-1].mid(Private::mSubjectPrefix.length()).trimmed();
398 QString h = lines[0];
399 for (
int i = 1; i < n; ++i)
415 Private::initialise();
416 QStringList lines = text.split(
'\n', QString::SkipEmptyParts);
417 int maxn = lines.count();
419 && lines[0].startsWith(Private::mFromPrefixEn)
420 && lines[1].startsWith(Private::mToPrefixEn))
423 if (lines[2].startsWith(Private::mCcPrefixEn))
426 && lines[n].startsWith(Private::mDatePrefixEn)
427 && lines[n+1].startsWith(Private::mSubjectPrefixEn))
429 Private::setUpTranslations();
431 dispText = Private::mFromPrefix + lines[0].mid(Private::mFromPrefixEn.length()) +
'\n';
432 dispText += Private::mToPrefix + lines[1].mid(Private::mToPrefixEn.length()) +
'\n';
434 dispText += Private::mCcPrefix + lines[2].mid(Private::mCcPrefixEn.length()) +
'\n';
435 dispText += Private::mDatePrefix + lines[n].mid(Private::mDatePrefixEn.length()) +
'\n';
436 dispText += Private::mSubjectPrefix + lines[n+1].mid(Private::mSubjectPrefixEn.length());
437 int i = text.indexOf(Private::mSubjectPrefixEn);
438 i = text.indexOf(
'\n', i);
440 dispText += text.mid(i);
455 Private::setUpTranslations();
456 QStringList lines = text.split(
'\n', QString::SkipEmptyParts);
457 int maxn = lines.count();
459 && lines[0].startsWith(Private::mFromPrefix)
460 && lines[1].startsWith(Private::mToPrefix))
463 if (lines[2].startsWith(Private::mCcPrefix))
466 && lines[n].startsWith(Private::mDatePrefix)
467 && lines[n+1].startsWith(Private::mSubjectPrefix))
471 calText = Private::mFromPrefixEn + lines[0].mid(Private::mFromPrefix.length()) +
'\n';
472 calText += Private::mToPrefixEn + lines[1].mid(Private::mToPrefix.length()) +
'\n';
474 calText += Private::mCcPrefixEn + lines[2].mid(Private::mCcPrefix.length()) +
'\n';
475 calText += Private::mDatePrefixEn + lines[n].mid(Private::mDatePrefix.length()) +
'\n';
476 calText += Private::mSubjectPrefixEn + lines[n+1].mid(Private::mSubjectPrefix.length());
477 int i = text.indexOf(Private::mSubjectPrefix);
478 i = text.indexOf(
'\n', i);
480 calText += text.mid(i);
487 void AlarmText::Private::clear()
502 void AlarmText::Private::setUpTranslations()
505 if (mFromPrefix.isNull())
507 mFromPrefix = i18nc(
"@info/plain 'From' email address",
"From:");
508 mToPrefix = i18nc(
"@info/plain Email addressee",
"To:");
509 mCcPrefix = i18nc(
"@info/plain Copy-to in email headers",
"Cc:");
510 mDatePrefix = i18nc(
"@info/plain",
"Date:");
511 mSubjectPrefix = i18nc(
"@info/plain Email subject",
"Subject:");
513 mTitlePrefix = i18nc(
"@info/plain Todo calendar item's title field",
"To-do:");
514 mLocnPrefix = i18nc(
"@info/plain Todo calendar item's location field",
"Location:");
515 mDuePrefix = i18nc(
"@info/plain Todo calendar item's due date/time",
"Due:");
523 int AlarmText::Private::emailHeaderCount(
const QStringList& lines)
526 int maxn = lines.count();
528 && lines[0].startsWith(mFromPrefix)
529 && lines[1].startsWith(mToPrefix))
532 if (lines[2].startsWith(mCcPrefix))
535 && lines[n].startsWith(mDatePrefix)
536 && lines[n+1].startsWith(mSubjectPrefix))
545 QString AlarmText::Private::todoTitle(
const QString& text)
548 QStringList lines = text.split(
'\n', QString::SkipEmptyParts);
550 for (n = 0; n < lines.count() && lines[n].contains(
'\t'); ++n) ;
555 if (lines[i].startsWith(mTitlePrefix +
'\t'))
557 title = lines[i].mid(mTitlePrefix.length()).trimmed();
560 if (i < n && lines[i].startsWith(mLocnPrefix +
'\t'))
562 if (i < n && lines[i].startsWith(mDuePrefix +
'\t'))
567 if (!title.isEmpty())
569 if (n < lines.count())