@jdeighan/coffee-utils 8.0.11 → 8.0.14

Sign up to get free protection for your applications and to get access to all the features.
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@jdeighan/coffee-utils",
3
3
  "type": "module",
4
- "version": "8.0.11",
4
+ "version": "8.0.14",
5
5
  "description": "A set of utility functions for CoffeeScript",
6
6
  "main": "coffee_utils.js",
7
7
  "exports": {
@@ -55,6 +55,6 @@
55
55
  "svelte": "^3.49.0"
56
56
  },
57
57
  "devDependencies": {
58
- "@jdeighan/unit-tester": "^2.0.12"
58
+ "@jdeighan/unit-tester": "^2.0.14"
59
59
  }
60
60
  }
@@ -15,34 +15,45 @@ export splitPrefix = (line) ->
15
15
  lMatches = line.match(/^(\s*)(.*)$/)
16
16
  return [lMatches[1], lMatches[2]]
17
17
 
18
- # ---------------------------------------------------------------------------
19
- # NOTE: Currently, only TAB indentation is supported
20
18
  # ---------------------------------------------------------------------------
21
19
  # splitLine - separate a line into [level, line]
22
20
 
23
- export splitLine = (line) ->
21
+ export splitLine = (line, oneIndent="\t") ->
24
22
 
25
23
  [prefix, str] = splitPrefix(line)
26
- return [indentLevel(prefix), str]
24
+ return [indentLevel(prefix, oneIndent), str]
27
25
 
28
26
  # ---------------------------------------------------------------------------
29
27
  # indentation - return appropriate indentation string for given level
30
28
  # export only to allow unit testing
31
29
 
32
- export indentation = (level) ->
30
+ export indentation = (level, oneIndent="\t") ->
33
31
 
34
32
  assert (level >= 0), "indentation(): negative level"
35
- return '\t'.repeat(level)
33
+ return oneIndent.repeat(level)
36
34
 
37
35
  # ---------------------------------------------------------------------------
38
36
  # indentLevel - determine indent level of a string
39
37
  # it's OK if the string is ONLY indentation
40
38
 
41
- export indentLevel = (line) ->
39
+ export indentLevel = (line, oneIndent="\t") ->
40
+
41
+ len = oneIndent.length
42
+
43
+ # --- This will always match
44
+ if lMatches = line.match(/^(\s*)/)
45
+ prefix = lMatches[1]
46
+ prefixLen = prefix.length
47
+
48
+ remain = prefixLen % len
49
+ if (remain != 0)
50
+ throw new Error("prefix #{OL(prefix)} not a mult of #{OL(oneIndent)}")
51
+
52
+ level = prefixLen / len
53
+ if (prefix != oneIndent.repeat(level))
54
+ throw new Error("prefix #{OL(prefix)} not a mult of #{OL(oneIndent)}")
42
55
 
43
- assert isString(line), "indentLevel(): non-string #{OL(line)}"
44
- lMatches = line.match(/^\t*/)
45
- return lMatches[0].length
56
+ return level
46
57
 
47
58
  # ---------------------------------------------------------------------------
48
59
  # isUndented - true iff indentLevel(line) == 0
@@ -50,19 +61,19 @@ export indentLevel = (line) ->
50
61
  export isUndented = (line) ->
51
62
 
52
63
  assert isString(line), "non-string #{OL(line)}"
53
- lMatches = line.match(/^\t*/)
64
+ lMatches = line.match(/^\s*/)
54
65
  return (lMatches[0].length == 0)
55
66
 
56
67
  # ---------------------------------------------------------------------------
57
68
  # indented - add indentation to each string in a block
58
69
 
59
- export indented = (input, level=1) ->
70
+ export indented = (input, level=1, oneIndent="\t") ->
60
71
 
61
72
  assert (level >= 0), "indented(): negative level"
62
73
  if level == 0
63
74
  return input
64
75
 
65
- toAdd = indentation(level)
76
+ toAdd = indentation(level, oneIndent)
66
77
  if isArray(input)
67
78
  lInputLines = input
68
79
  else
@@ -81,7 +92,7 @@ export indented = (input, level=1) ->
81
92
  # indentation is removed
82
93
  # - returns same type as text, i.e. either string or array
