(let ((food-path "~/SR-Leg_ASC/") (output-path "~/SR-Leg_ASC/out") (out (get-buffer-create "*out*"))) (when (and (file-exists-p output-path) (directory-files output-path)) (condition-case nil (delete-directory output-path t) (error "unable to delete the output directory %s" output-path))) (condition-case nil (mkdir output-path) (error "unable to create output directory %s" output-path)) (switch-to-buffer out) (setq buffer-read-only nil) (erase-buffer) (goto-char (point-min)) (let ((weight (concat food-path "WEIGHT.txt")) (desc (concat food-path "FOOD_DES.txt")) (nutr (concat food-path "NUT_DATA.txt")) (ndef (concat food-path "NUTR_DEF.txt"))) (dolist (f (list weight desc nutr ndef)) (when (not (file-exists-p f)) (error "Could not find file %s" f))) (find-file desc) (goto-char (point-min)) (let (name file n count) (setq count 0) ;; Loop for every type of food we find in FOOD_DES.txt: ;; add a section to our output file. (while (and (re-search-forward "^~" nil t) (> count -1)) (when (equal 0 (mod count 100)) (message (format "%s" count))) (let ((items (split-string (thing-at-point 'line) "\\^"))) (setq n (replace-regexp-in-string "~" "" (elt items 0))) (setq name (replace-regexp-in-string "~" "" (elt items 2))) (setq name (replace-regexp-in-string "(Includes.*)" "" name)) ;; filename has only numbers, letters, ;; and replace spaces with dashes (setq file (with-temp-buffer (insert name) (goto-char (point-min)) (while (< (point) (point-max)) (cond ((= (char-after) 32) (delete-char 1) (insert "-")) ((or (= (char-after) 32) (and (>= (char-after) 65) (<= (char-after) 90)) (and (>= (char-after) 97) (<= (char-after) 122)) (and (>= (char-after) 48) (<= (char-after) 57))) (forward-char)) (t (delete-char 1)))) (concat (buffer-substring (point-min) (point-max)) (format "-%s.txt" n))))) (setq count (+ count 1)) (save-excursion (switch-to-buffer out) (insert (format "* %s (%s)" name n)) (newline) (newline) (insert (format "%s" file)) (newline) (newline)) ;; loop for every weight equivalent we can find ;; in WEIGHT.txt for this food (save-excursion (find-file weight) (goto-char (point-min)) (let (all count measure grams items) (while (search-forward (concat "~" n "~") nil t) (let ((items (split-string (thing-at-point 'line) "\\^"))) (setq count (elt items 2)) (let ((nth (elt items 3))) (when nth (setq measure (replace-regexp-in-string "~" "" nth)))) (setq grams (elt items 4)) (when (and count measure grams) (save-excursion (switch-to-buffer out) (insert count) (insert " ") (insert measure) (insert " = ") (insert grams) (insert "g") (dotimes (i 1) (newline)))))) (save-excursion (switch-to-buffer out) (dotimes (i 1) (newline))))) ;; Now the weights are done for this food. ;; Write the nutritional information for it ;; into the alphabet directory. (let ((char1d (format "%s/%s" output-path (char-to-string (elt name 0))))) (condition-case nil (mkdir char1d) (error "could not create directory %s" char1d)) (save-excursion (get-buffer-create "nutrition") (switch-to-buffer "nutrition") (setq buffer-read-only nil) (erase-buffer)) (save-excursion (find-file nutr) (goto-char (point-min)) (let (nutr-id nutr-units nutr-name nutr-amount) (while (re-search-forward (concat "^" "~" n "~") nil t) (let ((items (split-string (thing-at-point 'line) "\\^"))) (setq nutr-id (elt items 1)) (setq nutr-id (replace-regexp-in-string "~" "" nutr-id)) (setq nutr-amount (elt items 2)) (save-excursion (find-file ndef) (goto-char (point-min)) (search-forward (concat "~" nutr-id "~")) (setq nutr-name (elt (split-string (thing-at-point 'line) "\\^") 3)) (setq nutr-name (replace-regexp-in-string "~" "" nutr-name)) (setq nutr-units (elt (split-string (thing-at-point 'line) "\\^") 1)) (setq nutr-units (replace-regexp-in-string "~" "" nutr-units))) ;; write nutrient line to file, except for the ones that start ;; with a number. i don't know what those mean. (unless (and (>= (elt nutr-name 0) 48) (<= (elt nutr-name 0) 57)) (save-excursion (switch-to-buffer "nutrition") (goto-char (point-max)) (newline) (insert (format "%s %s %s" nutr-name (string-to-number nutr-amount) nutr-units)))))) (let ((food-file-name file)) (save-excursion (switch-to-buffer "nutrition") (sort-lines nil (point-min) (point-max)) (goto-char (point-min)) (insert (format "%s (%s)" name n)) (newline) (insert "100 g") (newline) (write-region (point-min) (point-max) (format "%s/%s" char1d food-file-name))))))) ))) (switch-to-buffer out) (goto-char (point-max)) (newline) (goto-char (point-min)) (org-mode) (goto-char (point-min)) (mark-whole-buffer) (org-sort-entries nil ?a) (setq buffer-read-only t) (condition-case nil (write-region (point-min) (point-max) (format "%s/00-food-weights.org" output-path)) (error "could not save file 00-food-weights.org")))