@jscad/dxf-deserializer 2.3.22 → 3.0.0-alpha.0

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,22 +1,27 @@
1
1
  {
2
2
  "name": "@jscad/dxf-deserializer",
3
- "version": "2.3.22",
3
+ "version": "3.0.0-alpha.0",
4
4
  "description": "DXF Deserializer for JSCAD",
5
5
  "homepage": "https://openjscad.xyz/",
6
6
  "repository": "https://github.com/jscad/OpenJSCAD.org",
7
- "main": "index.js",
7
+ "type": "module",
8
+ "main": "src/index.js",
9
+ "unpkg": "dist/jscad-dxf-deserializer.min.js",
10
+ "module": "dist/jscad-dxf-deserializer.es.js",
8
11
  "scripts": {
9
- "coverage": "nyc --all --reporter=html --reporter=text npm test",
10
- "test": "ava --verbose --timeout 2m './tests/test*.js'"
12
+ "build": "rollup --config",
13
+ "coverage": "c8 --all --reporter=html --reporter=text pnpm test",
14
+ "test": "ava --verbose --timeout 2m './tests/test*.js'",
15
+ "version": "pnpm run build && git add dist"
11
16
  },
12
17
  "contributors": [
13
18
  {
14
19
  "name": "z3dev",
15
- "url": "http://www.z3d.jp"
20
+ "url": "https://github.com/z3dev"
16
21
  },
17
22
  {
18
23
  "name": "Mark 'kaosat-dev' Moissette",
19
- "url": "http://kaosat.net"
24
+ "url": "https://github.com/kaosat-dev"
20
25
  }
21
26
  ],
22
27
  "keywords": [
@@ -28,11 +33,16 @@
28
33
  ],
29
34
  "license": "MIT",
30
35
  "dependencies": {
31
- "@jscad/modeling": "2.12.0"
36
+ "@jscad/modeling": "3.0.0-alpha.0"
32
37
  },
33
38
  "devDependencies": {
34
- "ava": "3.15.0",
35
- "nyc": "15.1.0"
39
+ "@rollup/plugin-node-resolve": "^15.2.1",
40
+ "@rollup/plugin-terser": "^0.4.3",
41
+ "ava": "^4.3.3",
42
+ "c8": "^8.0.0",
43
+ "rollup": "^2.79.1",
44
+ "rollup-plugin-banner": "^0.2.1",
45
+ "rollup-plugin-version-injector": "^1.3.3"
36
46
  },
37
- "gitHead": "e269f212db5a00cda740d2f7ad3e5206d1eb839f"
47
+ "gitHead": "3656d36ed9cd738ab884e86aae5a2ce08d52adf7"
38
48
  }
