diff --git a/lib/qml-ui-vars.lisp b/lib/qml-ui-vars.lisp index 75afcc7..e09a350 100644 --- a/lib/qml-ui-vars.lisp +++ b/lib/qml-ui-vars.lisp @@ -44,14 +44,15 @@ list)) (defun grep (name) - (ext:run-program "grep" (list "-rn" - "--include" - "*.qml" - (format nil "objectName:[[:space:]]*~S" name) - "qml/"))) - -(defun one-space (string) - (x:join (remove-if 'x:empty-string (x:split string)))) + (flet ((one-space (s) + (x:join (remove-if 'x:empty-string (x:split s))))) + (let ((s (ext:run-program "grep" (list "-rn" + "--include" + "*.qml" + (format nil "objectName:[[:space:]]*~S" name) + "qml/")))) + (loop :for line = (read-line s nil nil) + :while line :collect (one-space line))))) (defun collect () (setf *qml-items* @@ -64,21 +65,26 @@ (dolist (item *qml-items*) (let* ((name (|objectName| item)) (class* (class-name* item)) - (grep (ignore-errors (read-line (grep name))))) + (grep (grep name)) + (occur (mapcar (lambda (x) (find x grepped :test 'string=)) + grep))) (when (and grep - (not (find grep grepped :test 'string=))) + (or (rest grep) + (not (find (first grep) grepped :test 'string=)))) + (when (and (find name not-unique :test 'string=) + (rest occur)) + (qmsg (format nil "QML: not unique:
~A
" + (x:join grep #\Newline))) + (return-from collect :error)) (push (list (substitute #\- #\_ name) name class* - (subseq grep 0 (position #\: grep))) + (subseq (first grep) 0 (position #\: (first grep)))) collected) (setf max-name (max (length name) max-name) max-class (max (length class*) max-class)) - (when (and (find name not-unique :test 'string=) - (not (find grep grepped :test 'string=))) - (qmsg (format nil "QML: not unique:
~A
" - (one-space (read-line (grep name)))))) - (pushnew grep grepped :test 'string=) + (dolist (gr grep) + (pushnew gr grepped :test 'string=)) (pushnew name not-unique :test 'string=)))) (values (setf collected (nreverse collected)) max-name @@ -87,25 +93,27 @@ (defun write-ui-file (out &optional (ui-package "ui")) (multiple-value-bind (items max-name max-class) (collect) - (format out ";;; THIS FILE IS GENERATED, see '(eql:qml)'~ - ~%~ - ~%(defpackage ~(~A~)~% (:use :cl :eql)" - ui-package) - (format out "~% (:export~{~% #:*~A*~}))~%~%" - (sort (mapcar 'first items) 'string<)) - (format out "(provide :ui-vars)~%~%(in-package ~(:~A~))~%~%" ui-package) - (dolist (item items) - (let ((diff-name (make-string (- max-name (length (first item))))) - (diff-class (make-string (- max-class (length (third item)))))) - (format out "(defvar *~A*~A ~S)~A ; ~A~A ~S~%" - (first item) - diff-name - (second item) - diff-name - (third item) - diff-class - (fourth item)))) - (terpri))) + (unless (eql :error items) + (format out ";;; THIS FILE IS GENERATED, see '(eql:qml)'~ + ~%~ + ~%(defpackage ~(~A~)~% (:use :cl :eql)" + ui-package) + (format out "~% (:export~{~% #:*~A*~}))~%~%" + (sort (mapcar 'first items) 'string<)) + (format out "(provide :ui-vars)~%~%(in-package ~(:~A~))~%~%" ui-package) + (dolist (item items) + (let ((diff-name (make-string (- max-name (length (first item))))) + (diff-class (make-string (- max-class (length (third item)))))) + (format out "(defvar *~A*~A ~S)~A ; ~A~A ~S~%" + (first item) + diff-name + (second item) + diff-name + (third item) + diff-class + (fourth item)))) + (terpri) + t))) (defun run () (let ((ui "lisp/ui-vars.lisp")) @@ -118,8 +126,9 @@ (return-from run)) (ensure-directories-exist ui) (with-open-file (out ui :direction :output :if-exists :supersede) - (write-ui-file out) - (format t "~%UI file generated: ~S~%~%" ui)))) + (if (write-ui-file out) + (format t "~%UI file generated: ~S~%~%" ui) + (format t "~%File not generated, please correct names and try again.~%~%"))))) (run)