geomyidae

A small C-based gopherd. (gopher://bitreich.org/1/scm/geomyidae)
git clone git://r-36.net/geomyidae
Log | Files | Refs | README | LICENSE

gph-mode.el (2267B)


      1 ;;; gph-mode.el --- major mode for gph files  -*- lexical-binding: t; -*-
      2 
      3 ;; Copyright (C) Troels Henriksen (athas@sigkill.dk) 2022
      4 ;;
      5 ;; URL: gopher://sigkill.dk/1/programming
      6 ;; Keywords: gopher
      7 ;; Version: 1.1
      8 ;; Package-Requires: ((emacs "25.1"))
      9 
     10 ;; This file is not part of GNU Emacs.
     11 
     12 ;;; License:
     13 ;; GPL-3+
     14 
     15 ;;; Commentary:
     16 ;; .gph is the map file format used by the geomyidae Gopher daemon.
     17 ;; This Emacs mode provides basic understanding of the link syntax,
     18 ;; such that highlighting and folding works properly.  It also
     19 ;; highlights tab characters in pink because these are not allowed in
     20 ;; .gph files.
     21 ;;
     22 ;; Files with the ".gph" extension are automatically handled by this mode.
     23 ;;
     24 ;; For extensions: Define local keybindings in `gph-mode-map'.  Add
     25 ;; startup functions to `gph-mode-hook'.
     26 
     27 ;;; Code:
     28 
     29 (eval-when-compile
     30   (require 'rx))
     31 
     32 (defface gph-tabs-face
     33   '((((class color)) (:background  "hotpink"))
     34     (t (:reverse-video t)))
     35   "Face to use for highlighting tabs in Font-Lock mode.")
     36 
     37 (defvar gph-tabs 'gph-tabs-face
     38   "Face to use for highlighting tabs in Font-Lock mode.")
     39 
     40 (defvar gph--font-lock-defaults
     41   (let* ((type-rx '(or "0" "1" "3" "7" "8" "9" "g" "I" "h" "i"))
     42          (desc-rx '(* (not "|")))
     43          (path-rx '(* (not "|")))
     44          (host-rx '(* (not "|")))
     45          (port-rx '(+ digit))
     46          (link-rx `(: line-start "[" ,type-rx "|" ,desc-rx "|" ,path-rx "|" ,host-rx "|" ,port-rx "]"))
     47          (badlink-rx `(: line-start "[" (* anything))))
     48     `((,(rx-to-string link-rx) 0 font-lock-doc-markup-face)
     49       (,(rx-to-string badlink-rx) 0 font-lock-warning-face)
     50       ("\t" 0 gph-tabs))))
     51 
     52 (defvar gph-mode-hook nil
     53   "Hook for `gph-mode'.  Is run whenever the mode is entered.")
     54 
     55 (defvar gph-mode-map
     56   (let ((map (make-keymap)))
     57     map)
     58   "Keymap for `gph-mode'.")
     59 
     60 ;;;###autoload
     61 (add-to-list 'auto-mode-alist '("\\.gph" . gph-mode))
     62 
     63 ;;;###autoload
     64 (define-derived-mode gph-mode text-mode "gph"
     65   "Major mode for .gph files as used by geomyidae."
     66   (setq-local paragraph-start (concat "^\\[|\\|[ \t]*$\\|" page-delimiter))
     67   (setq-local paragraph-separate (concat "^\\[\\|[ \t]*$\\|" page-delimiter))
     68   (setq-local font-lock-defaults '(gph--font-lock-defaults)))
     69 
     70 (provide 'gph-mode)
     71 
     72 ;;; gph-mode.el ends here