@@ -0,0 +1,27 @@
1
+ import banner from 'rollup-plugin-banner'
2
+ import { nodeResolve } from '@rollup/plugin-node-resolve'
3
+ import versionInjector from 'rollup-plugin-version-injector'
4
+ import terser from '@rollup/plugin-terser'
5
+
6
+ export default {
7
+ input: 'src/index.js',
8
+
9
+ output: [
10
+ {
11
+ file: 'dist/jscad-dxf-deserializer.min.js',
12
+ format: 'umd',
13
+ name: 'jscadDxfDeserializer'
14
+ },
15
+ {
16
+ file: 'dist/jscad-dxf-deserializer.es.js',
17
+ format: 'es'
18
+ }
19
+ ],
20
+
21
+ plugins: [
22
+ nodeResolve(),
23
+ banner('<%= pkg.description %>\n@module <%= pkg.name %>\n@version <%= pkg.version %>\n@license <%= pkg.license %>'),
24
+ versionInjector({ injectInComments: { fileRegexp: /\.(html)$/ }, logLevel: 'warn' }),
25
+ terser({ compress: { module: true }, mangle: false, format: { comments: 'some'} })
26
+ ]
27
+ }
@@ -0,0 +1,241 @@
1
+ export const reader = (options) => new DxfReader(options)
2
+
3
+ const STATES = [
4
+ 'start',
5
+ 'end',
6
+ 'error'
7
+ ]
8
+
9
+ /**
10
+ * Class DxfReader
11
+ * A class to hold state while reading DXF formatted data.
12
+ * @param {Object} [options] - options for parsing
13
+ * @param {Boolean} [options.track=true] - track position for error reporting
14
+ * @param {Boolean} [options.strict=false] - obey strict DXF specifications
15
+ * @constructor
16
+ *
17
+ * @example
18
+ * const dxfPath = path.resolve(__dirname, 'circle10.dxf')
19
+ * let src = fs.readFileSync(dxfPath, 'UTF8')
20
+ * let reader = dxf.reader({track: true})
21
+ * // setup state handling
22
+ * reader.on('error',handleError)
23
+ * reader.on('start',handleStart)
24
+ * reader.on('end' ,handleEnd)
25
+ * // setup handling for groups of interest, skip the rest
26
+ * reader.absorb(0,handleEntity)
27
+ * // start the reader
28
+ * reader.write(src).close()
29
+ */
30
+ export class DxfReader {
31
+ constructor (options) {
32
+ const defaults = {
33
+ strict: false,
34
+ track: true
35
+ }
36
+ this.options = Object.assign({ }, defaults, options)
37
+
38
+ this.trackPosition = this.options.track
39
+ if (this.trackPosition) {
40
+ this.line = 0
41
+ this.column = 0
42
+ this.c = 0
43
+ }
44
+ }
45
+
46
+ // set a handler for the given state
47
+ // see dxf.STATES above
48
+ on (state, callback) {
49
+ // verify the state
50
+ // set the callback
51
+ this['on' + state] = callback
52
+ return this
53
+ }
54
+
55
+ // set a handler for the given group and value
56
+ absorb (group, callback) {
57
+ if (this.absorbers === undefined) {
58
+ this.absorbers = new Map()
59
+ }
60
+ this.absorbers.set(group, callback)
61
+ return this
62
+ }
63
+
64
+ // write the given data into the reader, initiating parsing
65
+ write (data) {
66
+ parse(this, data)
67
+ return this
68
+ }
69
+
70
+ // close and clear all state
71
+ close () {
72
+ this.isclosed = true
73
+ return this
74
+ }
75
+ }
76
+
77
+ //
78
+ // emit the start of processing to the onstart handler if any
79
+ //
80
+ const emitstart = (reader) => emitstate(reader, 'onstart', reader.data)
81
+
82
+ //
83
+ // emit the group (code and value) to asorbers
84
+ //
85
+ const emitgroup = (reader, group, value) => {
86
+ // emit this group to all listeners
87
+ if (reader.absorbers !== undefined) {
88
+ const absorber = reader.absorbers.get(group)
89
+ if (absorber !== undefined) {
90
+ absorber(reader, group, value)
91
+ }
92
+ }
93
+ }
94
+
95
+ //
96
+ // wrap and emit the given error to the onerror handler if any
97
+ //
98
+ const emiterror = (reader, er) => {
99
+ // closeText(reader)
100
+ if (reader.trackPosition) {
101
+ er += `
102
+ Line: ${reader.line}
103
+ Column: ${reader.column}
104
+ Char: ${reader.c}`
105
+ }
106
+ er = new Error(er)
107
+ reader.error = er
108
+ return emitstate(reader, 'onerror', er)
109
+ }
110
+
111
+ //
112
+ // emit the end of processing to the onend handler if any
113
+ //
114
+ const emitend = (reader) => emitstate(reader, 'onend', reader.data)
115
+
116
+ const emitstate = (reader, state, data) => {
117
+ const onhandler = state.toString()
118
+ reader[onhandler] && reader[onhandler](reader, data)
119
+ return reader
120
+ }
121
+
122
+ //
123
+ // parse the given data in the context of the given reader
124
+ //
125
+ const parse = (reader, data) => {
126
+ // check reader state
127
+ if (reader.error) {
128
+ throw reader.error // throw the last error
129
+ }
130
+ if (reader.isclosed) {
131
+ return emiterror(reader, 'Cannot write after close')
132
+ }
133
+
134
+ emitstart(reader)
135
+
136
+ if (data === null) {
137
+ return emitend(reader)
138
+ }
139
+
140
+ // initial state to initiate parsing
141
+ reader.group = null
142
+ reader.value = null
143
+ reader.error = null
144
+
145
+ reader.position = 0
146
+ reader.line = 0
147
+ reader.column = 0
148
+
149
+ // use or convert the data to String
150
+ let i = 0
151
+ let c = ''
152
+ let l = ''
153
+ while (reader.error === null) {
154
+ c = charAt(data, i++)
155
+ if (!c) {
156
+ break
157
+ }
158
+ if (reader.trackPosition) {
159
+ reader.position++
160
+ if (c === '\n') {
161
+ reader.line++
162
+ reader.column = 0
163
+ } else {
164
+ reader.column++
165
+ }
166
+ }
167
+ // dxf files are parsed line by line
168
+ if (c === '\n') {
169
+ parseLine(reader, l)
170
+ l = ''
171
+ } else {
172
+ l += c
173
+ }
174
+ }
175
+ // emit state change
176
+ emitend(reader)
177
+ return reader
178
+ }
179
+
180
+ /**
181
+ * Parse the given line in the context of the given reader, emitting group value pairs
182
+ * @param reader {DxfReader} - context DxfReader to use
183
+ * @param line {String} - line to parse
184
+ */
185
+ const parseLine = (reader, line) => {
186
+ line = line.trim()
187
+ if (reader.group === null) {
188
+ setDxfGroup(reader, line)
189
+ reader.value = null
190
+ } else {
191
+ setDxfValue(reader, line)
192
+ }
193
+ // handle group and value pairs
194
+ if (reader.group !== null && reader.value !== null) {
195
+ // emit events for group and value pairs
196
+ emitgroup(reader, reader.group, reader.value)
197
+
198
+ reader.group = null
199
+ reader.value = null
200
+ }
201
+ }
202
+
203
+ /**
204
+ * Parse the given line in the context of the given reader, and update the group
205
+ * @param reader {DxfReader} - context DxfReader to use
206
+ * @param line {String} - line to parse
207
+ */
208
+ const setDxfGroup = (reader, line) => {
209
+ // groups are numeric
210
+ const code = parseInt(line)
211
+ if (isNaN(code)) {
212
+ emiterror(reader, 'Invalid group (int)')
213
+ reader.group = null
214
+ } else {
215
+ reader.group = code
216
+ }
217
+ }
218
+
219
+ /**
220
+ * Parse the given line in the context of the given reader, and update the (group) value
221
+ * @param reader {DxfReader} - context DxfReader to use
222
+ * @param line {String} - line to parse
223
+ */
224
+ const setDxfValue = (reader, line) => {
225
+ if (reader.options.strict) {
226
+ // TODO evaluate the value based on DXF specifications
227
+ reader.value = line
228
+ } else {
229
+ reader.value = line
230
+ }
231
+ }
232
+
233
+ //
234
+ // helper function to return expected values
235
+ //
236
+ const charAt = (data, i) => {
237
+ if (data && data.length > i) {
238
+ return data.charAt(i)
239
+ }
240
+ return ''
241
+ }
@@ -1,11 +1,5 @@
1
1
  /*
2
2
  AutoCAD Constants
3
-
4
- ## License
5
-
6
- Copyright (c) 2017 Z3 Development https://github.com/z3dev
7
-
8
- All code released under MIT license
9
3
  */
