(defface polite-removed-face
       '((t :foreground "red" :weight bold))
       "Face for removed parts of PO messages.")
(defvar polite-removed-face 'polite-removed-face)

(defface polite-added-face
       '((t :foreground "blue" :weight bold))
       "Face for added parts of PO messages.")
(defvar polite-added-face 'polite-added-face)

(defface polite-changed-face
       '((t :foreground "darkgreen"))
       "Face for entire diff comments of PO messages.")
(defvar polite-changed-face 'polite-changed-face)

(defun find-removed-parts (p-max)
  ;; If in a diff-comment, return all removed parts
  (if (and (re-search-forward "^\\#\\!" p-max t) (re-search-forward "\\(\\[-.*?-\\]\\)" p-max t 2))
      t nil))

(defun find-added-parts (p-max)
  ;; If in a diff-comment, return all removed parts
  (if (and (re-search-forward "^\\#\\!" p-max t) (re-search-forward "\\({\\+.*?\\+}\\)" p-max t 2))
      t nil))



;; Font lock based highlighting code.
(defconst polite-font-lock-keywords
  '(
    ;; ("^\\(msgid \\|msgstr \\)?\"\\|\"$" . font-lock-keyword-face)
    ;; (regexp-opt
    ;;  '("msgid " "msgid_plural " "msgstr " "msgstr[0] " "msgstr[1] "))
    ("\
^\\(\\(msg\\(id\\(_plural\\)?\\|str\\(\\[[0-9]\\]\\)?\\)?\\) \\)?\"\\|\"$"
     . font-lock-keyword-face)
    ;;("\\\\.\\|%\\*?[-.0-9ul]*[a-zA-Z]" . font-lock-variable-name-face)
    ("\\\\.\\|%\\*?[-.0-9ul]*[a-zA-Z]" . font-lock-variable-name-face)
    ("^# .*\\|^#[:,!]?" . font-lock-comment-face)
    ("^#\\.\\(.*\\)" 1 font-lock-reference-face)
    ("^#! .*" 0 polite-changed-face t)
    ("^#: .*" 0 font-lock-reference-face t)
    ("^#!\\(.*\\)" 1 font-lock-comment-face)
    ("\\(\\[-.*?-\\]\\)" 1 polite-removed-face t)
    ("\\({\\+.*?\\+}\\)" 1 polite-added-face t)
    ;; The following line does not work, and I wonder why.
    ("^#,\\(.*\\)" 0 font-lock-preprocessor-face t)
    )
  "Additional expressions to highlight in PO mode.")
 
(defun polite-mode ()
   "Major mode providing just syntax highlighting of PO files."
  (interactive)
  (kill-all-local-variables)
  (setq major-mode 'polite-mode
	mode-name "POlite")
  (set (make-local-variable 'font-lock-defaults) '(polite-font-lock-keywords t))
  (run-hooks 'polite-mode-hook))

