summaryrefslogtreecommitdiff
path: root/www/build-site.el
blob: 5f2e99748181864b9b1b7ebb8f4fe97298cf33ed (about) (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
;; -*- lexical-binding: t; -*-

;;; The Object Prototype

( defun publication-object ( )
  ( let ( ( object-projects ( list ) )
          ( org-publish-project-alist ( list ) )
          ( success-report "Build complete!" ) )
    ( list

      :object-compose
      ( lambda ( )
        ( setq org-publish-project-alist ( list object-projects ) ) )

      :object-get-projects
      ( lambda ( project-data )
        ( setq object-projects ( append project-data object-projects ) ) )

      :object-report
      ( lambda ( )
        ( print org-publish-project-alist )
        ( print success-report ) ) ) ) )

;;; The Object Interface

( defun object-compose ( publication-instance )
  ( funcall ( plist-get publication-instance :object-compose ) ) )

( defun object-get-projects ( publication-instance project-data )
  ( funcall
    ( plist-get publication-instance :object-get-projects ) project-data ) )

( defun object-report ( publication-instance )
  ( funcall ( plist-get publication-instance :object-report ) ) )

;;; The User Logic

( defun atypical-header-p ( project-data )
  ( let ( ( element-1 ( pop project-data ) )
          ( element-2 ( pop project-data ) )
          ( error-1 "First element is not a string: " )
          ( error-2 "Second element is not a keyword: " ) )
    ( condition-case error
        ( cond
          ( ( not ( stringp element-1 ) )
            ( signal 'scan-error ( concat error-1 element-1 ) ) )
          ( ( not ( keywordp element-2 ) )
            ( signal 'scan-error ( concat error-2 element-2 ) ) ) )
      ( scan-error ( print ( cdr error ) ) ) ) ) )

( defun export-project-alist ( publication-instance )
  ( object-compose publication-instance )
  ( object-report publication-instance ) )

( defun get-component ( project-data )
  ( let ( ( component ( nth 2 project-data ) ) )
    ( print component )
    component ) )

( defun has-component-p ( project-data )
  ( let ( ( component-keyword ':components )
          ( second ( nth 1 project-data ) ) )
    ( eq component-keyword second ) ) )

( defun import-data ( publication-instance project-data )
  ( object-get-projects publication-instance project-data ) )

( defun too-short-p ( project-data )
  ( let ( ( minimal-length 2 ) )
    ( < ( length project-data ) minimal-length ) ) )

;;; The User Interface

( defun publish ( publication-instance &rest project-data-wrapped )
  ( let ( ( project-data ( car project-data-wrapped ) ) )
      ( pcase project-data
        ( ( guard ( too-short-p project-data ) ) nil )
        ( ( guard ( atypical-header-p project-data ) nil ) )
        ( ( pred has-component-p project-data )
          ( let ( ( component ( get-component project-data ) )
                  ( head ( nth 0 project-data ) )
                  ( tail ( nthcdr 3  project-data ) ) )
            ( list
              head
              ( publish publication-instance component )
              ( publish publication-instance tail ) ) ) )
        ( _
          ( progn
            ( import-data publication-instance project-data )
            ( export-project-alist publication-instance ) ) ) ) ) )