File size: 2,338 Bytes
4a288a7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
// @flow

import {
    charHasRotatedVerticalOrientation,
} from './script_detection';

export const verticalizedCharacterMap = {
    '!': '︕',
    '#': '#',
    '$': '$',
    '%': '%',
    '&': '&',
    '(': '︵',
    ')': '︶',
    '*': '*',
    '+': '+',
    ',': '︐',
    '-': '︲',
    '.': '・',
    '/': '/',
    ':': '︓',
    ';': '︔',
    '<': '︿',
    '=': '=',
    '>': '﹀',
    '?': '︖',
    '@': '@',
    '[': '﹇',
    '\\': '\',
    ']': '﹈',
    '^': '^',
    '_': '︳',
    '`': '`',
    '{': '︷',
    '|': '―',
    '}': '︸',
    '~': '~',
    '¢': '¢',
    '£': '£',
    '¥': '¥',
    '¦': '¦',
    '¬': '¬',
    '¯': ' ̄',
    '–': '︲',
    '—': '︱',
    '‘': '﹃',
    '’': '﹄',
    '“': '﹁',
    '”': '﹂',
    '…': '︙',
    '‧': '・',
    '₩': '₩',
    '、': '︑',
    '。': '︒',
    '〈': '︿',
    '〉': '﹀',
    '《': '︽',
    '》': '︾',
    '「': '﹁',
    '」': '﹂',
    '『': '﹃',
    '』': '﹄',
    '【': '︻',
    '】': '︼',
    '〔': '︹',
    '〕': '︺',
    '〖': '︗',
    '〗': '︘',
    '!': '︕',
    '(': '︵',
    ')': '︶',
    ',': '︐',
    '-': '︲',
    '.': '・',
    ':': '︓',
    ';': '︔',
    '<': '︿',
    '>': '﹀',
    '?': '︖',
    '[': '﹇',
    ']': '﹈',
    '_': '︳',
    '{': '︷',
    '|': '―',
    '}': '︸',
    '⦅': '︵',
    '⦆': '︶',
    '。': '︒',
    '「': '﹁',
    '」': '﹂'
};

export default function verticalizePunctuation(input: string) {
    let output = '';

    for (let i = 0; i < input.length; i++) {
        const nextCharCode = input.charCodeAt(i + 1) || null;
        const prevCharCode = input.charCodeAt(i - 1) || null;

        const canReplacePunctuation = (
            (!nextCharCode || !charHasRotatedVerticalOrientation(nextCharCode) || verticalizedCharacterMap[input[i + 1]]) &&
            (!prevCharCode || !charHasRotatedVerticalOrientation(prevCharCode) || verticalizedCharacterMap[input[i - 1]])
        );

        if (canReplacePunctuation && verticalizedCharacterMap[input[i]]) {
            output += verticalizedCharacterMap[input[i]];
        } else {
            output += input[i];
        }
    }

    return output;
}