10
4
 
11
5
  //
@@ -35,12 +29,12 @@ const dxfTLA = [
35
29
 
36
30
  const dxfMap = new Map(dxfTLA)
37
31
 
38
- const getTLA = (group) => dxfMap.get(group)
32
+ export const getTLA = (group) => dxfMap.get(group)
39
33
 
40
34
  /*
41
35
  * AutoCAD Drawing Units
42
36
  */
43
- const drawingUnits = [
37
+ export const drawingUnits = [
44
38
  [0, 'none'],
45
39
  [1, 'inches'],
46
40
  [2, 'feet'],
@@ -64,12 +58,5 @@ const drawingUnits = [
64
58
  [20, 'parsecs']
65
59
  ]
66
60
 
67
- const BYBLOCK = 0
68
- const BYLAYER = 256
69
-
70
- module.exports = {
71
- drawingUnits,
72
- BYBLOCK,
73
- BYLAYER,
74
- getTLA
75
- }
61
+ export const BYBLOCK = 0
62
+ export const BYLAYER = 256
@@ -2,7 +2,7 @@
2
2
  * AutoCAD 2014 Color Index (1-255) as RGB + ALPHA colors
3
3
  */
4
4
 
5
- const colorIndex = [
5
+ export const colorIndex = [
6
6
  [0, 0, 0, 255], // index 0, added for easy maintenance
7
7
  // 1
8
8
  [255, 0, 0, 255],
@@ -286,5 +286,3 @@ const colorIndex = [
286
286
  [224, 224, 224, 255],
287
287
  [0, 0, 0, 255]
288
288
  ]
289
-
290
- module.exports = colorIndex
@@ -2,7 +2,7 @@
2
2
  * AutoCAD 2017 2018 Color Index (1-255) as RGB + ALPHA colors
3
3
  */
4
4
 
5
- const colorIndex = [
5
+ export const colorIndex = [
6
6
  [0, 0, 0, 255], // index 0, added for easy maintenance
7
7
  // 1
8
8
  [255, 0, 0, 255],
@@ -286,5 +286,3 @@ const colorIndex = [
286
286
  [204, 204, 204, 255],
287
287
  [255, 255, 255, 255]
288
288
  ]
289
-
290
- module.exports = colorIndex
@@ -1,18 +1,9 @@
1
- /*
2
- ## License
3
-
4
- Copyright (c) 2017-2019 Z3 Development https://github.com/z3dev
5
-
6
- All code released under MIT license
7
-
8
- */
9
-
10
- const { BYBLOCK, BYLAYER } = require('./autocad')
1
+ import { BYBLOCK, BYLAYER } from './autocad.js'
11
2
 
12
3
  //
13
4
  // find the layer referenced by the given object
14
5
  //
15
- const findLayer = (obj, layers) => {
6
+ export const findLayer = (obj, layers) => {
16
7
  const lname = obj.lnam || '0'
17
8
  for (const layer of layers) {
18
9
  if (layer.name === lname) {
@@ -26,7 +17,7 @@ const findLayer = (obj, layers) => {
26
17
  // get the color number of the object, possibly looking at layer
27
18
  // returns -1 if a color number was not found
28
19
  //
29
- const getColorNumber = (obj, layers) => {
20
+ export const getColorNumber = (obj, layers) => {
30
21
  let cn = obj.cnmb || -1
31
22
  if (cn === BYLAYER) {
32
23
  // use the color number from the layer
@@ -50,7 +41,7 @@ const mod = (num, mod) => {
50
41
  //
51
42
  // instantiate color using the given index into the given color index
52
43
  // Note: 0 > index <= length of colorindex
53
- const getColor = (index, colorindex) => {
44
+ export const getColor = (index, colorindex) => {
54
45
  if (index < 1) { return null }
55
46
 
56
47
  index = mod(index, colorindex.length)
@@ -58,9 +49,3 @@ const getColor = (index, colorindex) => {
58
49
  const rgba = [color[0] / 255, color[1] / 255, color[2] / 255, color[3] / 255]
59
50
  return rgba
60
51
  }
61
-
62
- module.exports = {
63
- findLayer,
64
- getColor,
65
- getColorNumber
66
- }
@@ -1,18 +1,10 @@
1
- /*
2
- ## License
1
+ import { BYLAYER, getTLA } from './autocad.js'
2
+ import { colorIndex } from './colorindex2017.js'
3
+ import { DxfReader } from './DxfReader.js'
4
+ import { instantiateAsciiDxf } from './instantiate.js'
5
+ import { translateAsciiDxf } from './translate.js'
3
6
 
4
- Copyright (c) 2017 Z3 Development https://github.com/z3dev
5
-
6
- All code released under MIT license
7
-
8
- */
9
-
10
- const version = require('./package.json').version
11
- const { BYLAYER, getTLA } = require('./autocad')
12
- const colorIndex = require('./colorindex2017')
13
- const dxf = require('./DxfReader')
14
- const { instantiateAsciiDxf } = require('./instantiate')
15
- const translateAsciiDxf = require('./translate')
7
+ const version = '[VI]{version}[/VI]' // version is injected by rollup
16
8
 
17
9
  // //////////////////////////////////////////
18
10
  //
@@ -490,64 +482,65 @@ const handleName = (reader, group, value) => {
490
482
  //
491
483
  const createReader = (src, options) => {
492
484
  // create a reader for the DXF
493
- const reader = dxf.reader(options)
485
+ const dxfreader = new DxfReader(options)
494
486
 
495
487
  // setup event handling from the reader
496
- reader.on('error', handleError)
497
- reader.on('start', handleStart)
498
- reader.on('end', handleEnd)
488
+ dxfreader.on('error', handleError)
489
+ dxfreader.on('start', handleStart)
490
+ dxfreader.on('end', handleEnd)
499
491
 
500
492
  // setup group handling
501
- reader.absorb(0, handleEntity)
502
- reader.absorb(1, handleString)
503
- reader.absorb(2, handleName)
504
- reader.absorb(3, handleName)
505
- reader.absorb(6, handleString)
506
- reader.absorb(7, handleString)
507
- reader.absorb(8, handleString)
508
- reader.absorb(9, handleVariable)
509
- reader.absorb(10, handleXcoord)
510
- reader.absorb(11, handleDouble)
511
- reader.absorb(12, handleDouble)
512
- reader.absorb(13, handleDouble)
513
- reader.absorb(20, handleYcoord)
514
- reader.absorb(21, handleDouble)
515
- reader.absorb(22, handleDouble)
516
- reader.absorb(23, handleDouble)
517
- reader.absorb(30, handleZcoord)
518
- reader.absorb(31, handleDouble)
519
- reader.absorb(32, handleDouble)
520
- reader.absorb(33, handleDouble)
521
- reader.absorb(39, handleDouble)
522
- reader.absorb(40, handleDouble)
523
- reader.absorb(41, handleDouble)
524
- reader.absorb(42, handleBulge)
525
- reader.absorb(50, handleDouble)
526
- reader.absorb(51, handleDouble)
527
- reader.absorb(62, handleInt)
528
- reader.absorb(70, handleInt)
529
- reader.absorb(71, handleInt)
530
- reader.absorb(72, handleInt)
531
- reader.absorb(73, handleInt)
532
- reader.absorb(74, handleInt)
533
- reader.absorb(75, handleInt)
534
- reader.absorb(90, handleValue)
535
- reader.absorb(91, handleLen) // MESH
536
- reader.absorb(92, handleLen) // MESH
537
- reader.absorb(93, handleLen) // MESH
538
- reader.absorb(94, handleLen) // MESH
539
- reader.absorb(95, handleLen) // MESH
540
- reader.absorb(210, handleInt)
541
- reader.absorb(220, handleInt)
542
- reader.absorb(230, handleInt)
493
+ dxfreader.absorb(0, handleEntity)
494
+ dxfreader.absorb(1, handleString)
495
+ dxfreader.absorb(2, handleName)
496
+ dxfreader.absorb(3, handleName)
497
+ dxfreader.absorb(6, handleString)
498
+ dxfreader.absorb(7, handleString)
499
+ dxfreader.absorb(8, handleString)
500
+ dxfreader.absorb(9, handleVariable)
501
+ dxfreader.absorb(10, handleXcoord)
502
+ dxfreader.absorb(11, handleDouble)
503
+ dxfreader.absorb(12, handleDouble)
504
+ dxfreader.absorb(13, handleDouble)
505
+ dxfreader.absorb(20, handleYcoord)
506
+ dxfreader.absorb(21, handleDouble)
507
+ dxfreader.absorb(22, handleDouble)
508
+ dxfreader.absorb(23, handleDouble)
509
+ dxfreader.absorb(30, handleZcoord)
510
+ dxfreader.absorb(31, handleDouble)
511
+ dxfreader.absorb(32, handleDouble)
512
+ dxfreader.absorb(33, handleDouble)
513
+ dxfreader.absorb(39, handleDouble)
514
+ dxfreader.absorb(40, handleDouble)
515
+ dxfreader.absorb(41, handleDouble)
516
+ dxfreader.absorb(42, handleBulge)
517
+ dxfreader.absorb(50, handleDouble)
518
+ dxfreader.absorb(51, handleDouble)
519
+ dxfreader.absorb(62, handleInt)
520
+ dxfreader.absorb(70, handleInt)
521
+ dxfreader.absorb(71, handleInt)
522
+ dxfreader.absorb(72, handleInt)
523
+ dxfreader.absorb(73, handleInt)
524
+ dxfreader.absorb(74, handleInt)
525
+ dxfreader.absorb(75, handleInt)
526
+ dxfreader.absorb(90, handleValue)
527
+ dxfreader.absorb(91, handleLen) // MESH
528
+ dxfreader.absorb(92, handleLen) // MESH
529
+ dxfreader.absorb(93, handleLen) // MESH
530
+ dxfreader.absorb(94, handleLen) // MESH
531
+ dxfreader.absorb(95, handleLen) // MESH
532
+ dxfreader.absorb(210, handleInt)
533
+ dxfreader.absorb(220, handleInt)
534
+ dxfreader.absorb(230, handleInt)
543
535
 
544
536
  // initial state
545
- reader.objstack = []
546
- reader.objstack.push({ type: 'dxf' })
537
+ dxfreader.objstack = []
538
+ dxfreader.objstack.push({ type: 'dxf' })
547
539
 
548
540
  // start the reader
549
- reader.write(src).close()
550
- return reader
541
+ dxfreader.write(src)
542
+ dxfreader.close()
543
+ return dxfreader
551
544
  }
552
545
 
553
546
  //
@@ -603,9 +596,9 @@ const deserialize = (options, src) => {
603
596
  return options.output === 'script' ? translate(src, options) : instantiate(src, options)
604
597
  }
605
598
 
606
- const extension = 'dxf'
599
+ const mimeType = 'image/vnd.dxf'
607
600
 
608
- module.exports = {
609
- deserialize,
610
- extension
601
+ export {
602
+ mimeType,
603
+ deserialize
611
604
  }