23 #include "alarmtext.h"
27 #ifdef KALARMCAL_USE_KRESOURCES
28 #include <kcal/todo.h>
31 #include <klocalizedstring.h>
33 #include <QStringList>
39 class AlarmText::Private
42 enum Type { None, Email, Script, Todo };
45 static void initialise();
46 static void setUpTranslations();
47 static int emailHeaderCount(
const QStringList&);
48 static QString todoTitle(
const QString& text);
50 static QString mFromPrefix;
51 static QString mToPrefix;
52 static QString mCcPrefix;
53 static QString mDatePrefix;
54 static QString mSubjectPrefix;
55 static QString mTitlePrefix;
56 static QString mLocnPrefix;
57 static QString mDuePrefix;
58 static QString mFromPrefixEn;
59 static QString mToPrefixEn;
60 static QString mCcPrefixEn;
61 static QString mDatePrefixEn;
62 static QString mSubjectPrefixEn;
63 static bool mInitialised;
65 QString mBody, mFrom, mTo, mCc, mTime, mSubject;
66 unsigned long mKMailSerialNum;
71 QString AlarmText::Private::mFromPrefix;
72 QString AlarmText::Private::mToPrefix;
73 QString AlarmText::Private::mCcPrefix;
74 QString AlarmText::Private::mDatePrefix;
75 QString AlarmText::Private::mSubjectPrefix;
76 QString AlarmText::Private::mTitlePrefix;
77 QString AlarmText::Private::mLocnPrefix;
78 QString AlarmText::Private::mDuePrefix;
79 QString AlarmText::Private::mFromPrefixEn;
80 QString AlarmText::Private::mToPrefixEn;
81 QString AlarmText::Private::mCcPrefixEn;
82 QString AlarmText::Private::mDatePrefixEn;
83 QString AlarmText::Private::mSubjectPrefixEn;
84 bool AlarmText::Private::mInitialised =
false;
86 void AlarmText::Private::initialise()
91 mFromPrefixEn = QLatin1String(
"From:");
92 mToPrefixEn = QLatin1String(
"To:");
93 mCcPrefixEn = QLatin1String(
"Cc:");
94 mDatePrefixEn = QLatin1String(
"Date:");
95 mSubjectPrefixEn = QLatin1String(
"Subject:");
102 Private::initialise();
107 : d(new Private(*other.d))
111 AlarmText::~AlarmText()
116 AlarmText& AlarmText::operator=(
const AlarmText& other)
127 if (text.startsWith(QLatin1String(
"#!")))
128 d->mType = Private::Script;
134 d->mType = Private::Script;
138 const QString& subject,
const QString& body,
unsigned long kmailSerialNumber)
141 d->mType = Private::Email;
151 #ifndef KALARMCAL_USE_KRESOURCES
158 d->mType = Private::Todo;
159 d->mSubject = todo->summary();
160 d->mBody = todo->description();
161 d->mTo = todo->location();
162 if (todo->hasDueDate())
164 KDateTime due = todo->dtDue(
false);
165 if (todo->hasStartDate() && todo->dtStart() != due)
167 d->mTime = todo->allDay() ? KGlobal::locale()->formatDate(due.date(), KLocale::ShortDate)
168 : KGlobal::locale()->formatDateTime(due.dateTime());
178 return d->displayText();
181 QString AlarmText::Private::displayText()
const
189 text = mFromPrefix +
'\t' + mFrom +
'\n';
190 text += mToPrefix +
'\t' + mTo +
'\n';
192 text += mCcPrefix +
'\t' + mCc +
'\n';
193 if (!mTime.isEmpty())
194 text += mDatePrefix +
'\t' + mTime +
'\n';
195 text += mSubjectPrefix +
'\t' + mSubject;
196 if (!mBody.isEmpty())
205 if (!mSubject.isEmpty())
206 text = mTitlePrefix +
'\t' + mSubject +
'\n';
208 text += mLocnPrefix +
'\t' + mTo +
'\n';
209 if (!mTime.isEmpty())
210 text += mDuePrefix +
'\t' + mTime +
'\n';
211 if (!mBody.isEmpty())
221 return !text.isEmpty() ? text : mBody;
226 return (d->mType == Private::Email) ? d->mTo : QString();
231 return (d->mType == Private::Email) ? d->mFrom : QString();
236 return (d->mType == Private::Email) ? d->mCc : QString();
241 return (d->mType == Private::Email) ? d->mTime : QString();
246 return (d->mType == Private::Email) ? d->mSubject : QString();
251 return (d->mType == Private::Email) ? d->mBody : QString();
256 return (d->mType == Private::Todo) ? d->mSubject : QString();
261 return (d->mType == Private::Todo) ? d->mTo : QString();
266 return (d->mType == Private::Todo) ? d->mTime : QString();
271 return (d->mType == Private::Todo) ? d->mBody : QString();
279 if (!d->mBody.isEmpty())
281 if (d->mType != Private::Email)
283 return d->mFrom.isEmpty() && d->mTo.isEmpty() && d->mCc.isEmpty() && d->mTime.isEmpty() && d->mSubject.isEmpty();
288 return d->mType == Private::Email;
293 return d->mType == Private::Script;
298 return d->mType == Private::Todo;
303 return d->mKMailSerialNum;
314 static const QRegExp localfile(
"^file:/+");
319 text =
event.audioFile();
320 if (localfile.indexIn(text) >= 0)
321 text = text.mid(localfile.matchedLength() - 1);
324 text =
event.emailSubject();
327 text =
event.cleanText();
328 if (localfile.indexIn(text) >= 0)
329 text = text.mid(localfile.matchedLength() - 1);
332 text =
event.cleanText();
336 text =
event.cleanText();
339 if (!subject.isNull())
349 subject = Private::todoTitle(text);
350 if (!subject.isEmpty())
362 if (text.count(
'\n') < maxLines)
365 for (
int i = 0; i < maxLines; ++i)
367 newline = text.indexOf(
'\n', newline + 1);
371 if (newline == static_cast<int>(text.length()) - 1)
372 return text.left(newline);
375 return text.left(newline + (maxLines <= 1 ? 0 : 1)) + QLatin1String(
"...");
383 QStringList lines = text.split(
'\n', QString::SkipEmptyParts);
384 return Private::emailHeaderCount(lines);
394 const QStringList lines = text.split(
'\n', QString::SkipEmptyParts);
395 int n = Private::emailHeaderCount(lines);
399 return lines[n-1].mid(Private::mSubjectPrefix.length()).trimmed();
400 QString h = lines[0];
401 for (
int i = 1; i < n; ++i)
417 Private::initialise();
418 const QStringList lines = text.split(
'\n', QString::SkipEmptyParts);
419 int maxn = lines.count();
421 && lines[0].startsWith(Private::mFromPrefixEn)
422 && lines[1].startsWith(Private::mToPrefixEn))
425 if (lines[2].startsWith(Private::mCcPrefixEn))
428 && lines[n].startsWith(Private::mDatePrefixEn)
429 && lines[n+1].startsWith(Private::mSubjectPrefixEn))
431 Private::setUpTranslations();
433 dispText = Private::mFromPrefix + lines[0].mid(Private::mFromPrefixEn.length()) +
'\n';
434 dispText += Private::mToPrefix + lines[1].mid(Private::mToPrefixEn.length()) +
'\n';
436 dispText += Private::mCcPrefix + lines[2].mid(Private::mCcPrefixEn.length()) +
'\n';
437 dispText += Private::mDatePrefix + lines[n].mid(Private::mDatePrefixEn.length()) +
'\n';
438 dispText += Private::mSubjectPrefix + lines[n+1].mid(Private::mSubjectPrefixEn.length());
439 int i = text.indexOf(Private::mSubjectPrefixEn);
440 i = text.indexOf(
'\n', i);
442 dispText += text.mid(i);
457 Private::setUpTranslations();
458 const QStringList lines = text.split(
'\n', QString::SkipEmptyParts);
459 int maxn = lines.count();
461 && lines[0].startsWith(Private::mFromPrefix)
462 && lines[1].startsWith(Private::mToPrefix))
465 if (lines[2].startsWith(Private::mCcPrefix))
468 && lines[n].startsWith(Private::mDatePrefix)
469 && lines[n+1].startsWith(Private::mSubjectPrefix))
473 calText = Private::mFromPrefixEn + lines[0].mid(Private::mFromPrefix.length()) +
'\n';
474 calText += Private::mToPrefixEn + lines[1].mid(Private::mToPrefix.length()) +
'\n';
476 calText += Private::mCcPrefixEn + lines[2].mid(Private::mCcPrefix.length()) +
'\n';
477 calText += Private::mDatePrefixEn + lines[n].mid(Private::mDatePrefix.length()) +
'\n';
478 calText += Private::mSubjectPrefixEn + lines[n+1].mid(Private::mSubjectPrefix.length());
479 int i = text.indexOf(Private::mSubjectPrefix);
480 i = text.indexOf(
'\n', i);
482 calText += text.mid(i);
489 void AlarmText::Private::clear()
504 void AlarmText::Private::setUpTranslations()
507 if (mFromPrefix.isNull())
509 mFromPrefix = i18nc(
"@info/plain 'From' email address",
"From:");
510 mToPrefix = i18nc(
"@info/plain Email addressee",
"To:");
511 mCcPrefix = i18nc(
"@info/plain Copy-to in email headers",
"Cc:");
512 mDatePrefix = i18nc(
"@info/plain",
"Date:");
513 mSubjectPrefix = i18nc(
"@info/plain Email subject",
"Subject:");
515 mTitlePrefix = i18nc(
"@info/plain Todo calendar item's title field",
"To-do:");
516 mLocnPrefix = i18nc(
"@info/plain Todo calendar item's location field",
"Location:");
517 mDuePrefix = i18nc(
"@info/plain Todo calendar item's due date/time",
"Due:");
525 int AlarmText::Private::emailHeaderCount(
const QStringList& lines)
528 int maxn = lines.count();
530 && lines[0].startsWith(mFromPrefix)
531 && lines[1].startsWith(mToPrefix))
534 if (lines[2].startsWith(mCcPrefix))
537 && lines[n].startsWith(mDatePrefix)
538 && lines[n+1].startsWith(mSubjectPrefix))
547 QString AlarmText::Private::todoTitle(
const QString& text)
550 const QStringList lines = text.split(
'\n', QString::SkipEmptyParts);
552 for (n = 0; n < lines.count() && lines[n].contains(
'\t'); ++n) ;
557 if (lines[i].startsWith(mTitlePrefix +
'\t'))
559 title = lines[i].mid(mTitlePrefix.length()).trimmed();
562 if (i < n && lines[i].startsWith(mLocnPrefix +
'\t'))
564 if (i < n && lines[i].startsWith(mDuePrefix +
'\t'))
569 if (!title.isEmpty())
571 if (n < lines.count())