Unit Test Swift 5.0 Linux Compatible Twitter @eneko

-ke-bab-> 🍢

一个用于在不同大小写和格式之间转换文本的库。

import Kebab

let con = CaseConverter()
con.convert(text: "CaseConverter", from: .PascalCase, to: .snake_case) // case_converter
con.convert(text: "case_converter", from: .snake_case, to: .screamingKebabCase) // CASE-CONVERTER

支持多种单词标识符格式

Kebab 支持以下来自维基百科 多词标识符格式示例 中的格式

格式化 名称
twowords 扁平式
TWOWORDS 大写扁平式
twoWords (小写) 驼峰式, dromedaryCase
TwoWords 帕斯卡式, 大驼峰式, StudlyCase
two_words 蛇底式, pothole_case
TWO_WORDS 啸叫蛇底式, MACRO_CASE, 常量式
two_Words 驼峰蛇底式
Two_Words 帕斯卡蛇底式
two-words 短横线式, dash-case, lisp-case
two|words doner|case
TWO-WORDS 火车式, COBOL-CASE, 啸叫短横线式
Two-Words 火车式, HTTP-Header-Case

多词标识符

MultiwordIdentifier 定义输入和输出转换格式。枚举类型尽可能定义与其大小写格式匹配的类型

public enum MultiWordIdentifier {
    case flatcase              // flatcase
    case UPPERFLATCASE         // UPPERFLATCASE
    case camelCase             // camelCase
    case PascalCase            // PascalCase
    case snake_case            // snake_case
    case MACRO_CASE            // MACRO_CASE
    case camel_Snake_Case      // camel_Snake_Case
    case Pascal_Snake_Case     // Pascal_Snake_Case
    case kebabCase             // kebak-case
    case trainCase             // Train-Case
    case cobolCase             // COBOL-CASE
    case donerCase             // doner|case
}

同义词 / 别名

为了方便起见,还定义了以下别名

extension MultiWordIdentifier {
    public static let lowerCamelCase = Self.camelCase        // lowerCamelCase
    public static let dromedaryCase = Self.camelCase         // dromedaryCase
    public static let UpperCamelCase = Self.PascalCase       // UpperCamelCase
    public static let StudlyCase = Self.PascalCase           // StudlyCase
    public static let pothole_case = Self.snake_case         // pothole_case
    public static let SCREAMING_SNAKE_CASE = Self.MACRO_CASE // SCREAMING_SNAKE_CASE
    public static let CONSTANT_CASE = Self.MACRO_CASE        // CONSTANT_CASE
    public static let spineCase = Self.kebabCase             // spine-case
    public static let dashCase = Self.kebabCase              // dash-case
    public static let lispCase = Self.kebabCase              // lisp-case
    public static let httpHeaderCase = Self.trainCase        // Http-Header-Case
    public static let screamingKebabCase = Self.cobolCase    // SCREAMING-KEBAB-CASE
    public static let screamingTrainCase = Self.cobolCase    // SCREAMING-TRAIN-CASE
}

用法

大小写转换器

CaseConverter 是该库的核心,允许在上面列出的所有格式之间进行转换。 请注意,转换为 flatcaseUPPERFLATCASE 格式是不可逆的。

import Kebab

let con = CaseConverter()
con.convert(text: "CaseConverter", from: .PascalCase, to: .flatcase) // caseconverter
con.convert(text: "caseconverter", from: .flatcase, to: .PascalCase) // Caseconverter ⚠️

CaseConverter 也可以将纯文本作为输入。 此过程将根据格式将任何非字母数字字符替换为适当的分隔符(或无分隔符)。

import Kebab

let con = CaseConverter()
con.convert(text: "A Title for a 100 Blog Post!", from: .plainText, to: .kebabCase)
// a-title-for-a-100-blog-post

连续的分隔符将被删除。

import Kebab

let con = CaseConverter()
con.convert(text: "Too much $$$ I would say!!", from: .plainText, to: .snake_case)
// too_much_i_would_say

大小写检测器

虽然指示输入格式是更可取的(性能更高),但 Kebab 提供了大小写检测器。

import Kebab

let detector = CaseDetector()
detector.detectCase(in: "this-is-kebab-case") // .kebabCase
detector.detectCase(in: "SOME_CONSTANT") // .MACRO_CASE

这允许在不必提供输入格式的情况下使用 CaseConverter(会增加性能损失)。

import Kebab

let con = CaseConverter()
con.convert(text: "this-is-kebab-case", to: .camelCase) // thisIsKebabCase

字符串扩展

为了方便起见,单独的模块 KebabExtensions 提供了 String 的扩展,用于转换和大小写检测。

import KebabExtensions

"Some-Http-Header".converted(to: .donerCase) // some|http|header
"GoodOldPascalCase".converted(to: .SCREAMING_SNAKE_CASE) // GOOD_OLD_PASCAL_CASE

"This_Is_Pascal_Snake_Case".detectCase() // .Pascal_Snake_Case

JSON 编码/解码策略

camelCase(默认)和 snake_case 键编码/解码策略都包含在 Foundation 中,因此该库不提供它们。

但是,此库提供用于处理 JSON 负载的键编码/解码策略,这些键以 PascalCasekebab-case 编码。 这些包含在模块 KebabJSON 中。

import KebabJSON

struct Dto: Codable {
    let propertyName: String
    let anotherProperty: Int
    // Note the lack of custom coding keys
}

let json = """
{
    "property-name": "Property Value",
    "another-property": 42
}
"""

let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromKebabCase  // decode `kebab-case` keys
let dto = try decoder.decode(Dto.self, from: Data(json.utf8))

let encoder = JSONEncoder()
encoder.keyEncodingStrategy = .convertToPascalCase  // encode `PascalCase` keys
let data = try encoder.encode(dto)
// { "PropertyName": "Property Value", "AnotherProperty": 42 }

安装

Kebab 添加到您的 Swift 包

// swift-tools-version:5.0
import PackageDescription

let package = Package(
  name: "YourProject",
  dependencies: [
    .package(url: "https://github.com/eneko/Kebab", from: "1.0.0"),
  ]
)

要求

Swift 5.0+

许可证

MIT

联系方式

Twitter: @eneko