(in-package :html-jen) (defun başlık-bul (node) (loop :for çocuk :in (children node) :do (when (eq :h1 (tag çocuk)) (return (value çocuk))))) (defun şablon-yap (node) (ebeveyn-node! :html (list (ebeveyn-node! :head (list (çocuk-node! :title (başlık-bul node)) ;;; geçici hack çünkü /> ile biten tagleri düzgün basamıyorum " ")) (ebeveyn-node! :body (list node))))) (defun şablonlu-yazdır (node &optional (stream *standard-output*)) (format stream "~%~%") (node->html (şablon-yap node) stream)) (defun markdown->html (kaynak hedef) (format t "~s -> ~s~%" kaynak hedef) (let ((okur (okur! kaynak))) (let ((root (markdown-ayrıştır okur)) (*print-case* :downcase)) (with-open-file (dış hedef :direction :output :if-does-not-exist :create :if-exists :supersede) (şablonlu-yazdır root dış))))) (defun md-dosyası? (yol) (or (string= "md" (pathname-type yol)) (string= "markdown" (pathname-type yol)))) (defun tip-değiştir (yol yeni-tip) (make-pathname :type yeni-tip :defaults yol)) (defun mod-zamanı (dosya) (sb-posix:stat-mtime (sb-posix:stat dosya))) (defun dosya-var? (dosya) (uiop:file-exists-p dosya)) (defun dönüştürmeli? (kaynak hedef) "Kaynak dosyadan hedef dosya oluşturulmalı mı ? Dosya değişmediyse yeniden oluşturma." (or (not (dosya-var? hedef)) (> (mod-zamanı kaynak) (mod-zamanı hedef)))) (defun yol-çeviri (yol kaynak-kök hedef-kök) (merge-pathnames (uiop:enough-pathname yol kaynak-kök) hedef-kök)) (defun dosya-kopyala (kaynak hedef) (uiop:copy-file kaynak hedef) (format t "~s -> ~s~%" kaynak hedef)) (defun dizin-kopyala (kaynak hedef) (ensure-directories-exist hedef) (mapc (lambda (kaynak-dosya) (let ((hedef-dosya (yol-çeviri kaynak-dosya kaynak hedef))) (when (dönüştürmeli? kaynak-dosya hedef-dosya) (dosya-kopyala kaynak-dosya hedef-dosya)))) (uiop:directory-files kaynak)) (loop :for d :in (uiop:subdirectories kaynak) :do (dizin-kopyala d (yol-çeviri d kaynak hedef)))) (declaim (ftype (function (pathname pathname pathname)) tamamen-üret)) (defun tamamen-üret (statik içerik hedef) ;; isim skill issue (assert (and (uiop:directory-exists-p statik) (uiop:directory-exists-p içerik))) (ensure-directories-exist hedef) (dizin-kopyala statik hedef) (loop :for dosya :in (uiop:directory-files içerik) :do (when (md-dosyası? dosya) (let ((html-dosyası (tip-değiştir (yol-çeviri dosya içerik hedef) "html"))) (when (dönüştürmeli? dosya html-dosyası) (markdown->html dosya html-dosyası)))))) (defun ana () (let ((args sb-ext:*posix-argv*)) (if (= 4 (length args)) (apply #'tamamen-üret (mapcar (lambda (str) (merge-pathnames str (uiop:getcwd))) (cdr args))) (format *error-output* "Kullanım: [prog-adı] [statik dizin] [içerik dizini] [hedef dizin]~%"))))