From 50278bacaee4944fe57fe1ac627a30f3c483ad06 Mon Sep 17 00:00:00 2001 From: sloxy Date: Thu, 11 Oct 2018 13:43:56 +0100 Subject: [PATCH] Change linebreak handling to work with Windows Linebreaks normalised to *nix '\n' (LF) for comparison. Linebreak in re-written file will be same as linebreak in original file. If no linebreak in original file, linebreak in rewritten will be OS default. Fixes #137. --- cljfmt/src/cljfmt/core.cljc | 18 +++++++++++++++++ cljfmt/src/cljfmt/main.clj | 2 +- cljfmt/test/cljfmt/core_test.cljc | 33 ++++++++++++++++++++++++++++++- 3 files changed, 51 insertions(+), 2 deletions(-) diff --git a/cljfmt/src/cljfmt/core.cljc b/cljfmt/src/cljfmt/core.cljc index 7d8a1d14..a7fc0bc9 100644 --- a/cljfmt/src/cljfmt/core.cljc +++ b/cljfmt/src/cljfmt/core.cljc @@ -2,6 +2,7 @@ #?@(:clj [(:refer-clojure :exclude [reader-conditional?]) (:require [clojure.java.io :as io] + [clojure.string :as str] [clojure.zip :as zip] [rewrite-clj.node :as n] [rewrite-clj.parser :as p] @@ -390,3 +391,20 @@ (reformat-form (cond-> options alias-map (assoc :alias-map alias-map))) (n/string))))) + +(def default-line-separator + #?(:clj (System/lineSeparator) :cljs \newline)) + +(defn normalize-newlines [s] + (str/replace s #"\r\n" "\n")) + +(defn replace-newlines [s sep] + (str/replace s #"\n" sep)) + +(defn find-line-separator [s] + (or (re-find #"\r?\n" s) default-line-separator)) + +(defn wrap-normalize-newlines [f] + (fn [s] + (let [sep (find-line-separator s)] + (-> s normalize-newlines f (replace-newlines sep))))) diff --git a/cljfmt/src/cljfmt/main.clj b/cljfmt/src/cljfmt/main.clj index 3e7434d9..b9c87d1e 100644 --- a/cljfmt/src/cljfmt/main.clj +++ b/cljfmt/src/cljfmt/main.clj @@ -34,7 +34,7 @@ [f]))) (defn- reformat-string [options s] - (cljfmt/reformat-string s options)) + ((cljfmt/wrap-normalize-newlines #(cljfmt/reformat-string % options)) s)) (defn- project-path [{:keys [project-root]} file] (-> project-root (or ".") io/file (relative-path (io/file file)))) diff --git a/cljfmt/test/cljfmt/core_test.cljc b/cljfmt/test/cljfmt/core_test.cljc index 390d9e7c..1f0ce9fc 100644 --- a/cljfmt/test/cljfmt/core_test.cljc +++ b/cljfmt/test/cljfmt/core_test.cljc @@ -1,7 +1,9 @@ (ns cljfmt.core-test (:require [#?@(:clj (clojure.test :refer) :cljs (cljs.test :refer-macros)) [deftest testing is]] - [cljfmt.core :refer [reformat-string]] + [cljfmt.core :refer [reformat-string default-line-separator + normalize-newlines find-line-separator + replace-newlines wrap-normalize-newlines]] [clojure.string :as str])) (deftest test-indent @@ -283,3 +285,32 @@ (is (= (reformat-string "(juxt +' -')") "(juxt +' -')")) (is (= (reformat-string "#\"(?i)foo\"") "#\"(?i)foo\"")) (is (= (reformat-string "#\"a\nb\"") "#\"a\nb\""))) + +(deftest test-normalize-newlines + (is (= (normalize-newlines "foo\nbar\nbaz") "foo\nbar\nbaz")) + (is (= (normalize-newlines "foo\r\nbar\r\nbaz") "foo\nbar\nbaz")) + (is (= (normalize-newlines "foo\r\nbar\nbaz\r\n") "foo\nbar\nbaz\n")) + (is (= (normalize-newlines "foo\\nbar\nbaz\r\n") "foo\\nbar\nbaz\n")) + (is (= (normalize-newlines "foo\\nbar\r\nbaz\r\n") "foo\\nbar\nbaz\n")) + (is (= (normalize-newlines "foo\\nbar\\r\nbaz") "foo\\nbar\\r\nbaz")) + (is (= (normalize-newlines "foobarbaz") "foobarbaz"))) + +(deftest test-find-line-separator + (is (= (find-line-separator "foo\nbar\nbaz") "\n")) + (is (= (find-line-separator "foo\r\nbar\r\nbaz") "\r\n")) + (is (= (find-line-separator "foo\r\nbar\nbaz\r\n") "\r\n")) + (is (= (find-line-separator "foo\\nbar\nbaz\r\n") "\n")) + (is (= (find-line-separator "foo\\nbar\r\nbaz\r\n") "\r\n")) + (is (= (find-line-separator "foo\\nbar\\r\nbaz") "\n")) + (is (= (find-line-separator "foobarbaz") default-line-separator))) + +(deftest test-replace-newlines + (is (= (replace-newlines "foo\nbar\nbaz" "\n") "foo\nbar\nbaz")) + (is (= (replace-newlines "foo\nbar\nbaz" "\r\n") "foo\r\nbar\r\nbaz")) + (is (= (replace-newlines "foobarbaz" "\n") "foobarbaz")) + (is (= (replace-newlines "foobarbaz" "\r\n") "foobarbaz"))) + +(deftest test-wrap-normalize-newlines + (is (= ((wrap-normalize-newlines identity) "foo\nbar\nbaz") "foo\nbar\nbaz")) + (is (= ((wrap-normalize-newlines identity) "foo\r\nbar\r\nbaz") "foo\r\nbar\r\nbaz")) + (is (= ((wrap-normalize-newlines identity) "foobarbaz") "foobarbaz")))