Some fixes in RSS feed processing.
It is now possible to have hierarchical merge tags (separated by "."). The merge tags are now case sensitive. Mailtrain allows passing element "mt:entries-json" in the RSS item feed. If this is detected, it parses the json structure and makes it available through RSS_ENTRY_CUSTOM_TAGS. Then it can be used as [RSS_ENTRY_CUSTOM_TAGS.field_quote_text.rendered]
This commit is contained in:
parent
6eead89fef
commit
e786964411
5 changed files with 36 additions and 21 deletions
|
@ -262,7 +262,8 @@ class CampaignSender {
|
||||||
tags['RSS_ENTRY_LINK'] = rssEntry.link;
|
tags['RSS_ENTRY_LINK'] = rssEntry.link;
|
||||||
tags['RSS_ENTRY_CONTENT'] = rssEntry.content;
|
tags['RSS_ENTRY_CONTENT'] = rssEntry.content;
|
||||||
tags['RSS_ENTRY_SUMMARY'] = rssEntry.summary;
|
tags['RSS_ENTRY_SUMMARY'] = rssEntry.summary;
|
||||||
tags['RSS_ENTRY_IMAGE_URL'] = rssEntry.image_url;
|
tags['RSS_ENTRY_IMAGE_URL'] = rssEntry.imageUrl;
|
||||||
|
tags['RSS_ENTRY_CUSTOM_TAGS'] = rssEntry.customTags;
|
||||||
}
|
}
|
||||||
|
|
||||||
return tags;
|
return tags;
|
||||||
|
@ -311,6 +312,7 @@ class CampaignSender {
|
||||||
const sendConfiguration = this.sendConfiguration;
|
const sendConfiguration = this.sendConfiguration;
|
||||||
|
|
||||||
const {html, text, attachments} = await this._getMessage(campaign, list, subscriptionGrouped, mergeTags, true);
|
const {html, text, attachments} = await this._getMessage(campaign, list, subscriptionGrouped, mergeTags, true);
|
||||||
|
console.log(html);
|
||||||
|
|
||||||
const campaignAddress = [campaign.cid, list.cid, subscriptionGrouped.cid].join('.');
|
const campaignAddress = [campaign.cid, list.cid, subscriptionGrouped.cid].join('.');
|
||||||
|
|
||||||
|
|
|
@ -150,23 +150,31 @@ function validateEmailGetMessage(result, address, language) {
|
||||||
function formatMessage(campaign, list, subscription, mergeTags, message, isHTML) {
|
function formatMessage(campaign, list, subscription, mergeTags, message, isHTML) {
|
||||||
const links = getMessageLinks(campaign, list, subscription);
|
const links = getMessageLinks(campaign, list, subscription);
|
||||||
|
|
||||||
const getValue = key => {
|
const getValue = fullKey => {
|
||||||
key = (key || '').toString().toUpperCase().trim();
|
const keys = (fullKey || '').split('.');
|
||||||
if (links.hasOwnProperty(key)) {
|
|
||||||
return links[key];
|
if (links.hasOwnProperty(keys[0])) {
|
||||||
|
return links[keys[0]];
|
||||||
}
|
}
|
||||||
if (mergeTags.hasOwnProperty(key)) {
|
|
||||||
const value = (mergeTags[key] || '').toString();
|
let value = mergeTags;
|
||||||
|
while (keys.length > 0) {
|
||||||
|
let key = keys.shift();
|
||||||
|
if (value.hasOwnProperty(key)) {
|
||||||
|
value = value[key];
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const containsHTML = /<[a-z][\s\S]*>/.test(value);
|
const containsHTML = /<[a-z][\s\S]*>/.test(value);
|
||||||
return isHTML ? he.encode((containsHTML ? value : value.replace(/(?:\r\n|\r|\n)/g, '<br/>')), {
|
return isHTML ? he.encode((containsHTML ? value : value.replace(/(?:\r\n|\r|\n)/g, '<br/>')), {
|
||||||
useNamedReferences: true,
|
useNamedReferences: true,
|
||||||
allowUnsafeSymbols: true
|
allowUnsafeSymbols: true
|
||||||
}) : (containsHTML ? htmlToText.fromString(value) : value);
|
}) : (containsHTML ? htmlToText.fromString(value) : value);
|
||||||
}
|
|
||||||
return false;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
return message.replace(/\[([a-z0-9_]+)(?:\/([^\]]+))?\]/ig, (match, identifier, fallback) => {
|
return message.replace(/\[([a-z0-9_.]+)(?:\/([^\]]+))?\]/ig, (match, identifier, fallback) => {
|
||||||
let value = getValue(identifier);
|
let value = getValue(identifier);
|
||||||
if (value === false) {
|
if (value === false) {
|
||||||
return match;
|
return match;
|
||||||
|
|
|
@ -186,7 +186,7 @@ fieldTypes['radio-enum'] = {
|
||||||
cardinality: Cardinality.SINGLE,
|
cardinality: Cardinality.SINGLE,
|
||||||
getHbsType: field => 'typeRadioEnum',
|
getHbsType: field => 'typeRadioEnum',
|
||||||
render: (field, value) => {
|
render: (field, value) => {
|
||||||
const fld = field.groupedOptions[value];
|
const fld = field.settings.options[value];
|
||||||
return fld ? fld.name : '';
|
return fld ? fld.name : '';
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -203,7 +203,7 @@ fieldTypes['dropdown-enum'] = {
|
||||||
cardinality: Cardinality.SINGLE,
|
cardinality: Cardinality.SINGLE,
|
||||||
getHbsType: field => 'typeDropdownEnum',
|
getHbsType: field => 'typeDropdownEnum',
|
||||||
render: (field, value) => {
|
render: (field, value) => {
|
||||||
const fld = field.groupedOptions[value];
|
const fld = field.settings.options[value];
|
||||||
return fld ? fld.name : '';
|
return fld ? fld.name : '';
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
2
server/package-lock.json
generated
2
server/package-lock.json
generated
|
@ -863,7 +863,7 @@
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"iconv-lite": {
|
"iconv-lite": {
|
||||||
"version": "0.4.15",
|
"version": "0.4.15",
|
||||||
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.15.tgz",
|
"resolved": "http://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.15.tgz",
|
||||||
"integrity": "sha1-/iZaIYrGpXz+hUkn6dBMGYJe3es="
|
"integrity": "sha1-/iZaIYrGpXz+hUkn6dBMGYJe3es="
|
||||||
},
|
},
|
||||||
"libmime": {
|
"libmime": {
|
||||||
|
|
|
@ -19,7 +19,7 @@ let running = false;
|
||||||
|
|
||||||
async function fetch(url) {
|
async function fetch(url) {
|
||||||
const httpOptions = {
|
const httpOptions = {
|
||||||
uri: 'http://feeds.feedwrench.com/JavaScriptJabber.rss',
|
uri: url,
|
||||||
headers: {
|
headers: {
|
||||||
'user-agent': 'Mailtrain',
|
'user-agent': 'Mailtrain',
|
||||||
'accept': 'text/html,application/xhtml+xml'
|
'accept': 'text/html,application/xhtml+xml'
|
||||||
|
@ -37,8 +37,13 @@ async function fetch(url) {
|
||||||
link: item.link,
|
link: item.link,
|
||||||
content: item.description || item.summary,
|
content: item.description || item.summary,
|
||||||
summary: item.summary || item.description,
|
summary: item.summary || item.description,
|
||||||
image_url: item.image.url
|
imageUrl: item.image.url,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
if ('mt:entries-json' in item) {
|
||||||
|
entry.customTags = JSON.parse(item['mt:entries-json']['#'])
|
||||||
|
}
|
||||||
|
|
||||||
entries.push(entry);
|
entries.push(entry);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -140,7 +145,7 @@ async function run() {
|
||||||
|
|
||||||
rssCampaign.data.checkStatus = checkStatus;
|
rssCampaign.data.checkStatus = checkStatus;
|
||||||
await knex('campaigns').where('id', rssCampaign.id).update({
|
await knex('campaigns').where('id', rssCampaign.id).update({
|
||||||
last_check: Date.now(),
|
last_check: new Date(),
|
||||||
data: JSON.stringify(rssCampaign.data)
|
data: JSON.stringify(rssCampaign.data)
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -148,7 +153,7 @@ async function run() {
|
||||||
log.error('Feed', err.message);
|
log.error('Feed', err.message);
|
||||||
rssCampaign.data.checkStatus = err.message;
|
rssCampaign.data.checkStatus = err.message;
|
||||||
await knex('campaigns').where('id', rssCampaign.id).update({
|
await knex('campaigns').where('id', rssCampaign.id).update({
|
||||||
last_check: Date.now(),
|
last_check: new Date(),
|
||||||
data: JSON.stringify(rssCampaign.data)
|
data: JSON.stringify(rssCampaign.data)
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue