@jdeighan/coffee-utils 10.0.5 → 10.0.8

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": "10.0.5",
4
+ "version": "10.0.8",
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
  // ---------------------------------------------------------------------------
@@ -21,6 +21,13 @@ export isComment = (line) ->
21
21
 
22
22
  # ---------------------------------------------------------------------------
23
23
 
24
+ export isSubclassOf = (subClass, superClass) ->
25
+
26
+ return (subClass == superClass) \
27
+ || (subClass.prototype instanceof superClass)
28
+
29
+ # ---------------------------------------------------------------------------
30
+
24
31
  export eval_expr = (str) ->
25
32
 
26
33
  str = str.replace(/\bundef\b/g, 'undefined')
@@ -27,6 +27,11 @@ export var isComment = function(line) {
27
27
  return defined(lMatches);
28
28
  };
29
29
 
30
+ // ---------------------------------------------------------------------------
31
+ export var isSubclassOf = function(subClass, superClass) {
32
+ return (subClass === superClass) || (subClass.prototype instanceof superClass);
33
+ };
34
+
30
35
  // ---------------------------------------------------------------------------
31
36
  export var eval_expr = function(str) {
32
37
  str = str.replace(/\bundef\b/g, 'undefined');
@@ -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)) {