Fix artbollocks-mode. (Still doesn't have lexical illusion support.)
[robmyers:scripts.git] / artbollocks-mode.el
1 ;; artbollocks-mode.el - A minor mode to guide art writers.
2 ;; Copyright (c) 2011 Rob Myers <rob@robmyers.org>
3 ;; Based on fic-mode.el
4 ;; Copyright (C) 2010, Trey Jackson <bigfaceworm(at)gmail(dot)com>
5 ;; Non-artbollocks words from: http://matt.might.net/articles/
6 ;; This program is free software: you can redistribute it and/or modify
7 ;; it under the terms of the GNU General Public License as published by
8 ;; the Free Software Foundation, either version 3 of the License, or
9 ;; (at your option) any later version.
10 ;;
11 ;; This program is distributed in the hope that it will be useful,
12 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
13 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 ;; GNU General Public License for more details.
15 ;;
16 ;; You should have received a copy of the GNU General Public License
17 ;; along with this program.  If not, see <http://www.gnu.org/licenses/>.
18 ;;
19 ;; To use, save artbollocks-mode.el to a directory in your load-path.
20 ;;
21 ;; (require 'artbollocks-mode)
22 ;; (add-hook 'text-mode-hook 'turn-on-artbollocks-mode)
23 ;; (add-hook 'org-mode-hook 'turn-on-artbollocks-mode)
24 ;;
25 ;; or
26 ;;
27 ;; M-x artbollocks-mode
28 ;;
29 ;; NOTE: If you manually turn on artbollocks-mode,
30 ;; you you might need to force re-fontification initially:
31 ;;
32 ;;   M-x font-lock-fontify-buffer
33
34 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
35 ;; Customization
36 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
37
38 ;; Passive voice font
39
40 (defcustom passive-foreground-color "Red"
41   "Font foreground colour"
42   :group 'artbollocks-mode)
43
44 (defcustom passive-background-color "Yellow"
45   "Font background color"
46   :group 'artbollocks-mode)
47
48 (defcustom font-lock-passive-face 'font-lock-passive-face
49   "variable storing the face for passive voice words in artbollocks mode"
50   :group 'artbollocks-mode)
51
52 (make-face 'font-lock-passive-face)
53 (modify-face 'font-lock-passive-face passive-foreground-color
54              passive-background-color nil t nil t nil nil)
55
56 ;; Weasel words face
57
58 (defcustom weasel-foreground-color "Red"
59   "Font foreground colour"
60   :group 'artbollocks-mode)
61
62 (defcustom weasel-background-color "Yellow"
63   "Font background color"
64   :group 'artbollocks-mode)
65
66 (defcustom font-lock-weasel-face 'font-lock-weasel-face
67   "variable storing the face for weasel words in artbollocks mode"
68   :group 'artbollocks-mode)
69
70 (make-face 'font-lock-weasel-face)
71 (modify-face 'font-lock-weasel-face weasel-foreground-color
72              weasel-background-color nil t nil t nil nil)
73
74 ;; Artbollocks face
75
76 (defcustom artbollocks-foreground-color "Red"
77   "Font foreground colour"
78   :group 'artbollocks-mode)
79
80 (defcustom artbollocks-background-color "Yellow"
81   "Font background color"
82   :group 'artbollocks-mode)
83
84 (defcustom font-lock-artbollocks-face 'font-lock-artbollocks-face
85   "variable storing the face for artbollocks words in artbollocks mode"
86   :group 'artbollocks-mode)
87
88 (make-face 'font-lock-artbollocks-face)
89 (modify-face 'font-lock-artbollocks-face artbollocks-foreground-color
90              artbollocks-background-color nil t nil t nil nil)
91
92 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
93 ;; Passive voice
94 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
95
96 (defconst passive-regex "\\b\\(am\\|are\\|were\\|being\\|is\\|been\\|was\\|be\\)\\s-+\\(\\w+ed\\|awoken\\|been\\|born\\|beat\\|become\\|begun\\|bent\\|beset\\|bet\\|bid\\|bidden\\|bound\\|bitten\\|bled\\|blown\\|broken\\|bred\\|brought\\|broadcast\\|built\\|burnt\\|burst\\|bought\\|cast\\|caught\\|chosen\\|clung\\|come\\|cost\\|crept\\|cut\\|dealt\\|dug\\|dived\\|done\\|drawn\\|dreamt\\|driven\\|drunk\\|eaten\\|fallen\\|fed\\|felt\\|fought\\|found\\|fit\\|fled\\|flung\\|flown\\|forbidden\\|forgotten\\|foregone\\|forgiven\\|forsaken\\|frozen\\|gotten\\|given\\|gone\\|ground\\|grown\\|hung\\|heard\\|hidden\\|hit\\|held\\|hurt\\|kept\\|knelt\\|knit\\|known\\|laid\\|led\\|leapt\\|learnt\\|left\\|lent\\|let\\|lain\\|lighted\\|lost\\|made\\|meant\\|met\\|misspelt\\|mistaken\\|mown\\|overcome\\|overdone\\|overtaken\\|overthrown\\|paid\\|pled\\|proven\\|put\\|quit\\|read\\|rid\\|ridden\\|rung\\|risen\\|run\\|sawn\\|said\\|seen\\|sought\\|sold\\|sent\\|set\\|sewn\\|shaken\\|shaven\\|shorn\\|shed\\|shone\\|shod\\|shot\\|shown\\|shrunk\\|shut\\|sung\\|sunk\\|sat\\|slept\\|slain\\|slid\\|slung\\|slit\\|smitten\\|sown\\|spoken\\|sped\\|spent\\|spilt\\|spun\\|spit\\|split\\|spread\\|sprung\\|stood\\|stolen\\|stuck\\|stung\\|stunk\\|stridden\\|struck\\|strung\\|striven\\|sworn\\|swept\\|swollen\\|swum\\|swung\\|taken\\|taught\\|torn\\|told\\|thought\\|thrived\\|thrown\\|thrust\\|trodden\\|understood\\|upheld\\|upset\\|woken\\|worn\\|woven\\|wed\\|wept\\|wound\\|won\\|withheld\\|withstood\\|wrung\\|written\\)\\b")
97
98 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
99 ;; Weasel words
100 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
101
102 (defconst weasel-regex "\\b\\(many\\|various\\|very\\|fairly\\|several\\|extremely\\|exceedingly\\|quite\\|remarkably\\|few\\|surprisingly\\|mostly\\|largely\\|huge\\|tiny\\|\\(\\(are\\|is\\) a number\\)\\|excellent\\|interestingly\\|significantly\\|substantially\\|clearly\\|vast\\|relatively\\|completely\\)\\b")
103
104 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
105 ;; Artbollocks
106 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
107
108 (defconst artbollocks-regex "\\b(a priori\\|ad hoc\\|affirmation\\|affirm\\|affirms\\|aporia\\|aporetic\\|appropriates\\|appropriation\\|archetypal\\|archetypical\\|archetype\\|archetypes\\|autonomous\\|autonomy\\|baudrillardian\\|baudrillarian\\|commodification\\|committed\\|commitment\\|commonalities\\|contemporaneity\\|context\\|contexts\\|contextual\\|contextualise\\|contextualises\\|contextualisation\\|contextialize\\|contextializes\\|contextualization\\|convention\\|conventional\\|conventions\\|coterminous\\|critique\\|cunning\\|cunningly\\|death of the author\\|debunk\\|debunked\\|debunking\\|debunks\\|deconstruct\\|deconstruction\\|deconstructs\\|deleuzian\\|desire\\|desires\\|discourse\\|discursive\\|disrupt\\|disrupts\\|engage\\|engagement\\|engages\\|episteme\\|epistemic\\|ergo\\|fetish\\|fetishes\\|fetishise\\|fetishised\\|fetishize\\|fetishized\\|gaze\\|gender\\|gendered\\|historicise\\|historicisation\\|historicize\\|historicization\\|hegemonic\\|hegemony\\|identity\\|identity politics\\|intensifies\\|intensify\\|intensifying\\|interrogate\\|interrogates\\|interrogation\\|intertextual\\|intertextuality\\|irony\\|ironic\\|ironical\\|ironically\\|ironisation\\|ironization\\|ironises\\|ironizes\\|jouissance\\|juxtapose\\|juxtaposes\\|juxtaposition\\|lacanian\\|lack\\|loci\\|locus\\|locuses\\|matrix\\|mocking\\|mockingly\\|modalities\\|modality\\|myth\\|mythologies\\|mythology\\|myths\\|narrative\\|narrativisation\\|narrativization\\|narrativity\\|nexus\\|nodal\\|node\\|normative\\|normativity\\|notion\\|notions\\|objective\\|objectivity\\|objectivities\\|objet petit a\\|ontology\\|ontological\\|operate\\|operates\\|otherness\\|othering\\|paradigm\\|paradigmatic\\|paradigms\\|parody\\|parodic\\|parodies\\|physicality\\|plenitude\\|poetics\\|popular notions\\|position\\|post hoc\\|postmodernism\\|postmodernist\\|postmodernity\\|postmodern\\|practice\\|practise\\|praxis\\|problematic\\|problematics\\|proposition\\|qua\\|reading\\|readings\\|reification\\|relation\\|relational\\|relationality\\|relations\\|representation\\|representations\\|rhizomatic\\|rhizome\\|situate\\|situated\\|situates\\|stereotype\\|stereotypes\\|strategy\\|strategies\\|subjective\\|subjectivity\\|subjectivities\\|subvert\\|subversion\\|subverts\\|text\\|textual\\|textuality\\|thinker\\|thinkers\\|trajectory\\|transgress\\|transgresses\\|transgression\\|transgressive\\|unfolding\\|undermine\\|undermining\\|undermines\\|work\\|works\\|wry\\|wryly\\|zizekian\\|zi┼żekian)\\b")
109
110 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
111 ;; Highlighting
112 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
113
114 (defun search-for-keyword (regex limit)
115   "Match the provided regex in the buffer"
116   (let ((match-data-to-set nil)
117         found)
118     (save-match-data
119       (while (and (null match-data-to-set)
120                   (re-search-forward regex limit t))
121             (setq match-data-to-set (match-data))))
122     (when match-data-to-set
123       (set-match-data match-data-to-set)
124       (goto-char (match-end 0)) 
125       t)))
126
127 (defun passive-search-for-keyword (limit)
128   (search-for-keyword passive-regex limit))
129
130 (defun weasel-search-for-keyword (limit)
131   (search-for-keyword weasel-regex limit))
132
133 (defun artbollocks-search-for-keyword (limit)
134   (search-for-keyword artbollocks-regex limit))
135
136 (defconst passivekwlist '((passive-search-for-keyword 
137                               (0 'font-lock-passive-face t))))
138
139 (defconst weaselkwlist '((weasel-search-for-keyword 
140                              (0 'font-lock-weasel-face t))))
141
142 (defconst artbollockskwlist '((artbollocks-search-for-keyword 
143                                   (0 'font-lock-artbollocks-face t))))
144
145 (defun add-artbollocks-keywords ()
146   (font-lock-add-keywords nil passivekwlist)
147   (font-lock-add-keywords nil weaselkwlist)
148   (font-lock-add-keywords nil artbollockskwlist))
149
150 (defun remove-artbollocks-keywords ()
151   (font-lock-remove-keywords nil passivekwlist)
152   (font-lock-remove-keywords nil weaselkwlist)
153   (font-lock-remove-keywords nil artbollockskwlist))
154
155 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
156 ;; The mode
157 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
158
159 ;;;###autoload
160 (define-minor-mode artbollocks-mode "highlight passive voice, weadel words and artbollocks in text"
161   :lighter " ARTBOLLOCKS"
162   :group 'artbollocks-mode
163   (if artbollocks-mode
164       (add-artbollocks-keywords)
165     (remove-artbollocks-keywords)))
166
167 (defun turn-on-artbollocks-mode ()
168   "turn artbollocks-mode on"
169   (interactive)
170   (artbollocks-mode 1))
171
172 (provide 'artbollocks-mode)