File: initial-letter-variants.js

package info (click to toggle)
thunderbird 1%3A140.3.1esr-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 4,608,628 kB
  • sloc: cpp: 7,671,698; javascript: 5,901,131; ansic: 3,898,955; python: 1,413,270; xml: 653,997; asm: 462,284; java: 180,948; sh: 113,489; makefile: 20,460; perl: 14,288; objc: 13,059; yacc: 4,583; pascal: 3,352; lex: 1,720; ruby: 1,222; exp: 762; sql: 715; awk: 580; php: 436; lisp: 430; sed: 70; csh: 10
file content (75 lines) | stat: -rw-r--r-- 2,118 bytes parent folder | download | duplicates (7)
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
window.addEventListener('load', setupInitialLetterTestVariants);

function setupInitialLetterTestVariants() {
  const search = window.location.search;
  if (!search) {
    return;
  }
  const params = new URLSearchParams(search);
  const classes = params.getAll('class')
                  .flatMap(value => value.split(','))
                  .filter(value => value);
  let text = params.getAll('text').join('');
  if (!text) {
    if (classes.indexOf('no-descent') >= 0) {
      text = '\xC9\xC9M\xC9';
    } else if (classes.indexOf('no-ascent') >= 0) {
      text = 'ppMp';
    }
  }

  for (const element of document.getElementsByClassName('sample')) {
    element.classList.add(...classes);
    if (text) {
      replaceTextStart(element, text);
    }
  }
}

// Replace the start of the text content of the node.
// Returns the number of characters replaced.
//
// For example,
// `replaceTextStart(element, 'XY')` to the content:
// ```
// <div>ABC</div>
// ```
// produces:
// ```
// <div>XYC</div>
// ```
//
// It has a limited support for separated text nodes and collapsible spaces.
function replaceTextStart(node, text) {
  if (node.nodeType == Node.TEXT_NODE) {
    const content = node.nodeValue;
    const trimmed_content = content.trimStart();
    if (!trimmed_content) {
      return 0;
    }
    const leading_spaces_len = content.length - trimmed_content.length;
    const len = Math.min(text.length, trimmed_content.length);
    node.nodeValue = content.substring(0, leading_spaces_len) +
                     text.substring(0, len) +
                     trimmed_content.substring(len);
    return len;
  }

  if (node.nodeType == Node.ELEMENT_NODE && node.className.indexOf('fake') >= 0) {
    // If this is a fake initial letter, pretend that one character is replaced.
    return 1;
  }

  let total_replaced = 0;
  for (const child of node.childNodes) {
    const replaced = replaceTextStart(child, text);
    if (replaced) {
      total_replaced += replaced;
      text = text.substring(replaced);
      if (!text) {
        return total_replaced;
      }
    }
  }
  return total_replaced;
}