From 96ec2959485c26de418938bd5b0d87adf1bad30e Mon Sep 17 00:00:00 2001 From: Adam Clements Date: Wed, 30 Jun 2021 23:28:43 +0100 Subject: [PATCH] Add Sentence case and Title Case for string output This is for the use-case of formatting a keyword or other symbol into something which you might show to the user in a plain sentence, addressing Feature requests #74 and #37 --- src/camel_snake_kebab/core.cljc | 12 +++++++++++- src/camel_snake_kebab/internals/macros.cljc | 7 ++++++- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/camel_snake_kebab/core.cljc b/src/camel_snake_kebab/core.cljc index 9c6be49..fc587da 100644 --- a/src/camel_snake_kebab/core.cljc +++ b/src/camel_snake_kebab/core.cljc @@ -13,6 +13,8 @@ ->snake_case ->kebab-case ->HTTP-Header-Case + ->Sentence + ->Title ->PascalCaseKeyword ->camelCaseKeyword @@ -21,6 +23,8 @@ ->kebab-case-keyword ->Camel_Snake_Case_Keyword ->HTTP-Header-Case-Keyword + ->Sentencekeyword + ->TitleKeyword ->PascalCaseString ->camelCaseString @@ -29,6 +33,8 @@ ->kebab-case-string ->Camel_Snake_Case_String ->HTTP-Header-Case-String + ->Sentencestring + ->TitleString ->PascalCaseSymbol ->camelCaseSymbol @@ -36,7 +42,9 @@ ->snake_case_symbol ->kebab-case-symbol ->Camel_Snake_Case_Symbol - ->HTTP-Header-Case-Symbol) + ->HTTP-Header-Case-Symbol + ->Sentencesymbol + ->Titlesymbol) (defn convert-case "Converts the case of a string according to the rule for the first @@ -53,3 +61,5 @@ (defconversion "snake_case" clojure.string/lower-case clojure.string/lower-case "_") (defconversion "kebab-case" clojure.string/lower-case clojure.string/lower-case "-") (defconversion "HTTP-Header-Case" camel-snake-kebab.internals.misc/capitalize-http-header camel-snake-kebab.internals.misc/capitalize-http-header "-") +(defconversion "Sentencecase" clojure.string/capitalize clojure.string/lower-case " ") +(defconversion "TitleCase" clojure.string/capitalize clojure.string/capitalize " ") \ No newline at end of file diff --git a/src/camel_snake_kebab/internals/macros.cljc b/src/camel_snake_kebab/internals/macros.cljc index 6a14f41..600679c 100644 --- a/src/camel_snake_kebab/internals/macros.cljc +++ b/src/camel_snake_kebab/internals/macros.cljc @@ -1,7 +1,8 @@ (ns ^:no-doc camel-snake-kebab.internals.macros #?(:cljs (:refer-clojure :exclude [resolve])) (:require [camel-snake-kebab.internals.alter-name :refer [alter-name]] - [camel-snake-kebab.internals.misc :refer [convert-case]])) + [camel-snake-kebab.internals.misc :refer [convert-case]] + [clojure.string])) #?(:cljs (defn resolve [sym] @@ -9,6 +10,9 @@ ;; In that case, we need to use `eval` in order to resolve variables instead of `resolve` (eval `(~'var ~sym)))) +(defn strip-whitespace [s] + (clojure.string/replace s #" " "")) + (defn type-preserving-function [case-label first-fn rest-fn sep] `(defn ~(symbol (str "->" case-label)) [s# & rest#] (let [convert-case# #(apply convert-case ~first-fn ~rest-fn ~sep % rest#)] @@ -19,6 +23,7 @@ (->> (str case-label " " type-label) (convert-case (resolve first-fn) (resolve rest-fn) sep) (str "->") + (strip-whitespace) (symbol)))] (for [[type-label type-converter] {"string" `identity "symbol" `symbol "keyword" `keyword}] `(defn ~(make-name type-label) [s# & rest#]