link-styler
Version:
JavaScript package that simplifies the task of identifying links within text and applying custom styling by automatically replacing them with tags.
212 lines (199 loc) • 7.89 kB
text/typescript
import { Data } from '../constants/data';
import { Setting } from '../interface';
export function convertTextLink(t: string, setting: Setting): string {
const text = t;
const regexLink =
/(https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s]{2,}|www\.[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s]{2,}|https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9]+\.[^\s]{2,}|www\.[a-zA-Z0-9]+\.[^\s]{2,})/g;
const regexAtsign = /([@])\w+/g;
const regexHashTag = /([#])\w+/g;
let replacedText = text;
// Find all links within the text and replace them with their titles
let match;
while ((match = regexLink.exec(text)) !== null) {
const link = match[0];
try {
let url = new URL(link);
let hostName = url.hostname.split('.').slice(-2).join('.');
let displayHostName = url.hostname.replace('www.', '');
let icon = Data[hostName] ? Data[hostName].svg : Data['defualt'].svg;
let displayLink = `<span style='font-weight: bold;'>${displayHostName}</span>${
url.pathname.length > setting.link.pathnameLengthLimit
? url.pathname.substring(0, setting.link.pathnameLengthLimit) + '...'
: url.pathname
}`;
let replaceText = `<span style="
position: relative;
${
setting.link?.bg ?? setting.bg
? `background: ${
setting.link?.bgColor ?? setting.bgColor
}`
: ``
};
padding: 0px 3px;
border-radius: ${
setting.link?.borderRadius ?? setting.borderRadius
}px;
align-items: center;
white-space: nowrap;
font-size: 0.9em;
">
${
setting.link?.showIcon ?? setting.showIcon
? `<span style="
position: absolute;
top: 3px;
color: ${
setting.link?.iconColor ?? setting.iconColor
? Data[hostName]
? Data[hostName].color
: setting.link?.textColor ?? setting.textColor
: setting.link?.textColor ?? setting.textColor
};
margin-left: 2px;
">
` +
icon +
`
</span>`
: ``
}
<a href="${link}" style="
${setting.showIcon ? `margin-left: 21px;` : ``}
${
setting.link?.underline ?? setting.underline
? `text-decoration: underline`
: `text-decoration: none`
};
color: ${setting.link?.textColor ?? setting.textColor};
" title="${link}">${displayLink}</a>
</span>`;
replacedText = replacedText.replace(link, replaceText);
} catch (error) {
console.error(`Error fetching link title: ${error}`);
}
}
if (setting.hashTag && setting.hashTag.enable) {
while ((match = regexHashTag.exec(text)) !== null) {
const hashTag = match[0];
try {
let hashTagText = hashTag.replace('#', '');
let icon = Data['hashTag'].svg;
let displayHashTag = `<span style='font-weight: bold;'>${
setting.hashTag?.removeHashTagChar ? hashTagText : hashTag
}</span>`;
let replaceText = `<span style="
position: relative;
${
setting.hashTag?.bg ?? setting.bg
? `background: ${
setting.hashTag?.bgColor ?? setting.bgColor
}`
: ``
};
padding: 0px 3px;
border-radius: ${
setting.hashTag?.borderRadius ?? setting.borderRadius
}px;
align-items: center;
white-space: nowrap;
font-size: 0.9em;
">
${
setting.hashTag?.showIcon ?? setting.showIcon
? `<span style="
position: absolute;
top: 3px;
color: ${setting.hashTag?.textColor ?? setting.textColor};
margin-left: 2px;
">
` +
icon +
`
</span>`
: ``
}
<a href="${setting.hashTag.path + hashTagText}" style="
${
setting.hashTag?.showIcon ?? setting.showIcon
? `margin-left: 21px;`
: ``
}
${
setting.hashTag?.underline ?? setting.underline
? `text-decoration: underline`
: `text-decoration: none`
};
color: ${setting.hashTag?.textColor ?? setting.textColor};
" title="${
setting.hashTag.path + hashTagText
}">${displayHashTag}</a>
</span>`;
replacedText = replacedText.replace(hashTag, replaceText);
} catch (error) {
console.error(`Error fetching link title: ${error}`);
}
}
}
if (setting.atsign && setting.atsign.enable) {
while ((match = regexAtsign.exec(text)) !== null) {
const atsign = match[0];
try {
let atsignText = atsign.replace('@', '');
let icon = Data['atsign'].svg;
let displayAtsign = `<span style='font-weight: bold;'>${
setting.atsign?.removeAtsignChar ? atsignText : atsign
}</span>`;
let replaceText = `<span style="
position: relative;
${
setting.atsign?.bg ?? setting.bg
? `background: ${
setting.atsign?.bgColor ?? setting.bgColor
}`
: ``
};
padding: 0px 3px;
border-radius: ${
setting.atsign.borderRadius ?? setting.borderRadius
}px;
align-items: center;
white-space: nowrap;
font-size: 0.9em;
">
${
setting.atsign?.showIcon ?? setting.showIcon
? `<span style="
position: absolute;
top: 3px;
color: ${setting.atsign?.textColor ?? setting.textColor};
margin-left: 2px;
">
` +
icon +
`
</span>`
: ``
}
<a href="${setting.atsign.path + atsignText}" style="
${
setting.atsign?.showIcon ?? setting.showIcon
? `margin-left: 21px;`
: ``
}
${
setting.atsign?.underline ?? setting.underline
? `text-decoration: underline`
: `text-decoration: none`
};
color: ${setting.atsign?.textColor ?? setting.textColor};
" title="${setting.atsign.path + atsignText}">${displayAtsign}</a>
</span>`;
replacedText = replacedText.replace(atsign, replaceText);
} catch (error) {
console.error(`Error fetching link title: ${error}`);
}
}
}
return replacedText;
}