Skip to content
This repository has been archived by the owner on Sep 18, 2021. It is now read-only.

Commit

Permalink
add symbolTag and textWithSymbolTag options
Browse files Browse the repository at this point in the history
  • Loading branch information
keita committed Jun 5, 2012
1 parent dc57a0d commit fb2221a
Show file tree
Hide file tree
Showing 2 changed files with 54 additions and 68 deletions.
25 changes: 11 additions & 14 deletions test/tests.js
Expand Up @@ -99,29 +99,26 @@ test("twttr.txt.extract", function() {

test("twttr.txt.autolink", function() {
// Username Overrides
ok(twttr.txt.autoLink("@tw", { before: "!" }).match(/!@<a[^>]+>tw<\/a>/), "Override before");
ok(twttr.txt.autoLink("@tw", { at: "!" }).match(/!<a[^>]+>tw<\/a>/), "Override at");
ok(twttr.txt.autoLink("@tw", { preChunk: "<b>" }).match(/@<a[^>]+><b>tw<\/a>/), "Override preChunk");
ok(twttr.txt.autoLink("@tw", { postChunk: "</b>" }).match(/@<a[^>]+>tw<\/b><\/a>/), "Override postChunk");
same(twttr.txt.autoLink("@tw", { usernameIncludeSymbol: true }), "<a class=\"tweet-url username\" data-screen-name=\"tw\" href=\"https://twitter.com/tw\" rel=\"nofollow\">@tw</a>",
ok(twttr.txt.autoLink("@tw", { symbolTag: "s" }).match(/<s>@<\/s><a[^>]+>tw<\/a>/), "Apply symbolTag to @username");
ok(twttr.txt.autoLink("@tw", { textWithSymbolTag: "b" }).match(/@<a[^>]+><b>tw<\/b><\/a>/), "Apply textWithSymbolTag to @username");
ok(twttr.txt.autoLink("@tw", { symbolTag: "s", textWithSymbolTag: "b" }).match(/<s>@<\/s><a[^>]+><b>tw<\/b><\/a>/), "Apply symbolTag and textWithSymbolTag to @username");
same(twttr.txt.autoLink("@tw", { usernameIncludeSymbol: true }), "<a class=\"tweet-url username\" href=\"https://twitter.com/tw\" data-screen-name=\"tw\" rel=\"nofollow\">@tw</a>",
"Include @ in the autolinked username");
ok(!twttr.txt.autoLink("foo http://example.com", { usernameClass: 'custom-user' }).match(/custom-user/), "Override usernameClass should not be applied to URL");

// List Overrides
ok(twttr.txt.autoLink("@tw/somelist", { before: "!" }).match(/!@<a[^>]+>tw\/somelist<\/a>/), "Override list before");
ok(twttr.txt.autoLink("@tw/somelist", { at: "!" }).match(/!<a[^>]+>tw\/somelist<\/a>/), "Override list at");
ok(twttr.txt.autoLink("@tw/somelist", { preChunk: "<b>" }).match(/@<a[^>]+><b>tw\/somelist<\/a>/), "Override list preChunk");
ok(twttr.txt.autoLink("@tw/somelist", { postChunk: "</b>" }).match(/@<a[^>]+>tw\/somelist<\/b><\/a>/), "Override list postChunk");
ok(twttr.txt.autoLink("@tw/somelist", { symbolTag: "s" }).match(/<s>@<\/s><a[^>]+>tw\/somelist<\/a>/), "Apply symbolTag to list");
ok(twttr.txt.autoLink("@tw/somelist", { textWithSymbolTag: "b" }).match(/@<a[^>]+><b>tw\/somelist<\/b><\/a>/), "apply textWithSymbolTag to list");
ok(twttr.txt.autoLink("@tw/somelist", { symbolTag: "s", textWithSymbolTag: "b" }).match(/<s>@<\/s><a[^>]+><b>tw\/somelist<\/b><\/a>/), "apply symbolTag and textWithSymbolTag to list");
same(twttr.txt.autoLink("@tw/somelist", { usernameIncludeSymbol: true }), "<a class=\"tweet-url list-slug\" href=\"https://twitter.com/tw/somelist\" rel=\"nofollow\">@tw/somelist</a>",
"Include @ in the autolinked list");
ok(twttr.txt.autoLink("foo @tw/somelist", { listClass: 'custom-list' }).match(/custom-list/), "Override listClass");
ok(!twttr.txt.autoLink("foo @tw/somelist", { usernameClass: 'custom-user' }).match(/custom-user/), "Override usernameClass should not be applied to a List");

// Hashtag Overrides
ok(twttr.txt.autoLink("#hi", { before: "!" }).match(/!<a[^>]+>#hi<\/a>/), "Override before");
ok(twttr.txt.autoLink("#hi", { hash: "!" }).match(/<a[^>]+>!hi<\/a>/), "Override hash");
ok(twttr.txt.autoLink("#hi", { preText: "<b>" }).match(/<a[^>]+>#<b>hi<\/a>/), "Override preText");
ok(twttr.txt.autoLink("#hi", { postText: "</b>" }).match(/<a[^>]+>#hi<\/b><\/a>/), "Override postText");
ok(twttr.txt.autoLink("#hi", { symbolTag: "s" }).match(/<a[^>]+><s>#<\/s>hi<\/a>/), "Apply symbolTag to hash");
ok(twttr.txt.autoLink("#hi", { textWithSymbolTag: "b" }).match(/<a[^>]+>#<b>hi<\/b><\/a>/), "Apply textWithSymbolTag to hash");
ok(twttr.txt.autoLink("#hi", { symbolTag: "s", textWithSymbolTag: "b" }).match(/<a[^>]+><s>#<\/s><b>hi<\/b><\/a>/), "Apply symbolTag and textWithSymbolTag to hash");

// url entities
var autoLinkResult = twttr.txt.autoLink("http://t.co/0JG5Mcq", {
Expand Down Expand Up @@ -187,7 +184,7 @@ test("twttr.txt.autolink", function() {
}

same(twttr.txt.autoLink("\uD801\uDC00 #hashtag \uD801\uDC00 @mention \uD801\uDC00 http://twitter.com"),
"\uD801\uDC00 <a href=\"https://twitter.com/#!/search?q=%23hashtag\" title=\"#hashtag\" class=\"tweet-url hashtag\" rel=\"nofollow\">#hashtag</a> \uD801\uDC00 @<a class=\"tweet-url username\" data-screen-name=\"mention\" href=\"https://twitter.com/mention\" rel=\"nofollow\">mention</a> \uD801\uDC00 <a href=\"http://twitter.com\" rel=\"nofollow\" >http://twitter.com</a>",
"\uD801\uDC00 <a href=\"https://twitter.com/#!/search?q=%23hashtag\" title=\"#hashtag\" class=\"tweet-url hashtag\" rel=\"nofollow\">#hashtag</a> \uD801\uDC00 @<a class=\"tweet-url username\" href=\"https://twitter.com/mention\" data-screen-name=\"mention\" rel=\"nofollow\">mention</a> \uD801\uDC00 <a href=\"http://twitter.com\" rel=\"nofollow\">http://twitter.com</a>",
"Autolink hashtag/mentionURL w/ Supplementary character");
});

Expand Down
97 changes: 43 additions & 54 deletions twitter-text.js
Expand Up @@ -401,67 +401,60 @@ if (typeof twttr === "undefined" || twttr === null) {
return r;
}

twttr.txt.linkToHashtag = function(entity, text, options) {
twttr.txt.linkToTextWithSymbol = function(symbol, text, attributes, options) {
var taggedSymbol = options.symbolTag ? "<" + options.symbolTag + ">" + symbol + "</"+ options.symbolTag + ">" : symbol;
text = twttr.txt.htmlEscape(text);
var taggedText = options.textWithSymbolTag ? "<" + options.textWithSymbolTag + ">" + text + "</"+ options.textWithSymbolTag + ">" : text;

var d = {
hash: text.substring(entity.indices[0], entity.indices[0] + 1),
preText: "",
text: twttr.txt.htmlEscape(entity.hashtag),
postText: "",
extraHtml: options.suppressNoFollow ? "" : HTML_ATTR_NO_FOLLOW
};
for (var k in options) {
if (options.hasOwnProperty(k)) {
d[k] = options[k];
}
}
tagAttr: twttr.txt.extractHtmlAttrsFromOptions(attributes) + (options.htmlAttrs || ""),
taggedSymbol: taggedSymbol,
taggedText: taggedText
};
if (options.usernameIncludeSymbol || !symbol.match(twttr.txt.regexen.atSigns)) {
return stringSupplant("<a#{tagAttr}>#{taggedSymbol}#{taggedText}</a>", d);
} else {
return stringSupplant("#{taggedSymbol}<a#{tagAttr}>#{taggedText}</a>", d);
}
}

twttr.txt.linkToHashtag = function(entity, text, options) {
var hash = text.substring(entity.indices[0], entity.indices[0] + 1);
var hashtag = twttr.txt.htmlEscape(entity.hashtag);
var attrs = {
href: options.hashtagUrlBase + hashtag,
title: "#" + hashtag,
class: options.urlClass + " " + options.hashtagClass
};

return stringSupplant("#{before}<a href=\"#{hashtagUrlBase}#{text}\" title=\"##{text}\" class=\"#{urlClass} #{hashtagClass}\"#{extraHtml}>#{hash}#{preText}#{text}#{postText}</a>", d);
return twttr.txt.linkToTextWithSymbol(hash, hashtag, attrs, options);
};

twttr.txt.linkToCashtag = function(entity, text, options) {
var d = {
preText: "",
text: twttr.txt.htmlEscape(entity.cashtag),
postText: "",
extraHtml: options.suppressNoFollow ? "" : HTML_ATTR_NO_FOLLOW
};
for (var k in options) {
if (options.hasOwnProperty(k)) {
d[k] = options[k];
}
}
var cashtag = twttr.txt.htmlEscape(entity.cashtag);
var attrs = {
href: options.cashtagUrlBase + cashtag,
title: "$" + cashtag,
class: options.urlClass + " " + options.cashtagClass
};

return stringSupplant("#{before}<a href=\"#{cashtagUrlBase}#{text}\" title=\"$#{text}\" class=\"#{urlClass} #{cashtagClass}\"#{extraHtml}>$#{preText}#{text}#{postText}</a>", d);
return twttr.txt.linkToTextWithSymbol("$", cashtag, attrs, options);
};

twttr.txt.linkToMentionAndList = function(entity, text, options) {
var at = text.substring(entity.indices[0], entity.indices[0] + 1);
var d = {
at: options.usernameIncludeSymbol ? "" : at,
at_before_user: options.usernameIncludeSymbol ? at : "",
user: twttr.txt.htmlEscape(entity.screenName),
slashListname: twttr.txt.htmlEscape(entity.listSlug),
extraHtml: options.suppressNoFollow ? "" : HTML_ATTR_NO_FOLLOW,
preChunk: "",
postChunk: ""
var user = twttr.txt.htmlEscape(entity.screenName);
var slashListname = twttr.txt.htmlEscape(entity.listSlug);
var isList = entity.listSlug && !options.suppressLists;
var attrs = {
class: options.urlClass + " " + (isList ? options.listClass : options.usernameClass),
href: isList ? options.listUrlBase + user + slashListname : options.usernameUrlBase + user
};
for (var k in options) {
if (options.hasOwnProperty(k)) {
d[k] = options[k];
}
if (!isList && !options.suppressDataScreenName) {
attrs['data-screen-name'] = user;
}

if (entity.listSlug && !options.suppressLists) {
// the link is a list
var list = d.chunk = stringSupplant("#{user}#{slashListname}", d);
d.list = twttr.txt.htmlEscape(list.toLowerCase());
return stringSupplant("#{before}#{at}<a class=\"#{urlClass} #{listClass}\" href=\"#{listUrlBase}#{list}\"#{extraHtml}>#{preChunk}#{at_before_user}#{chunk}#{postChunk}</a>", d);
} else {
// this is a screen name
d.chunk = d.user;
d.dataScreenName = !options.suppressDataScreenName ? stringSupplant("data-screen-name=\"#{chunk}\" ", d) : "";
return stringSupplant("#{before}#{at}<a class=\"#{urlClass} #{usernameClass}\" #{dataScreenName}href=\"#{usernameUrlBase}#{chunk}\"#{extraHtml}>#{preChunk}#{at_before_user}#{chunk}#{postChunk}</a>", d);
}
return twttr.txt.linkToTextWithSymbol(at, isList ? user + slashListname : user, attrs, options);
};

twttr.txt.linkToUrl = function(entity, text, options) {
Expand All @@ -474,14 +467,11 @@ if (typeof twttr === "undefined" || twttr === null) {
// for each URL instead of it's underlying t.co URL.
var urlEntity = (options.urlEntities && options.urlEntities[url]) || entity;
if (urlEntity.display_url) {
if (!options.title) {
options.htmlAttrs = (options.htmlAttrs || "") + " title=\"" + urlEntity.expanded_url + "\"";
}
linkText = twttr.txt.linkTextWithEntity(urlEntity, options);
}

var d = {
htmlAttrs: options.htmlAttrs,
htmlAttrs: options.htmlAttrs + (!options.title && urlEntity.display_url ? " title=\"" + urlEntity.expanded_url + "\"" : ""),
url: twttr.txt.htmlEscape(url),
linkText: linkText
};
Expand Down Expand Up @@ -576,7 +566,6 @@ if (typeof twttr === "undefined" || twttr === null) {
options.usernameClass = options.usernameClass || DEFAULT_USERNAME_CLASS;
options.usernameUrlBase = options.usernameUrlBase || "https://twitter.com/";
options.listUrlBase = options.listUrlBase || "https://twitter.com/";
options.before = options.before || "";
options.htmlAttrs = twttr.txt.extractHtmlAttrsFromOptions(options);
options.invisibleTagAttrs = options.invisibleTagAttrs || "style='position:absolute;left:-9999px;'";

Expand Down Expand Up @@ -647,7 +636,7 @@ if (typeof twttr === "undefined" || twttr === null) {
v = v ? k : null;
}
if (v == null) continue;
htmlAttrs += stringSupplant(" #{k}=\"#{v}\" ", {k: twttr.txt.htmlEscape(k), v: twttr.txt.htmlEscape(v.toString())});
htmlAttrs += stringSupplant(" #{k}=\"#{v}\"", {k: twttr.txt.htmlEscape(k), v: twttr.txt.htmlEscape(v.toString())});
}
return htmlAttrs;
};
Expand Down

0 comments on commit fb2221a

Please sign in to comment.