@jdeighan/coffee-utils 10.0.6 → 10.0.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@jdeighan/coffee-utils",
3
3
  "type": "module",
4
- "version": "10.0.6",
4
+ "version": "10.0.9",
5
5
  "description": "A set of utility functions for CoffeeScript",
6
6
  "main": "coffee_utils.js",
7
7
  "exports": {
@@ -5,7 +5,7 @@ import readline from 'readline'
5
5
 
6
6
  import {assert, error, croak} from '@jdeighan/unit-tester/utils'
7
7
  import {
8
- undef, defined, isEmpty, isString, isArray, nonEmpty, rtrim,
8
+ undef, pass, defined, isEmpty, isString, isArray, nonEmpty, rtrim,
9
9
  } from '@jdeighan/coffee-utils'
10
10
 
11
11
  # ---------------------------------------------------------------------------
@@ -28,20 +28,45 @@ export blockToArray = (block) ->
28
28
  # ---------------------------------------------------------------------------
29
29
  # toArray - split a block or array into lines w/o newlines
30
30
 
31
- export toArray = (item) ->
31
+ export toArray = (item, option=undef) ->
32
+ # --- Valid options:
33
+ # 'noEmptyLines'
34
+ # 'noLeadingEmptyLines'
32
35
 
33
36
  if isString(item)
34
- return item.split(/\r?\n/)
37
+ lLines = item.split(/\r?\n/)
35
38
  else if isArray(item)
36
- # --- We still need to ensure that no strings contain newlines
37
- lLines = []
38
- for str in item
39
- for substr in toArray(str)
40
- lLines.push substr
41
- return lLines
39
+ lLines = item
42
40
  else
43
41
  croak "Not a string or array"
44
42
 
43
+ # --- We need to ensure that no strings contain newlines
44
+ # and possibly remove empty lines
45
+ lNewLines = []
46
+ nonEmptyFound = false
47
+ for line in lLines
48
+ if isEmpty(line)
49
+ if (option == 'noEmptyLines') \
50
+ || ((option == 'noLeadingEmptyLines') && ! nonEmptyFound)
51
+ pass
52
+ else
53
+ lNewLines.push ''
54
+ else if (line.indexOf("\n") > -1)
55
+ for substr in toArray(line)
56
+ if isEmpty(substr)
57
+ if (option == 'noEmptyLines') \
58
+ || ((option == 'noLeadingEmptyLines') && ! nonEmptyFound)
59
+ pass
60
+ else
61
+ lNewLines.push ''
62
+ else
63
+ nonEmptyFound = true
64
+ lNewLines.push substr
65
+ else
66
+ nonEmptyFound = true
67
+ lNewLines.push line
68
+ return lNewLines
69
+
45
70
  # ---------------------------------------------------------------------------
46
71
  # arrayToBlock - block will have no trailing whitespace
47
72
 
@@ -12,6 +12,7 @@ import {
12
12
 
13
13
  import {
14
14
  undef,
15
+ pass,
15
16
  defined,
16
17
  isEmpty,
17
18
  isString,
@@ -40,25 +41,51 @@ export var blockToArray = function(block) {
40
41
 
41
42
  // ---------------------------------------------------------------------------
42
43
  // toArray - split a block or array into lines w/o newlines
43
- export var toArray = function(item) {
44
- var i, j, lLines, len1, len2, ref, str, substr;
44
+ export var toArray = function(item, option = undef) {
45
+ var i, j, lLines, lNewLines, len1, len2, line, nonEmptyFound, ref, substr;
46
+ // --- Valid options:
47
+ // 'noEmptyLines'
48
+ // 'noLeadingEmptyLines'
45
49
  if (isString(item)) {
46
- return item.split(/\r?\n/);
50
+ lLines = item.split(/\r?\n/);
47
51
  } else if (isArray(item)) {
48
- // --- We still need to ensure that no strings contain newlines
49
- lLines = [];
50
- for (i = 0, len1 = item.length; i < len1; i++) {
51
- str = item[i];
52
- ref = toArray(str);
52
+ lLines = item;
53
+ } else {
54
+ croak("Not a string or array");
55
+ }
56
+ // --- We need to ensure that no strings contain newlines
57
+ // and possibly remove empty lines
58
+ lNewLines = [];
59
+ nonEmptyFound = false;
60
+ for (i = 0, len1 = lLines.length; i < len1; i++) {
61
+ line = lLines[i];
62
+ if (isEmpty(line)) {
63
+ if ((option === 'noEmptyLines') || ((option === 'noLeadingEmptyLines') && !nonEmptyFound)) {
64
+ pass;
65
+ } else {
66
+ lNewLines.push('');
67
+ }
68
+ } else if (line.indexOf("\n") > -1) {
69
+ ref = toArray(line);
53
70
  for (j = 0, len2 = ref.length; j < len2; j++) {
54
71
  substr = ref[j];
55
- lLines.push(substr);
72
+ if (isEmpty(substr)) {
73
+ if ((option === 'noEmptyLines') || ((option === 'noLeadingEmptyLines') && !nonEmptyFound)) {
74
+ pass;
75
+ } else {
76
+ lNewLines.push('');
77
+ }
78
+ } else {
79
+ nonEmptyFound = true;
80
+ lNewLines.push(substr);
81
+ }
56
82
  }
83
+ } else {
84
+ nonEmptyFound = true;
85
+ lNewLines.push(line);
57
86
  }
58
- return lLines;
59
- } else {
60
- return croak("Not a string or array");
61
87
  }
88
+ return lNewLines;
62
89
  };
63
90
 
64
91
  // ---------------------------------------------------------------------------
@@ -223,6 +223,22 @@ export nonEmpty = (x) ->
223
223
 
224
224
  # ---------------------------------------------------------------------------
225
225
 
226
+ export notInArray = (lItems, item) ->
227
+
228
+ return (lItems.indexOf(item) == -1)
229
+
230
+ # ---------------------------------------------------------------------------
231
+
232
+ export pushCond = (lItems, item, doPush=notInArray) ->
233
+
234
+ if doPush(lItems, item)
235
+ lItems.push item
236
+ return true
237
+ else
238
+ return false
239
+
240
+ # ---------------------------------------------------------------------------
241
+
226
242
  export words = (str) ->
227
243
 
228
244
  return str.trim().split(/\s+/)
@@ -236,6 +236,21 @@ export var nonEmpty = function(x) {
236
236
  }
237
237
  };
238
238
 
239
+ // ---------------------------------------------------------------------------
240
+ export var notInArray = function(lItems, item) {
241
+ return lItems.indexOf(item) === -1;
242
+ };
243
+
244
+ // ---------------------------------------------------------------------------
245
+ export var pushCond = function(lItems, item, doPush = notInArray) {
246
+ if (doPush(lItems, item)) {
247
+ lItems.push(item);
248
+ return true;
249
+ } else {
250
+ return false;
251
+ }
252
+ };
253
+
239
254
  // ---------------------------------------------------------------------------
240
255
  export var words = function(str) {
241
256
  return str.trim().split(/\s+/);
@@ -88,6 +88,7 @@ export indented = (input, level=1, oneIndent="\t") ->
88
88
 
89
89
  # ---------------------------------------------------------------------------
90
90
  # undented - string with 1st line indentation removed for each line
91
+ # - ignore leading empty lines
91
92
  # - unless level is set, in which case exactly that
92
93
  # indentation is removed
93
94
  # - returns same type as text, i.e. either string or array
@@ -97,9 +98,12 @@ export undented = (input, level=undef, oneIndent="\t") ->
97
98
  if defined(level) && (level==0)
98
99
  return input
99
100
 
100
- lLines = toArray(input)
101
+ lLines = toArray(input, 'noLeadingEmptyLines')
101
102
  if (lLines.length == 0)
102
- return ''
103
+ if isString(input)
104
+ return ''
105
+ else
106
+ return []
103
107
 
104
108
  # --- determine what to remove from beginning of each line
105
109
  if defined(level)
@@ -108,6 +108,7 @@ export var indented = function(input, level = 1, oneIndent = "\t") {
108
108
 
109
109
  // ---------------------------------------------------------------------------
110
110
  // undented - string with 1st line indentation removed for each line
111
+ // - ignore leading empty lines
111
112
  // - unless level is set, in which case exactly that
112
113
  // indentation is removed
113
114
  // - returns same type as text, i.e. either string or array
@@ -116,9 +117,13 @@ export var undented = function(input, level = undef, oneIndent = "\t") {
116
117
  if (defined(level) && (level === 0)) {
117
118
  return input;
118
119
  }
119
- lLines = toArray(input);
120
+ lLines = toArray(input, 'noLeadingEmptyLines');
120
121
  if (lLines.length === 0) {
121
- return '';
122
+ if (isString(input)) {
123
+ return '';
124
+ } else {
125
+ return [];
126
+ }
122
127
  }
123
128
  // --- determine what to remove from beginning of each line
124
129
  if (defined(level)) {