about summary refs log tree commit diff
path: root/configs/shared/emacs/.emacs.d/elpa/prettier-js-20180108.2326/prettier-js.el
diff options
context:
space:
mode:
Diffstat (limited to 'configs/shared/emacs/.emacs.d/elpa/prettier-js-20180108.2326/prettier-js.el')
-rw-r--r--configs/shared/emacs/.emacs.d/elpa/prettier-js-20180108.2326/prettier-js.el214
1 files changed, 214 insertions, 0 deletions
diff --git a/configs/shared/emacs/.emacs.d/elpa/prettier-js-20180108.2326/prettier-js.el b/configs/shared/emacs/.emacs.d/elpa/prettier-js-20180108.2326/prettier-js.el
new file mode 100644
index 000000000000..50b511ab7542
--- /dev/null
+++ b/configs/shared/emacs/.emacs.d/elpa/prettier-js-20180108.2326/prettier-js.el
@@ -0,0 +1,214 @@
+;;; prettier-js.el --- Minor mode to format JS code on file save
+
+;; Version: 0.1.0
+;; Package-Version: 20180108.2326
+
+;; Copyright (c) 2014 The go-mode Authors. All rights reserved.
+;; Portions Copyright (c) 2015-present, Facebook, Inc. All rights reserved.
+
+;; Redistribution and use in source and binary forms, with or without
+;; modification, are permitted provided that the following conditions are
+;; met:
+
+;; * Redistributions of source code must retain the above copyright
+;; notice, this list of conditions and the following disclaimer.
+;; * Redistributions in binary form must reproduce the above
+;; copyright notice, this list of conditions and the following disclaimer
+;; in the documentation and/or other materials provided with the
+;; distribution.
+;; * Neither the name of the copyright holder nor the names of its
+;; contributors may be used to endorse or promote products derived from
+;; this software without specific prior written permission.
+
+;; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+;; "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+;; LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+;; A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+;; OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+;; SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+;; LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+;; DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+;; THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+;; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+;; OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.)
+
+;; Author: James Long and contributors
+;; Created: 10 January 2017
+;; Url: https://github.com/prettier/prettier-emacs
+;; Keywords: convenience wp edit js
+
+;; This file is not part of GNU Emacs.
+
+;;; Commentary:
+;; Formats your JavaScript code using 'prettier' on file save.
+
+;;; Code:
+
+(defgroup prettier-js nil
+  "Minor mode to format JS code on file save"
+  :group 'languages
+  :prefix "prettier-js"
+  :link '(url-link :tag "Repository" "https://github.com/prettier/prettier"))
+
+(defcustom prettier-js-command "prettier"
+  "The 'prettier' command."
+  :type 'string
+  :group 'prettier-js)
+
+(defcustom prettier-js-args '()
+  "List of args to send to prettier command."
+  :type '(repeat string)
+  :group 'prettier-js)
+
+(defcustom prettier-js-show-errors 'buffer
+    "Where to display prettier error output.
+It can either be displayed in its own buffer, in the echo area, or not at all.
+Please note that Emacs outputs to the echo area when writing
+files and will overwrite prettier's echo output if used from inside
+a `before-save-hook'."
+    :type '(choice
+            (const :tag "Own buffer" buffer)
+            (const :tag "Echo area" echo)
+            (const :tag "None" nil))
+      :group 'prettier-js)
+
+(defcustom prettier-js-width-mode nil
+  "Specify width when formatting buffer contents."
+  :type '(choice
+          (const :tag "Window width" window)
+          (const :tag "Fill column" fill)
+          (const :tag "None" nil))
+  :group 'prettier-js)
+
+(defun prettier-js--goto-line (line)
+  "Move cursor to line LINE."
+  (goto-char (point-min))
+    (forward-line (1- line)))
+
+(defun prettier-js--apply-rcs-patch (patch-buffer)
+  "Apply an RCS-formatted diff from PATCH-BUFFER to the current buffer."
+  (let ((target-buffer (current-buffer))
+        ;; Relative offset between buffer line numbers and line numbers
+        ;; in patch.
+        ;;
+        ;; Line numbers in the patch are based on the source file, so
+        ;; we have to keep an offset when making changes to the
+        ;; buffer.
+        ;;
+        ;; Appending lines decrements the offset (possibly making it
+        ;; negative), deleting lines increments it. This order
+        ;; simplifies the forward-line invocations.
+        (line-offset 0))
+    (save-excursion
+      (with-current-buffer patch-buffer
+        (goto-char (point-min))
+        (while (not (eobp))
+          (unless (looking-at "^\\([ad]\\)\\([0-9]+\\) \\([0-9]+\\)")
+            (error "Invalid rcs patch or internal error in prettier-js--apply-rcs-patch"))
+          (forward-line)
+          (let ((action (match-string 1))
+                (from (string-to-number (match-string 2)))
+                (len  (string-to-number (match-string 3))))
+            (cond
+             ((equal action "a")
+              (let ((start (point)))
+                (forward-line len)
+                (let ((text (buffer-substring start (point))))
+                  (with-current-buffer target-buffer
+                    (setq line-offset (- line-offset len))
+                    (goto-char (point-min))
+                    (forward-line (- from len line-offset))
+                    (insert text)))))
+             ((equal action "d")
+              (with-current-buffer target-buffer
+                (prettier-js--goto-line (- from line-offset))
+                (setq line-offset (+ line-offset len))
+                (let ((beg (point)))
+                  (forward-line len)
+                  (delete-region (point) beg))))
+             (t
+              (error "Invalid rcs patch or internal error in prettier-js--apply-rcs-patch")))))))))
+
+(defun prettier-js--process-errors (filename errorfile errbuf)
+  "Process errors for FILENAME, using an ERRORFILE and display the output in ERRBUF."
+  (with-current-buffer errbuf
+    (if (eq prettier-js-show-errors 'echo)
+        (progn
+          (message "%s" (buffer-string))
+          (prettier-js--kill-error-buffer errbuf))
+      (insert-file-contents errorfile nil nil nil)
+      ;; Convert the prettier stderr to something understood by the compilation mode.
+      (goto-char (point-min))
+      (insert "prettier errors:\n")
+      (while (search-forward-regexp "^stdin" nil t)
+        (replace-match (file-name-nondirectory filename)))
+      (compilation-mode)
+      (display-buffer errbuf))))
+
+(defun prettier-js--kill-error-buffer (errbuf)
+  "Kill buffer ERRBUF."
+  (let ((win (get-buffer-window errbuf)))
+    (if win
+        (quit-window t win)
+      (with-current-buffer errbuf
+        (erase-buffer))
+      (kill-buffer errbuf))))
+
+(defun prettier-js ()
+   "Format the current buffer according to the prettier tool."
+   (interactive)
+   (let* ((ext (file-name-extension buffer-file-name t))
+          (bufferfile (make-temp-file "prettier" nil ext))
+          (outputfile (make-temp-file "prettier" nil ext))
+          (errorfile (make-temp-file "prettier" nil ext))
+          (errbuf (if prettier-js-show-errors (get-buffer-create "*prettier errors*")))
+          (patchbuf (get-buffer-create "*prettier patch*"))
+          (coding-system-for-read 'utf-8)
+          (coding-system-for-write 'utf-8)
+          (width-args
+           (cond
+            ((equal prettier-js-width-mode 'window)
+             (list "--print-width" (number-to-string (window-body-width))))
+            ((equal prettier-js-width-mode 'fill)
+             (list "--print-width" (number-to-string fill-column)))
+            (t
+             '()))))
+     (unwind-protect
+         (save-restriction
+           (widen)
+           (write-region nil nil bufferfile)
+           (if errbuf
+               (with-current-buffer errbuf
+                 (setq buffer-read-only nil)
+                 (erase-buffer)))
+           (with-current-buffer patchbuf
+             (erase-buffer))
+           (if (zerop (apply 'call-process
+                             prettier-js-command bufferfile (list (list :file outputfile) errorfile)
+                             nil (append prettier-js-args width-args (list "--stdin" "--stdin-filepath" buffer-file-name))))
+               (progn
+                 (call-process-region (point-min) (point-max) "diff" nil patchbuf nil "-n" "--strip-trailing-cr" "-"
+                                      outputfile)
+                 (prettier-js--apply-rcs-patch patchbuf)
+                 (message "Applied prettier with args `%s'" prettier-js-args)
+                 (if errbuf (prettier-js--kill-error-buffer errbuf)))
+             (message "Could not apply prettier")
+             (if errbuf
+                 (prettier-js--process-errors (buffer-file-name) errorfile errbuf))
+             ))
+       (kill-buffer patchbuf)
+       (delete-file errorfile)
+       (delete-file bufferfile)
+       (delete-file outputfile))))
+
+;;;###autoload
+(define-minor-mode prettier-js-mode
+  "Runs prettier on file save when this mode is turned on"
+  :lighter " Prettier"
+  :global nil
+  (if prettier-js-mode
+      (add-hook 'before-save-hook 'prettier-js nil 'local)
+    (remove-hook 'before-save-hook 'prettier-js 'local)))
+
+(provide 'prettier-js)
+;;; prettier-js.el ends here