83
94
 
84
- export undented = (text, level=undef) ->
95
+ export undented = (text, level=undef, oneIndent="\t") ->
85
96
 
86
97
  if defined(level) && (level==0)
87
98
  return text
@@ -102,7 +113,7 @@ export undented = (text, level=undef) ->
102
113
  # --- determine what to remove from beginning of each line
103
114
  if defined(level)
104
115
  assert isInteger(level), "undented(): level must be an integer"
105
- toRemove = indentation(level)
116
+ toRemove = indentation(level, oneIndent)
106
117
  else
107
118
  lMatches = lLines[0].match(/^\s*/)
108
119
  toRemove = lMatches[0]
@@ -113,9 +124,8 @@ export undented = (text, level=undef) ->
113
124
  if isEmpty(line)
114
125
  lNewLines.push('')
115
126
  else
116
- assert (line.indexOf(toRemove)==0),
117
- "undented(): Error removing '#{escapeStr(toRemove)}' \
118
- from #{OL(text)}"
127
+ if (line.indexOf(toRemove) != 0)
128
+ throw new Error("remove #{OL(toRemove)} from #{OL(text)}")
119
129
  lNewLines.push(line.substr(nToRemove))
120
130
 
121
131
  if isString(text)
@@ -28,32 +28,42 @@ export var splitPrefix = function(line) {
28
28
  return [lMatches[1], lMatches[2]];
29
29
  };
30
30
 
31
- // ---------------------------------------------------------------------------
32
- // NOTE: Currently, only TAB indentation is supported
33
31
  // ---------------------------------------------------------------------------
34
32
  // splitLine - separate a line into [level, line]
