iframely/plugins/links/utils.js
var _ = require('underscore');
var ALLOWED_TYPES = {};
_.values(CONFIG.T).forEach(function(v) {
ALLOWED_TYPES[v] = true;
});
module.exports = {
notPlugin: true,
mergeMediaSize: function(links) {
if (links && links instanceof Array) {
// Search first link with media.
var media = null,
i = 0;
while(!media && i < links.length) {
var link = links[i];
// Get all media attrs from link (if has).
for(var j = 0; j < CONFIG.MEDIA_ATTRS.length; j++) {
var attr = CONFIG.MEDIA_ATTRS[j];
if (link[attr]) {
if (!media) {
media = {};
}
media[attr] = link[attr];
}
}
i++;
}
if (media) {
i = 0;
while(i < links.length) {
var hasMedia = false,
link = links[i];
for(var j = 0; !hasMedia && j < CONFIG.MEDIA_ATTRS.length; j++) {
var attr = CONFIG.MEDIA_ATTRS[j];
if (link[attr]) {
hasMedia = true;
}
}
if (!hasMedia) {
_.extend(link, media);
}
i++;
}
}
}
return links;
},
getImageLink: function(attr, meta) {
var v = meta[attr];
if (!v) {
return;
}
if (v instanceof Array) {
return v.map(function(image) {
return {
href: image.href || image,
type: image.type || CONFIG.T.image,
rel: CONFIG.R.thumbnail
}
});
} else {
return {
href: v.href || v,
type: v.type || CONFIG.T.image,
rel: CONFIG.R.thumbnail
};
}
},
parseMetaLinks: function(key, value, whitelistRecord) {
if (typeof value !== "object" || typeof value === "string") {
return [];
}
var rels = key.split(/\W+/);
if (_.intersection(rels, CONFIG.REL_GROUPS).length == 0) {
return [];
}
if (!(value instanceof Array)) {
value = [value];
}
value = value.filter(function(v) {
return v.type && v.type in ALLOWED_TYPES;
});
// TODO: add media and rels to favicon and thumbnail plugins.
var EXISTING_PROVIDERS = ["icon", "thumbnail"];
if (rels.length == 1 && _.intersection(rels, EXISTING_PROVIDERS).length > 0) {
return [];
}
// Apply whitelist except for thumbnails.
if (rels.indexOf('thumbnail') === -1) {
var tags = whitelistRecord.getQATags({}, rels);
if (tags.indexOf('allow') === -1) {
return [];
}
}
var links = [];
value.forEach(function(v) {
var link = {
href: v.href,
title: v.title,
type: v.type,
rel: rels // Validate REL?
};
var media = v.media;
if (media) {
CONFIG.MEDIA_ATTRS.forEach(function(ma) {
var re = "\\(\\s*" + ma + "\\s*:\\s*([\\d./:]+)(?:px)?\\s*\\)";
var m = media.match(re);
if (m) {
link[ma] = m[1];
}
});
}
links.push(link);
});
return links;
}
};