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())
QString summary() const
Return the summary text for a todo.
QString cc() const
Return the 'Cc' header parameter for an email alarm.
QString displayText() const
Return the text for a text message alarm, in display format.
static QString fromCalendarText(const QString &text, bool &email)
Translate an alarm calendar text to a display text.
bool isEmpty() const
Return whether there is any text.
QString subject() const
Return the 'Subject' header parameter for an email alarm.
QString location() const
Return the location text for a todo.
QString time() const
Return the 'Date' header parameter for an email alarm.
QString description() const
Return the description text for a todo.
Type
The category of an event, indicated by the middle part of its UID.
static QString emailHeaders(const QString &text, bool subjectOnly)
Check whether a text is an email (with at least To and From headers), and if so return its headers or...
bool isTodo() const
Return whether the instance contains the text of a todo.
static QString toCalendarText(const QString &text)
Return the text for an alarm message text, in alarm calendar format.
unsigned long kmailSerialNumber() const
Return the kmail serial number of an email.
bool isScript() const
Return whether the instance contains the text of a script.
QString due() const
Return the due date text for a todo.
void setEmail(const QString &to, const QString &from, const QString &cc, const QString &time, const QString &subject, const QString &body, unsigned long kmailSerialNumber=0)
Set the instance contents to be an email.
QString from() const
Return the 'From' header parameter for an email alarm.
Parses email, todo and script alarm texts.
display the contents of a file
void setScript(const QString &text)
Set the instance contents to be a script.
KAEvent represents a KAlarm event.
void setTodo(const KCalCore::Todo::Ptr &todo)
Set the instance contents to be a todo.
SubAction actionSubType() const
Return the action sub-type of the event's main alarm.
static bool checkIfEmail(const QString &text)
Return whether a text is an email, with at least To and From headers.
bool isEmail() const
Return whether the instance contains the text of an email.
void setText(const QString &text)
Set the alarm text.
AlarmText(const QString &text=QString())
Constructor which sets the alarm text.
QString body() const
Return the email message body.
QSharedPointer< Todo > Ptr
QString to() const
Return the 'To' header parameter for an email alarm.