35
- export var splitLine = function(line) {
33
+ export var splitLine = function(line, oneIndent = "\t") {
36
34
  var prefix, str;
37
35
  [prefix, str] = splitPrefix(line);
38
- return [indentLevel(prefix), str];
36
+ return [indentLevel(prefix, oneIndent), str];
39
37
  };
40
38
 
41
39
  // ---------------------------------------------------------------------------
42
40
  // indentation - return appropriate indentation string for given level
43
41
  // export only to allow unit testing
44
- export var indentation = function(level) {
42
+ export var indentation = function(level, oneIndent = "\t") {
45
43
  assert(level >= 0, "indentation(): negative level");
46
- return '\t'.repeat(level);
44
+ return oneIndent.repeat(level);
47
45
  };
48
46
 
49
47
  // ---------------------------------------------------------------------------
50
48
  // indentLevel - determine indent level of a string
51
49
  // it's OK if the string is ONLY indentation
52
- export var indentLevel = function(line) {
53
- var lMatches;
54
- assert(isString(line), `indentLevel(): non-string ${OL(line)}`);
55
- lMatches = line.match(/^\t*/);
56
- return lMatches[0].length;
50
+ export var indentLevel = function(line, oneIndent = "\t") {
51
+ var lMatches, len, level, prefix, prefixLen, remain;
52
+ len = oneIndent.length;
53
+ // --- This will always match
54
+ if (lMatches = line.match(/^(\s*)/)) {
55
+ prefix = lMatches[1];
56
+ prefixLen = prefix.length;
57
+ }
58
+ remain = prefixLen % len;
59
+ if (remain !== 0) {
60
+ throw new Error(`prefix ${OL(prefix)} not a mult of ${OL(oneIndent)}`);
61
+ }
62
+ level = prefixLen / len;
63
+ if (prefix !== oneIndent.repeat(level)) {
64
+ throw new Error(`prefix ${OL(prefix)} not a mult of ${OL(oneIndent)}`);
65
+ }
66
+ return level;
57
67
  };
58
68
 
59
69
  // ---------------------------------------------------------------------------
@@ -61,28 +71,28 @@ export var indentLevel = function(line) {
61
71
  export var isUndented = function(line) {
62
72
  var lMatches;
63
73
  assert(isString(line), `non-string ${OL(line)}`);
64
- lMatches = line.match(/^\t*/);
74
+ lMatches = line.match(/^\s*/);
65
75
  return lMatches[0].length === 0;
66
76
  };
67
77
 
68
78
  // ---------------------------------------------------------------------------
69
79
  // indented - add indentation to each string in a block
70
- export var indented = function(input, level = 1) {
80
+ export var indented = function(input, level = 1, oneIndent = "\t") {
71
81
  var lInputLines, lLines, line, toAdd;
72
82
  assert(level >= 0, "indented(): negative level");
73
83
  if (level === 0) {
74
84
  return input;
75
85
  }
76
- toAdd = indentation(level);
86
+ toAdd = indentation(level, oneIndent);
77
87
  if (isArray(input)) {
78
88
  lInputLines = input;
79
89
  } else {
80
90
  lInputLines = blockToArray(input);
81
91
  }
82
92
  lLines = (function() {
83
- var i, len, results;
93
+ var i, len1, results;
84
94
  results = [];
85
- for (i = 0, len = lInputLines.length; i < len; i++) {
95
+ for (i = 0, len1 = lInputLines.length; i < len1; i++) {
86
96
  line = lInputLines[i];
87
97
  if (isEmpty(line)) {
88
98
  results.push("");
@@ -100,8 +110,8 @@ export var indented = function(input, level = 1) {
100
110
  // - unless level is set, in which case exactly that
101
111
  // indentation is removed
102
112
  // - returns same type as text, i.e. either string or array
103
- export var undented = function(text, level = undef) {
104
- var i, j, lLines, lMatches, lNewLines, len, len1, line, nToRemove, toRemove;
113
+ export var undented = function(text, level = undef, oneIndent = "\t") {
114
+ var i, j, lLines, lMatches, lNewLines, len1, len2, line, nToRemove, toRemove;
105
115
  if (defined(level) && (level === 0)) {
106
116
  return text;
107
117
  }
@@ -112,7 +122,7 @@ export var undented = function(text, level = undef) {
112
122
  }
113
123
  } else if (isArray(text)) {
114
124
  lLines = text;
115
- for (i = 0, len = lLines.length; i < len; i++) {
125
+ for (i = 0, len1 = lLines.length; i < len1; i++) {
116
126
  line = lLines[i];
117
127
  assert(isString(line), "undented(): array not all strings");
118
128
  }
@@ -125,19 +135,21 @@ export var undented = function(text, level = undef) {
125
135
  // --- determine what to remove from beginning of each line
126
136
  if (defined(level)) {
127
137
  assert(isInteger(level), "undented(): level must be an integer");
128
- toRemove = indentation(level);
138
+ toRemove = indentation(level, oneIndent);
129
139
  } else {
130
140
  lMatches = lLines[0].match(/^\s*/);
131
141
  toRemove = lMatches[0];
132
142
  }
133
143
  nToRemove = indentLevel(toRemove);
134
144
  lNewLines = [];
135
- for (j = 0, len1 = lLines.length; j < len1; j++) {
145
+ for (j = 0, len2 = lLines.length; j < len2; j++) {
136
146
  line = lLines[j];
137
147
  if (isEmpty(line)) {
138
148
  lNewLines.push('');
139
149
  } else {
140
- assert(line.indexOf(toRemove) === 0, `undented(): Error removing '${escapeStr(toRemove)}' from ${OL(text)}`);
150
+ if (line.indexOf(toRemove) !== 0) {
151
+ throw new Error(`remove ${OL(toRemove)} from ${OL(text)}`);
152
+ }
141
153
  lNewLines.push(line.substr(nToRemove));
142
154
  }
143
155
  }
@@ -153,10 +165,10 @@ export var undented = function(text, level = undef) {
153
165
  // if numSpaces is not defined, then the first line
154
166
  // that contains at least one space sets it
155
167
  export var tabify = function(str, numSpaces = undef) {
156
- var _, i, lLines, len, level, prefix, prefixLen, ref, result, theRest;
168
+ var _, i, lLines, len1, level, prefix, prefixLen, ref, result, theRest;
157
169
  lLines = [];
158
170
  ref = blockToArray(str);
159
- for (i = 0, len = ref.length; i < len; i++) {
171
+ for (i = 0, len1 = ref.length; i < len1; i++) {
160
172
  str = ref[i];
161
173
  [_, prefix, theRest] = str.match(/^(\s*)(.*)$/);
162
174
  prefixLen = prefix.length;