Skip to content

Instantly share code, notes, and snippets.

@ljanecek
Created July 18, 2021 08:54
Show Gist options
  • Save ljanecek/3163ecbdc7d16db27f6c8554dc365d9e to your computer and use it in GitHub Desktop.
Save ljanecek/3163ecbdc7d16db27f6c8554dc365d9e to your computer and use it in GitHub Desktop.
Typography
const Typography = (str) => {
const quotes = {
singleQuotes: ["\u{201A}", "\u{2018}"],
doubleQuotes: ["\u{201E}", "\u{201C}"],
};
const pattern = 'A-Za-z\\x\{C0\}-\\x\{2FF\}\\x\{370\}-\\x\{1EFF\}';
var patterns = [{
request: /(?<![.\\x\{2026\}])\.{3,4}(?![.\\x\{2026\}])/mu,
replace: "\u{2026}"
}, // ellipsis ...
{
request: /(?<=[\d ]|^)-(?=[\d ]|$)/,
replace: "\u{2013}"
}, // en dash 123-123
{
request: /(?<=[^!*+,/:;<:@\\\\_|-])--(?=[^!*+,/:;<:@\\\\_|-])/,
replace: "\u{2013}"
}, // en dash alphanum--alphanum
{
request: /,-/,
replace: ",\u{2013}"
}, // en dash ,-
{
request: /(?<!\d)(\d{1,2}\.) (\d{1,2}\.) (\d\d)/,
replace: "\$1\u{A0}\$2\u{A0}\$3"
}, // date 23. 1. 1978
{
request: /(?<!\d)(\d{1,2}\.) (\d{1,2}\.)/,
replace: "\$1\u{A0}\$2"
}, // date 23. 1.
{
request: / --- /,
replace: "\u{A0}\u{2014} "
}, // em dash ---
{
request: / ([\\x\{2013\}\\x\{2014\}])/u,
replace: "\u{A0}\$1"
}, // &nbsp; behind dash (dash stays at line end)
{
request: / <-{1,2}> /,
replace: " \u{2194} "
}, // left right arrow <-->
{
request: /-{1,}> /,
replace: "\u{2192} "
}, // right arrow -->
{
request: / <-{1,}/,
replace: " \u{2190} "
}, // left arrow <--
{
request: /={1,}> /,
replace: "\u{21D2} "
}, // right arrow =:
{
request: /\+-/,
replace: "\u{B1}"
}, // +-
{
request: /(\d+) x (?=\d)/,
replace: "\$1\u{A0}\u{D7}\u{A0}"
}, // dimension sign 123 x 123...
{
request: /(\d+)x(?=\d)/,
replace: "\$1\u{D7}"
}, // dimension sign 123x123...
{
request: /(?<=\d)x(?= |,|.|$)/m,
replace: "\u{D7}"
}, // dimension sign 123x
{
request: /(\S ?)\(TM\)/i,
replace: "\$1\u{2122}"
}, // trademark (TM)
{
request: /(\S ?)\(R\)/i,
replace: "\$1\u{AE}"
}, // registered (R)
{
request: /\(C\)( ?\S)/i,
replace: "\u{A9}\$1"
}, // copyright (C)
{
request: /\(EUR\)/,
replace: "\u{20AC}"
}, // Euro (EUR)
{
request: /(\d) (?=\d{3})/,
replace: "\$1\u{A0}"
}, // (phone) number 1 123 123 123...
// CONTENT_MARKUP mark: \x17-\x1F, CONTENT_REPLACED mark: \x16, CONTENT_TEXTUAL mark: \x17
{
request: /(?<=[^\s\x17])\s+([\x17-\x1F]+)(?=\s)/u,
replace: '$1'
}, // remove intermarkup space phase 1
{
request: /(?<=\s)([\x17-\x1F]+)\s+/u,
replace: '$1'
}, // remove intermarkup space phase 2
{
request: /(?<=.{50})\s+(?=[\x17-\x1F]*\S{1,6}[\x17-\x1F]*$)/us,
replace: "\u{A0}"
}, // space before last short word
// nbsp space between number (optionally followed by dot) and word, symbol, punctation, currency symbol
{
request: /(?<=^| |\.|,|-|\+|\x16|\(|\d\\x\{A0\})([\x17-\x1F]*\d+\.?[\x17-\x1F]*)\s+(?=[\x17-\x1F]*[%A-Za-z\\x\{C0\}/-\\x\{2FF\}\\x\{370\}/-\\x\{1EFF\}\\x\{b0\}/-\\x\{be\}\\x\{2020\}/-\\x\{214f\}])/mu,
replace: "\$1\u{A0}"
},
// space between preposition and word
{
request: /(?<=^|[^0-9A-Za-z\\x\{C0\}/-\\x\{2FF\}\\x\{370\}/-\\x\{1EFF\}])([\x17-\x1F]*[ksvzouiKSVZOUIA][\x17-\x1F]*)\s+(?=[\x17-\x1F]*[0-9A-Za-z\\x\{C0\}/-\\x\{2FF\}\\x\{370\}/-\\x\{1EFF\}])/mus,
replace: "\$1\u{A0}"
},
];
for (var i in patterns) {
str = str.replace(patterns[i].request, patterns[i].replace)
}
return str;
};
export default Typography;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment