parse.py

changeset 94
109fb7cf658f
parent 69
a24c4490d9f2
child 101
745f2c3aec0a
--- a/parse.py	Mon Jun 24 17:34:30 2019 +0300
+++ b/parse.py	Mon Jun 24 19:08:24 2019 +0300
@@ -8,11 +8,15 @@
     pass
 
 class Model:
-    def __init__(self, header, body, *, ldraw_directories, header_size = 0):
+    def __init__(
+        self, header, body, *, ldraw_directories, \
+        header_size = 0, line_ending_errors = None
+    ):
         self.header = header
         self.body = body
         self.header_size = header_size
         self.ldraw_directories = ldraw_directories
+        self.line_ending_errors = line_ending_errors
     def filter_by_type(self, type):
         yield from [
             element
@@ -62,10 +66,20 @@
                 yield point @ transformation_matrix
 
 def read_ldraw(file, *, ldraw_directories, name = ''):
-    model_body = [
-        parse_ldraw_code(line)
-        for line in file
-    ]
+    line_ending_errors = {
+        'count': 0,
+        'first-at': None,
+    }
+    model_body = []
+    for i, line in enumerate(file.readlines()):
+        # check line endings
+        if not line.endswith(b'\r\n'):
+            if line_ending_errors['first-at'] is None:
+                line_ending_errors['first-at'] = i
+            line_ending_errors['count'] += 1
+        model_body.append(parse_ldraw_code(line))
+    if line_ending_errors['count'] == 0:
+        line_ending_errors = None
     headerparser = header.HeaderParser()
     try:
         header_parse_result = headerparser.parse(model_body)
@@ -78,7 +92,9 @@
         header = header_object,
         body = model_body,
         header_size = end,
-        ldraw_directories = ldraw_directories)
+        ldraw_directories = ldraw_directories,
+        line_ending_errors = line_ending_errors,
+    )
     model.name = name
     return model
 

mercurial