diff --git a/.gitignore b/.gitignore
index 0023a53..3d9d43e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -6,3 +6,4 @@ DerivedData/
.swiftpm/configuration/registries.json
.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata
.netrc
+.nvim/*
diff --git a/.nvim/xcodebuild/coverage.json b/.nvim/xcodebuild/coverage.json
deleted file mode 100644
index d4e0a10..0000000
--- a/.nvim/xcodebuild/coverage.json
+++ /dev/null
@@ -1 +0,0 @@
-{"coveredLines":622,"executableLines":928,"lineCoverage":0.67025862068965514,"targets":[{"buildProductPath":"\/Users\/michael\/Library\/Developer\/Xcode\/DerivedData\/swift-cli-doc-dgihrbuebwxquzdknevkczbenunz\/Build\/Products\/Debug\/PackageFrameworks\/CliDoc_17A221B71A2434_PackageProduct.framework\/CliDoc_17A221B71A2434_PackageProduct","coveredLines":253,"executableLines":406,"files":[{"coveredLines":6,"executableLines":9,"functions":[{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":6,"name":"Label.init(_:)"},{"coveredLines":3,"executableLines":3,"executionCount":4,"lineCoverage":1,"lineNumber":11,"name":"Label.init(_:)"},{"coveredLines":3,"executableLines":3,"executionCount":4,"lineCoverage":1,"lineNumber":16,"name":"Label.body.getter"}],"lineCoverage":0.66666666666666663,"name":"Label.swift","path":"\/Volumes\/Bucket\/Repos\/swift-cli-doc\/Sources\/CliDoc\/Nodes\/Label.swift"},{"coveredLines":6,"executableLines":32,"functions":[{"coveredLines":3,"executableLines":3,"executionCount":27,"lineCoverage":1,"lineNumber":15,"name":"TextNode.render()"},{"coveredLines":3,"executableLines":3,"executionCount":65,"lineCoverage":1,"lineNumber":21,"name":"String.render()"},{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":27,"name":"String.body.getter"},{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":35,"name":"AnyTextNode.init(_:)"},{"coveredLines":0,"executableLines":1,"executionCount":0,"lineCoverage":0,"lineNumber":36,"name":"implicit closure #1 in AnyTextNode.init(_:)"},{"coveredLines":0,"executableLines":1,"executionCount":0,"lineCoverage":0,"lineNumber":39,"name":"AnyTextNode.body.getter"},{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":43,"name":"TextNode.eraseToAnyTextNode()"},{"coveredLines":0,"executableLines":4,"executionCount":0,"lineCoverage":0,"lineNumber":49,"name":"Optional.body.getter"},{"coveredLines":0,"executableLines":4,"executionCount":0,"lineCoverage":0,"lineNumber":57,"name":"Optional.render()"},{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":64,"name":"Array.body.getter"},{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":70,"name":"Array.render()"},{"coveredLines":0,"executableLines":1,"executionCount":0,"lineCoverage":0,"lineNumber":71,"name":"closure #1 in Array.render()"}],"lineCoverage":0.1875,"name":"TextNode.swift","path":"\/Volumes\/Bucket\/Repos\/swift-cli-doc\/Sources\/CliDoc\/TextNode.swift"},{"coveredLines":14,"executableLines":17,"functions":[{"coveredLines":3,"executableLines":3,"executionCount":5,"lineCoverage":1,"lineNumber":5,"name":"TextNode.textStyle(_:)"},{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":10,"name":"TextNode.textStyle(_:)"},{"coveredLines":3,"executableLines":3,"executionCount":5,"lineCoverage":1,"lineNumber":22,"name":"StyleModifier.init(styles:)"},{"coveredLines":5,"executableLines":5,"executionCount":5,"lineCoverage":1,"lineNumber":27,"name":"StyleModifier.render(content:)"},{"coveredLines":3,"executableLines":3,"executionCount":5,"lineCoverage":1,"lineNumber":28,"name":"closure #1 in StyleModifier.render(content:)"}],"lineCoverage":0.82352941176470584,"name":"TextStyleModifier.swift","path":"\/Volumes\/Bucket\/Repos\/swift-cli-doc\/Sources\/CliDoc\/Modifiers\/TextStyleModifier.swift"},{"coveredLines":14,"executableLines":14,"functions":[{"coveredLines":3,"executableLines":3,"executionCount":4,"lineCoverage":1,"lineNumber":9,"name":"ShellCommand.style(_:)"},{"coveredLines":1,"executableLines":1,"executionCount":4,"lineCoverage":1,"lineNumber":17,"name":"static ShellCommandStyle<>.default.getter"},{"coveredLines":6,"executableLines":6,"executionCount":4,"lineCoverage":1,"lineNumber":22,"name":"DefaultShellCommandStyle.render(content:)"},{"coveredLines":4,"executableLines":4,"executionCount":4,"lineCoverage":1,"lineNumber":23,"name":"closure #1 in DefaultShellCommandStyle.render(content:)"}],"lineCoverage":1,"name":"ShellCommandStyle.swift","path":"\/Volumes\/Bucket\/Repos\/swift-cli-doc\/Sources\/CliDoc\/Modifiers\/ShellCommandStyle.swift"},{"coveredLines":0,"executableLines":19,"functions":[{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":4,"name":"TextNode.labelStyle(color:styles:)"},{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":8,"name":"TextNode.labelStyle(color:styles:)"},{"coveredLines":0,"executableLines":4,"executionCount":0,"lineCoverage":0,"lineNumber":21,"name":"LabelStyle.init(color:styles:)"},{"coveredLines":0,"executableLines":8,"executionCount":0,"lineCoverage":0,"lineNumber":27,"name":"LabelStyle.render(content:)"},{"coveredLines":0,"executableLines":1,"executionCount":0,"lineCoverage":0,"lineNumber":33,"name":"closure #1 in LabelStyle.render(content:)"}],"lineCoverage":0,"name":"LabelStyleModifier.swift","path":"\/Volumes\/Bucket\/Repos\/swift-cli-doc\/Sources\/CliDoc\/Modifiers\/LabelStyleModifier.swift"},{"coveredLines":7,"executableLines":11,"functions":[{"coveredLines":4,"executableLines":4,"executionCount":4,"lineCoverage":1,"lineNumber":13,"name":"ShellCommand.init(symbol:content:)"},{"coveredLines":3,"executableLines":3,"executionCount":2,"lineCoverage":1,"lineNumber":19,"name":"ShellCommand.body.getter"},{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":29,"name":"ShellCommand<>.init(_:symbol:)"},{"coveredLines":0,"executableLines":1,"executionCount":0,"lineCoverage":0,"lineNumber":30,"name":"closure #1 in ShellCommand<>.init(_:symbol:)"}],"lineCoverage":0.63636363636363635,"name":"ShellCommand.swift","path":"\/Volumes\/Bucket\/Repos\/swift-cli-doc\/Sources\/CliDoc\/Nodes\/ShellCommand.swift"},{"coveredLines":8,"executableLines":8,"functions":[{"coveredLines":4,"executableLines":4,"executionCount":8,"lineCoverage":1,"lineNumber":13,"name":"HStack.init(spacing:content:)"},{"coveredLines":3,"executableLines":3,"executionCount":8,"lineCoverage":1,"lineNumber":19,"name":"HStack.body.getter"},{"coveredLines":1,"executableLines":1,"executionCount":16,"lineCoverage":1,"lineNumber":20,"name":"closure #1 in HStack.body.getter"}],"lineCoverage":1,"name":"HStack.swift","path":"\/Volumes\/Bucket\/Repos\/swift-cli-doc\/Sources\/CliDoc\/Nodes\/HStack.swift"},{"coveredLines":25,"executableLines":47,"functions":[{"coveredLines":3,"executableLines":3,"executionCount":42,"lineCoverage":1,"lineNumber":5,"name":"static TextBuilder.buildPartialBlock(first:)"},{"coveredLines":3,"executableLines":3,"executionCount":16,"lineCoverage":1,"lineNumber":10,"name":"static TextBuilder.buildPartialBlock(accumulated:next:)"},{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":15,"name":"static TextBuilder.buildArray(_:)"},{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":20,"name":"static TextBuilder.buildBlock(_:)"},{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":25,"name":"static TextBuilder.buildEither(first:)"},{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":30,"name":"static TextBuilder.buildEither(second:)"},{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":35,"name":"static TextBuilder.buildOptional(_:)"},{"coveredLines":0,"executableLines":6,"executionCount":0,"lineCoverage":0,"lineNumber":45,"name":"EitherNode.body.getter"},{"coveredLines":9,"executableLines":9,"executionCount":16,"lineCoverage":1,"lineNumber":59,"name":"NodeContainer.init(nodes:)"},{"coveredLines":6,"executableLines":7,"executionCount":32,"lineCoverage":0.8571428571428571,"lineNumber":60,"name":"closure #1 in NodeContainer.init(nodes:)"},{"coveredLines":3,"executableLines":3,"executionCount":1,"lineCoverage":1,"lineNumber":70,"name":"NodeContainer.body.getter"},{"coveredLines":1,"executableLines":1,"executionCount":2,"lineCoverage":1,"lineNumber":71,"name":"closure #1 in NodeContainer.body.getter"}],"lineCoverage":0.53191489361702127,"name":"Builder.swift","path":"\/Volumes\/Bucket\/Repos\/swift-cli-doc\/Sources\/CliDoc\/Builder.swift"},{"coveredLines":0,"executableLines":16,"functions":[{"coveredLines":0,"executableLines":5,"executionCount":0,"lineCoverage":0,"lineNumber":17,"name":"Section.init(header:content:footer:)"},{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":23,"name":"Section.body.getter"},{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":33,"name":"Section<>.init(header:content:)"},{"coveredLines":0,"executableLines":1,"executionCount":0,"lineCoverage":0,"lineNumber":34,"name":"closure #1 in Section<>.init(header:content:)"},{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":43,"name":"Section<>.init(content:footer:)"},{"coveredLines":0,"executableLines":1,"executionCount":0,"lineCoverage":0,"lineNumber":44,"name":"closure #1 in Section<>.init(content:footer:)"}],"lineCoverage":0,"name":"Section.swift","path":"\/Volumes\/Bucket\/Repos\/swift-cli-doc\/Sources\/CliDoc\/Nodes\/Section.swift"},{"coveredLines":11,"executableLines":27,"functions":[{"coveredLines":0,"executableLines":4,"executionCount":0,"lineCoverage":0,"lineNumber":14,"name":"Note.init(_:content:)"},{"coveredLines":3,"executableLines":3,"executionCount":1,"lineCoverage":1,"lineNumber":20,"name":"Note.body.getter"},{"coveredLines":4,"executableLines":4,"executionCount":1,"lineCoverage":1,"lineNumber":31,"name":"Note<>.init(_:content:)"},{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":39,"name":"static Note<>.important(_:content:)"},{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":46,"name":"static Note<>.seeAlso(_:content:)"},{"coveredLines":3,"executableLines":3,"executionCount":1,"lineCoverage":1,"lineNumber":57,"name":"Note<>.init(_:content:)"},{"coveredLines":1,"executableLines":1,"executionCount":1,"lineCoverage":1,"lineNumber":58,"name":"closure #1 in Note<>.init(_:content:)"},{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":64,"name":"static Note<>.important(_:content:)"},{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":71,"name":"static Note<>.seeAlso(_:content:)"}],"lineCoverage":0.40740740740740738,"name":"Note.swift","path":"\/Volumes\/Bucket\/Repos\/swift-cli-doc\/Sources\/CliDoc\/Nodes\/Note.swift"},{"coveredLines":16,"executableLines":16,"functions":[{"coveredLines":3,"executableLines":3,"executionCount":1,"lineCoverage":1,"lineNumber":9,"name":"Note.noteStyle(_:)"},{"coveredLines":3,"executableLines":3,"executionCount":1,"lineCoverage":1,"lineNumber":17,"name":"static NoteStyleModifier<>.default.getter"},{"coveredLines":6,"executableLines":6,"executionCount":1,"lineCoverage":1,"lineNumber":24,"name":"DefaultNoteStyle.render(content:)"},{"coveredLines":4,"executableLines":4,"executionCount":1,"lineCoverage":1,"lineNumber":25,"name":"closure #1 in DefaultNoteStyle.render(content:)"}],"lineCoverage":1,"name":"NoteStyleModifier.swift","path":"\/Volumes\/Bucket\/Repos\/swift-cli-doc\/Sources\/CliDoc\/Modifiers\/NoteStyleModifier.swift"},{"coveredLines":13,"executableLines":23,"functions":[{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":17,"name":"NodeModifier.concat(_:)"},{"coveredLines":0,"executableLines":4,"executionCount":0,"lineCoverage":0,"lineNumber":26,"name":"ConcatModifier.render(content:)"},{"coveredLines":4,"executableLines":4,"executionCount":6,"lineCoverage":1,"lineNumber":40,"name":"ModifiedNode.init(content:modifier:)"},{"coveredLines":3,"executableLines":3,"executionCount":6,"lineCoverage":1,"lineNumber":47,"name":"ModifiedNode<>.body.getter"},{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":52,"name":"ModifiedNode<>.apply(_:)"},{"coveredLines":3,"executableLines":3,"executionCount":6,"lineCoverage":1,"lineNumber":58,"name":"ModifiedNode<>.render()"},{"coveredLines":3,"executableLines":3,"executionCount":6,"lineCoverage":1,"lineNumber":65,"name":"TextNode.modifier(_:)"}],"lineCoverage":0.56521739130434778,"name":"NodeModifier.swift","path":"\/Volumes\/Bucket\/Repos\/swift-cli-doc\/Sources\/CliDoc\/NodeModifier.swift"},{"coveredLines":8,"executableLines":8,"functions":[{"coveredLines":4,"executableLines":4,"executionCount":9,"lineCoverage":1,"lineNumber":13,"name":"VStack.init(spacing:content:)"},{"coveredLines":3,"executableLines":3,"executionCount":9,"lineCoverage":1,"lineNumber":19,"name":"VStack.body.getter"},{"coveredLines":1,"executableLines":1,"executionCount":18,"lineCoverage":1,"lineNumber":20,"name":"closure #1 in VStack.body.getter"}],"lineCoverage":1,"name":"VStack.swift","path":"\/Volumes\/Bucket\/Repos\/swift-cli-doc\/Sources\/CliDoc\/Nodes\/VStack.swift"},{"coveredLines":17,"executableLines":20,"functions":[{"coveredLines":7,"executableLines":9,"executionCount":17,"lineCoverage":0.77777777777777779,"lineNumber":2,"name":"array(from:)"},{"coveredLines":9,"executableLines":9,"executionCount":17,"lineCoverage":1,"lineNumber":13,"name":"seperator(_:count:)"},{"coveredLines":1,"executableLines":1,"executionCount":17,"lineCoverage":1,"lineNumber":14,"name":"implicit closure #1 in seperator(_:count:)"},{"coveredLines":0,"executableLines":1,"executionCount":0,"lineCoverage":0,"lineNumber":14,"name":"implicit closure #2 in seperator(_:count:)"}],"lineCoverage":0.84999999999999998,"name":"Utils.swift","path":"\/Volumes\/Bucket\/Repos\/swift-cli-doc\/Sources\/CliDoc\/Utils.swift"},{"coveredLines":80,"executableLines":83,"functions":[{"coveredLines":7,"executableLines":7,"executionCount":1,"lineCoverage":1,"lineNumber":5,"name":"ExampleSection.style(_:)"},{"coveredLines":7,"executableLines":7,"executionCount":1,"lineCoverage":1,"lineNumber":13,"name":"ExampleSection.exampleStyle(_:)"},{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":23,"name":"Array.exampleStyle(_:)"},{"coveredLines":5,"executableLines":5,"executionCount":2,"lineCoverage":1,"lineNumber":39,"name":"ExampleSectionConfiguration.init(header:label:examples:)"},{"coveredLines":3,"executableLines":3,"executionCount":2,"lineCoverage":1,"lineNumber":51,"name":"ExampleConfiguration.init(examples:)"},{"coveredLines":3,"executableLines":3,"executionCount":1,"lineCoverage":1,"lineNumber":60,"name":"static ExampleSectionStyle<>.default(exampleStyle:)"},{"coveredLines":3,"executableLines":3,"executionCount":1,"lineCoverage":1,"lineNumber":66,"name":"static ExampleStyle<>.default.getter"},{"coveredLines":3,"executableLines":3,"executionCount":2,"lineCoverage":1,"lineNumber":77,"name":"DefaultExamplesStyle.init(exampleStyle:)"},{"coveredLines":9,"executableLines":9,"executionCount":2,"lineCoverage":1,"lineNumber":82,"name":"DefaultExamplesStyle.render(content:)"},{"coveredLines":7,"executableLines":7,"executionCount":2,"lineCoverage":1,"lineNumber":83,"name":"closure #1 in DefaultExamplesStyle.render(content:)"},{"coveredLines":4,"executableLines":4,"executionCount":2,"lineCoverage":1,"lineNumber":84,"name":"closure #1 in closure #1 in DefaultExamplesStyle.render(content:)"},{"coveredLines":10,"executableLines":10,"executionCount":1,"lineCoverage":1,"lineNumber":95,"name":"DefaultExampleStyle.render(content:)"},{"coveredLines":8,"executableLines":8,"executionCount":1,"lineCoverage":1,"lineNumber":96,"name":"closure #1 in DefaultExampleStyle.render(content:)"},{"coveredLines":6,"executableLines":6,"executionCount":2,"lineCoverage":1,"lineNumber":97,"name":"closure #1 in closure #1 in DefaultExampleStyle.render(content:)"},{"coveredLines":4,"executableLines":4,"executionCount":2,"lineCoverage":1,"lineNumber":98,"name":"closure #1 in closure #1 in closure #1 in DefaultExampleStyle.render(content:)"},{"coveredLines":1,"executableLines":1,"executionCount":2,"lineCoverage":1,"lineNumber":100,"name":"closure #1 in closure #1 in closure #1 in closure #1 in DefaultExampleStyle.render(content:)"}],"lineCoverage":0.96385542168674698,"name":"ExamplesStyle.swift","path":"\/Volumes\/Bucket\/Repos\/swift-cli-doc\/Sources\/CliDoc\/Modifiers\/ExamplesStyle.swift"},{"coveredLines":13,"executableLines":16,"functions":[{"coveredLines":5,"executableLines":5,"executionCount":2,"lineCoverage":1,"lineNumber":20,"name":"ExampleSection.init(examples:header:label:)"},{"coveredLines":3,"executableLines":3,"executionCount":1,"lineCoverage":1,"lineNumber":27,"name":"ExampleSection.body.getter"},{"coveredLines":3,"executableLines":3,"executionCount":2,"lineCoverage":1,"lineNumber":38,"name":"ExampleSection<>.init(header:label:examples:)"},{"coveredLines":1,"executableLines":1,"executionCount":2,"lineCoverage":1,"lineNumber":39,"name":"closure #1 in ExampleSection<>.init(header:label:examples:)"},{"coveredLines":1,"executableLines":1,"executionCount":2,"lineCoverage":1,"lineNumber":39,"name":"closure #2 in ExampleSection<>.init(header:label:examples:)"},{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":47,"name":"ExampleSection<>.init(header:label:examples:)"}],"lineCoverage":0.8125,"name":"ExampleSection.swift","path":"\/Volumes\/Bucket\/Repos\/swift-cli-doc\/Sources\/CliDoc\/Nodes\/ExampleSection.swift"},{"coveredLines":6,"executableLines":6,"functions":[{"coveredLines":3,"executableLines":3,"executionCount":1,"lineCoverage":1,"lineNumber":8,"name":"Group.init(content:)"},{"coveredLines":3,"executableLines":3,"executionCount":1,"lineCoverage":1,"lineNumber":13,"name":"Group.body.getter"}],"lineCoverage":1,"name":"Group.swift","path":"\/Volumes\/Bucket\/Repos\/swift-cli-doc\/Sources\/CliDoc\/Nodes\/Group.swift"},{"coveredLines":0,"executableLines":4,"functions":[{"coveredLines":0,"executableLines":1,"executionCount":0,"lineCoverage":0,"lineNumber":5,"name":"Empty.init()"},{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":8,"name":"Empty.body.getter"}],"lineCoverage":0,"name":"Empty.swift","path":"\/Volumes\/Bucket\/Repos\/swift-cli-doc\/Sources\/CliDoc\/Nodes\/Empty.swift"},{"coveredLines":9,"executableLines":9,"functions":[{"coveredLines":3,"executableLines":3,"executionCount":1,"lineCoverage":1,"lineNumber":5,"name":"TextNode.color(_:)"},{"coveredLines":3,"executableLines":3,"executionCount":1,"lineCoverage":1,"lineNumber":16,"name":"ColorModifier.init(color:)"},{"coveredLines":3,"executableLines":3,"executionCount":1,"lineCoverage":1,"lineNumber":21,"name":"ColorModifier.render(content:)"}],"lineCoverage":1,"name":"ColorModifier.swift","path":"\/Volumes\/Bucket\/Repos\/swift-cli-doc\/Sources\/CliDoc\/Modifiers\/ColorModifier.swift"},{"coveredLines":0,"executableLines":21,"functions":[{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":4,"name":"Section.style(_:)"},{"coveredLines":0,"executableLines":5,"executionCount":0,"lineCoverage":0,"lineNumber":15,"name":"SectionConfiguration.init(header:content:footer:)"},{"coveredLines":0,"executableLines":1,"executionCount":0,"lineCoverage":0,"lineNumber":25,"name":"static SectionStyle<>.default.getter"},{"coveredLines":0,"executableLines":7,"executionCount":0,"lineCoverage":0,"lineNumber":30,"name":"DefaultSectionStyle.render(content:)"},{"coveredLines":0,"executableLines":5,"executionCount":0,"lineCoverage":0,"lineNumber":31,"name":"closure #1 in DefaultSectionStyle.render(content:)"}],"lineCoverage":0,"name":"SectionStyle.swift","path":"\/Volumes\/Bucket\/Repos\/swift-cli-doc\/Sources\/CliDoc\/Modifiers\/SectionStyle.swift"}],"lineCoverage":0.62315270935960587,"name":"CliDoc"},{"buildProductPath":"\/Users\/michael\/Library\/Developer\/Xcode\/DerivedData\/swift-cli-doc-dgihrbuebwxquzdknevkczbenunz\/Build\/Products\/Debug\/CliDocTests.xctest\/Contents\/MacOS\/CliDocTests","coveredLines":369,"executableLines":522,"files":[{"coveredLines":6,"executableLines":9,"functions":[{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":6,"name":"Label.init(_:)"},{"coveredLines":3,"executableLines":3,"executionCount":4,"lineCoverage":1,"lineNumber":11,"name":"Label.init(_:)"},{"coveredLines":3,"executableLines":3,"executionCount":4,"lineCoverage":1,"lineNumber":16,"name":"Label.body.getter"}],"lineCoverage":0.66666666666666663,"name":"Label.swift","path":"\/Volumes\/Bucket\/Repos\/swift-cli-doc\/Sources\/CliDoc\/Nodes\/Label.swift"},{"coveredLines":6,"executableLines":32,"functions":[{"coveredLines":3,"executableLines":3,"executionCount":27,"lineCoverage":1,"lineNumber":15,"name":"TextNode.render()"},{"coveredLines":3,"executableLines":3,"executionCount":65,"lineCoverage":1,"lineNumber":21,"name":"String.render()"},{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":27,"name":"String.body.getter"},{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":35,"name":"AnyTextNode.init(_:)"},{"coveredLines":0,"executableLines":1,"executionCount":0,"lineCoverage":0,"lineNumber":36,"name":"implicit closure #1 in AnyTextNode.init(_:)"},{"coveredLines":0,"executableLines":1,"executionCount":0,"lineCoverage":0,"lineNumber":39,"name":"AnyTextNode.body.getter"},{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":43,"name":"TextNode.eraseToAnyTextNode()"},{"coveredLines":0,"executableLines":4,"executionCount":0,"lineCoverage":0,"lineNumber":49,"name":"Optional.body.getter"},{"coveredLines":0,"executableLines":4,"executionCount":0,"lineCoverage":0,"lineNumber":57,"name":"Optional.render()"},{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":64,"name":"Array.body.getter"},{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":70,"name":"Array.render()"},{"coveredLines":0,"executableLines":1,"executionCount":0,"lineCoverage":0,"lineNumber":71,"name":"closure #1 in Array.render()"}],"lineCoverage":0.1875,"name":"TextNode.swift","path":"\/Volumes\/Bucket\/Repos\/swift-cli-doc\/Sources\/CliDoc\/TextNode.swift"},{"coveredLines":14,"executableLines":17,"functions":[{"coveredLines":3,"executableLines":3,"executionCount":5,"lineCoverage":1,"lineNumber":5,"name":"TextNode.textStyle(_:)"},{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":10,"name":"TextNode.textStyle(_:)"},{"coveredLines":3,"executableLines":3,"executionCount":5,"lineCoverage":1,"lineNumber":22,"name":"StyleModifier.init(styles:)"},{"coveredLines":5,"executableLines":5,"executionCount":5,"lineCoverage":1,"lineNumber":27,"name":"StyleModifier.render(content:)"},{"coveredLines":3,"executableLines":3,"executionCount":5,"lineCoverage":1,"lineNumber":28,"name":"closure #1 in StyleModifier.render(content:)"}],"lineCoverage":0.82352941176470584,"name":"TextStyleModifier.swift","path":"\/Volumes\/Bucket\/Repos\/swift-cli-doc\/Sources\/CliDoc\/Modifiers\/TextStyleModifier.swift"},{"coveredLines":116,"executableLines":116,"functions":[{"coveredLines":5,"executableLines":5,"executionCount":1,"lineCoverage":1,"lineNumber":6,"name":"closure #1 in variable initialization expression of setupRainbow"},{"coveredLines":8,"executableLines":8,"executionCount":1,"lineCoverage":1,"lineNumber":13,"name":"testGroup()"},{"coveredLines":4,"executableLines":4,"executionCount":1,"lineCoverage":1,"lineNumber":15,"name":"closure #1 in testGroup()"},{"coveredLines":8,"executableLines":8,"executionCount":1,"lineCoverage":1,"lineNumber":23,"name":"testHStack()"},{"coveredLines":4,"executableLines":4,"executionCount":1,"lineCoverage":1,"lineNumber":25,"name":"closure #1 in testHStack()"},{"coveredLines":11,"executableLines":11,"executionCount":1,"lineCoverage":1,"lineNumber":33,"name":"testVStack()"},{"coveredLines":4,"executableLines":4,"executionCount":1,"lineCoverage":1,"lineNumber":35,"name":"closure #1 in testVStack()"},{"coveredLines":8,"executableLines":8,"executionCount":1,"lineCoverage":1,"lineNumber":46,"name":"testNote()"},{"coveredLines":17,"executableLines":17,"executionCount":1,"lineCoverage":1,"lineNumber":56,"name":"testExamples()"},{"coveredLines":18,"executableLines":18,"executionCount":1,"lineCoverage":1,"lineNumber":75,"name":"testExamplesWithCustomExampleOnlyStyle()"},{"coveredLines":10,"executableLines":10,"executionCount":1,"lineCoverage":1,"lineNumber":95,"name":"CustomExampleOnlyStyle.render(content:)"},{"coveredLines":8,"executableLines":8,"executionCount":1,"lineCoverage":1,"lineNumber":96,"name":"closure #1 in CustomExampleOnlyStyle.render(content:)"},{"coveredLines":6,"executableLines":6,"executionCount":2,"lineCoverage":1,"lineNumber":97,"name":"closure #1 in closure #1 in CustomExampleOnlyStyle.render(content:)"},{"coveredLines":4,"executableLines":4,"executionCount":2,"lineCoverage":1,"lineNumber":98,"name":"closure #1 in closure #1 in closure #1 in CustomExampleOnlyStyle.render(content:)"},{"coveredLines":1,"executableLines":1,"executionCount":2,"lineCoverage":1,"lineNumber":100,"name":"closure #1 in closure #1 in closure #1 in closure #1 in CustomExampleOnlyStyle.render(content:)"}],"lineCoverage":1,"name":"CliDocTests.swift","path":"\/Volumes\/Bucket\/Repos\/swift-cli-doc\/Tests\/CliDocTests\/CliDocTests.swift"},{"coveredLines":14,"executableLines":14,"functions":[{"coveredLines":3,"executableLines":3,"executionCount":4,"lineCoverage":1,"lineNumber":9,"name":"ShellCommand.style(_:)"},{"coveredLines":1,"executableLines":1,"executionCount":4,"lineCoverage":1,"lineNumber":17,"name":"static ShellCommandStyle<>.default.getter"},{"coveredLines":6,"executableLines":6,"executionCount":4,"lineCoverage":1,"lineNumber":22,"name":"DefaultShellCommandStyle.render(content:)"},{"coveredLines":4,"executableLines":4,"executionCount":4,"lineCoverage":1,"lineNumber":23,"name":"closure #1 in DefaultShellCommandStyle.render(content:)"}],"lineCoverage":1,"name":"ShellCommandStyle.swift","path":"\/Volumes\/Bucket\/Repos\/swift-cli-doc\/Sources\/CliDoc\/Modifiers\/ShellCommandStyle.swift"},{"coveredLines":0,"executableLines":19,"functions":[{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":4,"name":"TextNode.labelStyle(color:styles:)"},{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":8,"name":"TextNode.labelStyle(color:styles:)"},{"coveredLines":0,"executableLines":4,"executionCount":0,"lineCoverage":0,"lineNumber":21,"name":"LabelStyle.init(color:styles:)"},{"coveredLines":0,"executableLines":8,"executionCount":0,"lineCoverage":0,"lineNumber":27,"name":"LabelStyle.render(content:)"},{"coveredLines":0,"executableLines":1,"executionCount":0,"lineCoverage":0,"lineNumber":33,"name":"closure #1 in LabelStyle.render(content:)"}],"lineCoverage":0,"name":"LabelStyleModifier.swift","path":"\/Volumes\/Bucket\/Repos\/swift-cli-doc\/Sources\/CliDoc\/Modifiers\/LabelStyleModifier.swift"},{"coveredLines":7,"executableLines":11,"functions":[{"coveredLines":4,"executableLines":4,"executionCount":4,"lineCoverage":1,"lineNumber":13,"name":"ShellCommand.init(symbol:content:)"},{"coveredLines":3,"executableLines":3,"executionCount":2,"lineCoverage":1,"lineNumber":19,"name":"ShellCommand.body.getter"},{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":29,"name":"ShellCommand<>.init(_:symbol:)"},{"coveredLines":0,"executableLines":1,"executionCount":0,"lineCoverage":0,"lineNumber":30,"name":"closure #1 in ShellCommand<>.init(_:symbol:)"}],"lineCoverage":0.63636363636363635,"name":"ShellCommand.swift","path":"\/Volumes\/Bucket\/Repos\/swift-cli-doc\/Sources\/CliDoc\/Nodes\/ShellCommand.swift"},{"coveredLines":8,"executableLines":8,"functions":[{"coveredLines":4,"executableLines":4,"executionCount":8,"lineCoverage":1,"lineNumber":13,"name":"HStack.init(spacing:content:)"},{"coveredLines":3,"executableLines":3,"executionCount":8,"lineCoverage":1,"lineNumber":19,"name":"HStack.body.getter"},{"coveredLines":1,"executableLines":1,"executionCount":16,"lineCoverage":1,"lineNumber":20,"name":"closure #1 in HStack.body.getter"}],"lineCoverage":1,"name":"HStack.swift","path":"\/Volumes\/Bucket\/Repos\/swift-cli-doc\/Sources\/CliDoc\/Nodes\/HStack.swift"},{"coveredLines":0,"executableLines":16,"functions":[{"coveredLines":0,"executableLines":5,"executionCount":0,"lineCoverage":0,"lineNumber":17,"name":"Section.init(header:content:footer:)"},{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":23,"name":"Section.body.getter"},{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":33,"name":"Section<>.init(header:content:)"},{"coveredLines":0,"executableLines":1,"executionCount":0,"lineCoverage":0,"lineNumber":34,"name":"closure #1 in Section<>.init(header:content:)"},{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":43,"name":"Section<>.init(content:footer:)"},{"coveredLines":0,"executableLines":1,"executionCount":0,"lineCoverage":0,"lineNumber":44,"name":"closure #1 in Section<>.init(content:footer:)"}],"lineCoverage":0,"name":"Section.swift","path":"\/Volumes\/Bucket\/Repos\/swift-cli-doc\/Sources\/CliDoc\/Nodes\/Section.swift"},{"coveredLines":25,"executableLines":47,"functions":[{"coveredLines":3,"executableLines":3,"executionCount":42,"lineCoverage":1,"lineNumber":5,"name":"static TextBuilder.buildPartialBlock(first:)"},{"coveredLines":3,"executableLines":3,"executionCount":16,"lineCoverage":1,"lineNumber":10,"name":"static TextBuilder.buildPartialBlock(accumulated:next:)"},{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":15,"name":"static TextBuilder.buildArray(_:)"},{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":20,"name":"static TextBuilder.buildBlock(_:)"},{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":25,"name":"static TextBuilder.buildEither(first:)"},{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":30,"name":"static TextBuilder.buildEither(second:)"},{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":35,"name":"static TextBuilder.buildOptional(_:)"},{"coveredLines":0,"executableLines":6,"executionCount":0,"lineCoverage":0,"lineNumber":45,"name":"EitherNode.body.getter"},{"coveredLines":9,"executableLines":9,"executionCount":16,"lineCoverage":1,"lineNumber":59,"name":"NodeContainer.init(nodes:)"},{"coveredLines":6,"executableLines":7,"executionCount":32,"lineCoverage":0.8571428571428571,"lineNumber":60,"name":"closure #1 in NodeContainer.init(nodes:)"},{"coveredLines":3,"executableLines":3,"executionCount":1,"lineCoverage":1,"lineNumber":70,"name":"NodeContainer.body.getter"},{"coveredLines":1,"executableLines":1,"executionCount":2,"lineCoverage":1,"lineNumber":71,"name":"closure #1 in NodeContainer.body.getter"}],"lineCoverage":0.53191489361702127,"name":"Builder.swift","path":"\/Volumes\/Bucket\/Repos\/swift-cli-doc\/Sources\/CliDoc\/Builder.swift"},{"coveredLines":11,"executableLines":27,"functions":[{"coveredLines":0,"executableLines":4,"executionCount":0,"lineCoverage":0,"lineNumber":14,"name":"Note.init(_:content:)"},{"coveredLines":3,"executableLines":3,"executionCount":1,"lineCoverage":1,"lineNumber":20,"name":"Note.body.getter"},{"coveredLines":4,"executableLines":4,"executionCount":1,"lineCoverage":1,"lineNumber":31,"name":"Note<>.init(_:content:)"},{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":39,"name":"static Note<>.important(_:content:)"},{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":46,"name":"static Note<>.seeAlso(_:content:)"},{"coveredLines":3,"executableLines":3,"executionCount":1,"lineCoverage":1,"lineNumber":57,"name":"Note<>.init(_:content:)"},{"coveredLines":1,"executableLines":1,"executionCount":1,"lineCoverage":1,"lineNumber":58,"name":"closure #1 in Note<>.init(_:content:)"},{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":64,"name":"static Note<>.important(_:content:)"},{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":71,"name":"static Note<>.seeAlso(_:content:)"}],"lineCoverage":0.40740740740740738,"name":"Note.swift","path":"\/Volumes\/Bucket\/Repos\/swift-cli-doc\/Sources\/CliDoc\/Nodes\/Note.swift"},{"coveredLines":16,"executableLines":16,"functions":[{"coveredLines":3,"executableLines":3,"executionCount":1,"lineCoverage":1,"lineNumber":9,"name":"Note.noteStyle(_:)"},{"coveredLines":3,"executableLines":3,"executionCount":1,"lineCoverage":1,"lineNumber":17,"name":"static NoteStyleModifier<>.default.getter"},{"coveredLines":6,"executableLines":6,"executionCount":1,"lineCoverage":1,"lineNumber":24,"name":"DefaultNoteStyle.render(content:)"},{"coveredLines":4,"executableLines":4,"executionCount":1,"lineCoverage":1,"lineNumber":25,"name":"closure #1 in DefaultNoteStyle.render(content:)"}],"lineCoverage":1,"name":"NoteStyleModifier.swift","path":"\/Volumes\/Bucket\/Repos\/swift-cli-doc\/Sources\/CliDoc\/Modifiers\/NoteStyleModifier.swift"},{"coveredLines":8,"executableLines":8,"functions":[{"coveredLines":4,"executableLines":4,"executionCount":9,"lineCoverage":1,"lineNumber":13,"name":"VStack.init(spacing:content:)"},{"coveredLines":3,"executableLines":3,"executionCount":9,"lineCoverage":1,"lineNumber":19,"name":"VStack.body.getter"},{"coveredLines":1,"executableLines":1,"executionCount":18,"lineCoverage":1,"lineNumber":20,"name":"closure #1 in VStack.body.getter"}],"lineCoverage":1,"name":"VStack.swift","path":"\/Volumes\/Bucket\/Repos\/swift-cli-doc\/Sources\/CliDoc\/Nodes\/VStack.swift"},{"coveredLines":13,"executableLines":23,"functions":[{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":17,"name":"NodeModifier.concat(_:)"},{"coveredLines":0,"executableLines":4,"executionCount":0,"lineCoverage":0,"lineNumber":26,"name":"ConcatModifier.render(content:)"},{"coveredLines":4,"executableLines":4,"executionCount":6,"lineCoverage":1,"lineNumber":40,"name":"ModifiedNode.init(content:modifier:)"},{"coveredLines":3,"executableLines":3,"executionCount":6,"lineCoverage":1,"lineNumber":47,"name":"ModifiedNode<>.body.getter"},{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":52,"name":"ModifiedNode<>.apply(_:)"},{"coveredLines":3,"executableLines":3,"executionCount":6,"lineCoverage":1,"lineNumber":58,"name":"ModifiedNode<>.render()"},{"coveredLines":3,"executableLines":3,"executionCount":6,"lineCoverage":1,"lineNumber":65,"name":"TextNode.modifier(_:)"}],"lineCoverage":0.56521739130434778,"name":"NodeModifier.swift","path":"\/Volumes\/Bucket\/Repos\/swift-cli-doc\/Sources\/CliDoc\/NodeModifier.swift"},{"coveredLines":9,"executableLines":9,"functions":[{"coveredLines":3,"executableLines":3,"executionCount":1,"lineCoverage":1,"lineNumber":5,"name":"TextNode.color(_:)"},{"coveredLines":3,"executableLines":3,"executionCount":1,"lineCoverage":1,"lineNumber":16,"name":"ColorModifier.init(color:)"},{"coveredLines":3,"executableLines":3,"executionCount":1,"lineCoverage":1,"lineNumber":21,"name":"ColorModifier.render(content:)"}],"lineCoverage":1,"name":"ColorModifier.swift","path":"\/Volumes\/Bucket\/Repos\/swift-cli-doc\/Sources\/CliDoc\/Modifiers\/ColorModifier.swift"},{"coveredLines":13,"executableLines":16,"functions":[{"coveredLines":5,"executableLines":5,"executionCount":2,"lineCoverage":1,"lineNumber":20,"name":"ExampleSection.init(examples:header:label:)"},{"coveredLines":3,"executableLines":3,"executionCount":1,"lineCoverage":1,"lineNumber":27,"name":"ExampleSection.body.getter"},{"coveredLines":3,"executableLines":3,"executionCount":2,"lineCoverage":1,"lineNumber":38,"name":"ExampleSection<>.init(header:label:examples:)"},{"coveredLines":1,"executableLines":1,"executionCount":2,"lineCoverage":1,"lineNumber":39,"name":"closure #1 in ExampleSection<>.init(header:label:examples:)"},{"coveredLines":1,"executableLines":1,"executionCount":2,"lineCoverage":1,"lineNumber":39,"name":"closure #2 in ExampleSection<>.init(header:label:examples:)"},{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":47,"name":"ExampleSection<>.init(header:label:examples:)"}],"lineCoverage":0.8125,"name":"ExampleSection.swift","path":"\/Volumes\/Bucket\/Repos\/swift-cli-doc\/Sources\/CliDoc\/Nodes\/ExampleSection.swift"},{"coveredLines":0,"executableLines":4,"functions":[{"coveredLines":0,"executableLines":1,"executionCount":0,"lineCoverage":0,"lineNumber":5,"name":"Empty.init()"},{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":8,"name":"Empty.body.getter"}],"lineCoverage":0,"name":"Empty.swift","path":"\/Volumes\/Bucket\/Repos\/swift-cli-doc\/Sources\/CliDoc\/Nodes\/Empty.swift"},{"coveredLines":0,"executableLines":21,"functions":[{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":4,"name":"Section.style(_:)"},{"coveredLines":0,"executableLines":5,"executionCount":0,"lineCoverage":0,"lineNumber":15,"name":"SectionConfiguration.init(header:content:footer:)"},{"coveredLines":0,"executableLines":1,"executionCount":0,"lineCoverage":0,"lineNumber":25,"name":"static SectionStyle<>.default.getter"},{"coveredLines":0,"executableLines":7,"executionCount":0,"lineCoverage":0,"lineNumber":30,"name":"DefaultSectionStyle.render(content:)"},{"coveredLines":0,"executableLines":5,"executionCount":0,"lineCoverage":0,"lineNumber":31,"name":"closure #1 in DefaultSectionStyle.render(content:)"}],"lineCoverage":0,"name":"SectionStyle.swift","path":"\/Volumes\/Bucket\/Repos\/swift-cli-doc\/Sources\/CliDoc\/Modifiers\/SectionStyle.swift"},{"coveredLines":6,"executableLines":6,"functions":[{"coveredLines":3,"executableLines":3,"executionCount":1,"lineCoverage":1,"lineNumber":8,"name":"Group.init(content:)"},{"coveredLines":3,"executableLines":3,"executionCount":1,"lineCoverage":1,"lineNumber":13,"name":"Group.body.getter"}],"lineCoverage":1,"name":"Group.swift","path":"\/Volumes\/Bucket\/Repos\/swift-cli-doc\/Sources\/CliDoc\/Nodes\/Group.swift"},{"coveredLines":80,"executableLines":83,"functions":[{"coveredLines":7,"executableLines":7,"executionCount":1,"lineCoverage":1,"lineNumber":5,"name":"ExampleSection.style(_:)"},{"coveredLines":7,"executableLines":7,"executionCount":1,"lineCoverage":1,"lineNumber":13,"name":"ExampleSection.exampleStyle(_:)"},{"coveredLines":0,"executableLines":3,"executionCount":0,"lineCoverage":0,"lineNumber":23,"name":"Array.exampleStyle(_:)"},{"coveredLines":5,"executableLines":5,"executionCount":2,"lineCoverage":1,"lineNumber":39,"name":"ExampleSectionConfiguration.init(header:label:examples:)"},{"coveredLines":3,"executableLines":3,"executionCount":2,"lineCoverage":1,"lineNumber":51,"name":"ExampleConfiguration.init(examples:)"},{"coveredLines":3,"executableLines":3,"executionCount":1,"lineCoverage":1,"lineNumber":60,"name":"static ExampleSectionStyle<>.default(exampleStyle:)"},{"coveredLines":3,"executableLines":3,"executionCount":1,"lineCoverage":1,"lineNumber":66,"name":"static ExampleStyle<>.default.getter"},{"coveredLines":3,"executableLines":3,"executionCount":2,"lineCoverage":1,"lineNumber":77,"name":"DefaultExamplesStyle.init(exampleStyle:)"},{"coveredLines":9,"executableLines":9,"executionCount":2,"lineCoverage":1,"lineNumber":82,"name":"DefaultExamplesStyle.render(content:)"},{"coveredLines":7,"executableLines":7,"executionCount":2,"lineCoverage":1,"lineNumber":83,"name":"closure #1 in DefaultExamplesStyle.render(content:)"},{"coveredLines":4,"executableLines":4,"executionCount":2,"lineCoverage":1,"lineNumber":84,"name":"closure #1 in closure #1 in DefaultExamplesStyle.render(content:)"},{"coveredLines":10,"executableLines":10,"executionCount":1,"lineCoverage":1,"lineNumber":95,"name":"DefaultExampleStyle.render(content:)"},{"coveredLines":8,"executableLines":8,"executionCount":1,"lineCoverage":1,"lineNumber":96,"name":"closure #1 in DefaultExampleStyle.render(content:)"},{"coveredLines":6,"executableLines":6,"executionCount":2,"lineCoverage":1,"lineNumber":97,"name":"closure #1 in closure #1 in DefaultExampleStyle.render(content:)"},{"coveredLines":4,"executableLines":4,"executionCount":2,"lineCoverage":1,"lineNumber":98,"name":"closure #1 in closure #1 in closure #1 in DefaultExampleStyle.render(content:)"},{"coveredLines":1,"executableLines":1,"executionCount":2,"lineCoverage":1,"lineNumber":100,"name":"closure #1 in closure #1 in closure #1 in closure #1 in DefaultExampleStyle.render(content:)"}],"lineCoverage":0.96385542168674698,"name":"ExamplesStyle.swift","path":"\/Volumes\/Bucket\/Repos\/swift-cli-doc\/Sources\/CliDoc\/Modifiers\/ExamplesStyle.swift"},{"coveredLines":17,"executableLines":20,"functions":[{"coveredLines":7,"executableLines":9,"executionCount":17,"lineCoverage":0.77777777777777779,"lineNumber":2,"name":"array(from:)"},{"coveredLines":9,"executableLines":9,"executionCount":17,"lineCoverage":1,"lineNumber":13,"name":"seperator(_:count:)"},{"coveredLines":1,"executableLines":1,"executionCount":17,"lineCoverage":1,"lineNumber":14,"name":"implicit closure #1 in seperator(_:count:)"},{"coveredLines":0,"executableLines":1,"executionCount":0,"lineCoverage":0,"lineNumber":14,"name":"implicit closure #2 in seperator(_:count:)"}],"lineCoverage":0.84999999999999998,"name":"Utils.swift","path":"\/Volumes\/Bucket\/Repos\/swift-cli-doc\/Sources\/CliDoc\/Utils.swift"}],"lineCoverage":0.7068965517241379,"name":"CliDocTests"}]}
diff --git a/.nvim/xcodebuild/devices.json b/.nvim/xcodebuild/devices.json
deleted file mode 100644
index b1afe3e..0000000
--- a/.nvim/xcodebuild/devices.json
+++ /dev/null
@@ -1 +0,0 @@
-{"projectFile": "/Volumes/Bucket/Repos/swift-cli-doc/Package.swift", "scheme": "swift-cli-doc", "devices": [{"platform": "macOS", "name": "My Mac", "arch": "arm64e", "id": "00008103-000E79D011EA001E"}]}
diff --git a/.nvim/xcodebuild/report.json b/.nvim/xcodebuild/report.json
deleted file mode 100644
index b8abde3..0000000
--- a/.nvim/xcodebuild/report.json
+++ /dev/null
@@ -1 +0,0 @@
-{"testsCount": 6, "xcresultFilepath": "/Users/michael/Library/Developer/Xcode/DerivedData/swift-cli-doc-dgihrbuebwxquzdknevkczbenunz/Logs/Test/Test-swift-cli-doc-2024.12.04_17-02-40--0500.xcresult", "failedTestsCount": 0, "tests": {"CliDocTests:_Global": [{"target": "CliDocTests", "name": "testGroup", "testResult": "passed", "swiftTestingId": "CliDocTests/testGroup", "class": "_Global", "time": "0.00031 seconds", "success": true}, {"target": "CliDocTests", "name": "testHStack", "testResult": "passed", "swiftTestingId": "CliDocTests/testHStack", "class": "_Global", "time": "0.000081 seconds", "success": true}, {"target": "CliDocTests", "name": "testVStack", "testResult": "passed", "swiftTestingId": "CliDocTests/testVStack", "class": "_Global", "time": "0.000049 seconds", "success": true}, {"target": "CliDocTests", "name": "testNote", "testResult": "passed", "swiftTestingId": "CliDocTests/testNote", "class": "_Global", "time": "0.00027 seconds", "success": true}, {"target": "CliDocTests", "name": "testExamples", "testResult": "passed", "swiftTestingId": "CliDocTests/testExamples", "class": "_Global", "time": "0.00027 seconds", "success": true}, {"target": "CliDocTests", "name": "testExamplesWithCustomExampleOnlyStyle", "testResult": "passed", "swiftTestingId": "CliDocTests/testExamplesWithCustomExampleOnlyStyle", "class": "_Global", "time": "0.00016 seconds", "success": true}]}, "buildWarnings": [], "usesSwiftTesting": true, "testErrors": [], "buildErrors": []}
diff --git a/.nvim/xcodebuild/settings.json b/.nvim/xcodebuild/settings.json
deleted file mode 100644
index 724065b..0000000
--- a/.nvim/xcodebuild/settings.json
+++ /dev/null
@@ -1 +0,0 @@
-{"platform": "macOS", "workingDirectory": "/Volumes/Bucket/Repos/swift-cli-doc", "swiftPackage": "/Volumes/Bucket/Repos/swift-cli-doc/Package.swift", "deviceName": "My Mac", "destination": "00008103-000E79D011EA001E", "lastBuildTime": 7, "scheme": "swift-cli-doc"}
diff --git a/.nvim/xcodebuild/test-explorer.json b/.nvim/xcodebuild/test-explorer.json
deleted file mode 100644
index bc70a22..0000000
--- a/.nvim/xcodebuild/test-explorer.json
+++ /dev/null
@@ -1 +0,0 @@
-[{"status": "passed", "hidden": false, "name": "CliDocTests", "classes": [{"status": "passed", "hidden": false, "id": "CliDocTests/_Global", "name": "_Global", "tests": [{"status": "passed", "hidden": false, "name": "testExamples", "id": "CliDocTests/_Global/testExamples", "swiftTestingId": "CliDocTests/testExamples", "kind": "test"}, {"status": "passed", "hidden": false, "name": "testExamplesWithCustomExampleOnlyStyle", "id": "CliDocTests/_Global/testExamplesWithCustomExampleOnlyStyle", "swiftTestingId": "CliDocTests/testExamplesWithCustomExampleOnlyStyle", "kind": "test"}, {"status": "passed", "hidden": false, "name": "testGroup", "id": "CliDocTests/_Global/testGroup", "swiftTestingId": "CliDocTests/testGroup", "kind": "test"}, {"status": "passed", "hidden": false, "name": "testHStack", "id": "CliDocTests/_Global/testHStack", "swiftTestingId": "CliDocTests/testHStack", "kind": "test"}, {"status": "passed", "hidden": false, "name": "testNote", "id": "CliDocTests/_Global/testNote", "swiftTestingId": "CliDocTests/testNote", "kind": "test"}, {"status": "passed", "hidden": false, "name": "testVStack", "id": "CliDocTests/_Global/testVStack", "swiftTestingId": "CliDocTests/testVStack", "kind": "test"}], "swiftTestingId": "CliDocTests", "kind": "class"}], "id": "CliDocTests", "kind": "target"}]
diff --git a/Sources/CliDoc/Nodes/Empty.swift b/Sources/CliDoc/BaseNodes/Empty.swift
similarity index 100%
rename from Sources/CliDoc/Nodes/Empty.swift
rename to Sources/CliDoc/BaseNodes/Empty.swift
diff --git a/Sources/CliDoc/Nodes/Group.swift b/Sources/CliDoc/BaseNodes/Group.swift
similarity index 100%
rename from Sources/CliDoc/Nodes/Group.swift
rename to Sources/CliDoc/BaseNodes/Group.swift
diff --git a/Sources/CliDoc/Nodes/HStack.swift b/Sources/CliDoc/BaseNodes/HStack.swift
similarity index 84%
rename from Sources/CliDoc/Nodes/HStack.swift
rename to Sources/CliDoc/BaseNodes/HStack.swift
index 11002d8..018cd31 100644
--- a/Sources/CliDoc/Nodes/HStack.swift
+++ b/Sources/CliDoc/BaseNodes/HStack.swift
@@ -17,6 +17,7 @@ public struct HStack: TextNode {
@inlinable
public var body: some TextNode {
- content.map { $0.render() }.joined(separator: separator.render())
+ content.removingEmptys()
+ .joined(separator: separator.render())
}
}
diff --git a/Sources/CliDoc/Nodes/Section.swift b/Sources/CliDoc/BaseNodes/Section.swift
similarity index 100%
rename from Sources/CliDoc/Nodes/Section.swift
rename to Sources/CliDoc/BaseNodes/Section.swift
diff --git a/Sources/CliDoc/Nodes/VStack.swift b/Sources/CliDoc/BaseNodes/VStack.swift
similarity index 84%
rename from Sources/CliDoc/Nodes/VStack.swift
rename to Sources/CliDoc/BaseNodes/VStack.swift
index f715e3b..c611ff4 100644
--- a/Sources/CliDoc/Nodes/VStack.swift
+++ b/Sources/CliDoc/BaseNodes/VStack.swift
@@ -17,6 +17,7 @@ public struct VStack: TextNode {
@inlinable
public var body: some TextNode {
- content.map { $0.render() }.joined(separator: separator.render())
+ content.removingEmptys()
+ .joined(separator: separator.render())
}
}
diff --git a/Sources/CliDoc/Modifiers/ExamplesStyle.swift b/Sources/CliDoc/Modifiers/ExamplesStyle.swift
deleted file mode 100644
index 74b9bfb..0000000
--- a/Sources/CliDoc/Modifiers/ExamplesStyle.swift
+++ /dev/null
@@ -1,105 +0,0 @@
-import Rainbow
-
-public extension ExampleSection {
-
- func style(_ style: S) -> some TextNode {
- style.render(content: .init(
- header: header,
- label: label,
- examples: examples
- ))
- }
-
- func exampleStyle(_ style: S) -> some TextNode {
- DefaultExamplesStyle(exampleStyle: style).render(content: .init(
- header: header,
- label: label,
- examples: examples
- ))
- }
-}
-
-extension Array where Element == ExampleSection.Example {
- func exampleStyle(_ style: S) -> some TextNode {
- style.render(content: .init(examples: self))
- }
-}
-
-public struct ExampleSectionConfiguration {
- @usableFromInline
- let header: any TextNode
-
- @usableFromInline
- let label: any TextNode
-
- @usableFromInline
- let examples: [ExampleSection.Example]
-
- @usableFromInline
- init(header: any TextNode, label: any TextNode, examples: [ExampleSection.Example]) {
- self.header = header
- self.label = label
- self.examples = examples
- }
-}
-
-public struct ExampleConfiguration {
- @usableFromInline
- let examples: [ExampleSection.Example]
-
- @usableFromInline
- init(examples: [ExampleSection.Example]) {
- self.examples = examples
- }
-}
-
-public protocol ExampleSectionStyle: NodeModifier where Content == ExampleSectionConfiguration {}
-public protocol ExampleStyle: NodeModifier where Content == ExampleConfiguration {}
-
-public extension ExampleSectionStyle where Self == DefaultExamplesStyle {
- static func `default`(exampleStyle: any ExampleStyle = .default) -> Self {
- DefaultExamplesStyle(exampleStyle: exampleStyle)
- }
-}
-
-public extension ExampleStyle where Self == DefaultExampleStyle {
- static var `default`: Self {
- DefaultExampleStyle()
- }
-}
-
-public struct DefaultExamplesStyle: ExampleSectionStyle {
-
- @usableFromInline
- let exampleStyle: any ExampleStyle
-
- @inlinable
- public init(exampleStyle: any ExampleStyle = .default) {
- self.exampleStyle = exampleStyle
- }
-
- @inlinable
- public func render(content: ExampleSectionConfiguration) -> some TextNode {
- VStack(spacing: 2) {
- HStack {
- content.header
- content.label
- }
- exampleStyle.render(content: .init(examples: content.examples))
- }
- }
-}
-
-public struct DefaultExampleStyle: ExampleStyle {
-
- public func render(content: ExampleConfiguration) -> some TextNode {
- VStack(spacing: 2) {
- content.examples.map { example in
- VStack {
- Label(example.label.green.bold)
- ShellCommand { example.example }.style(.default)
- }
- }
- }
- }
-}
diff --git a/Sources/CliDoc/Modifiers/SectionStyle.swift b/Sources/CliDoc/Modifiers/SectionStyle.swift
index a38d39b..a314a16 100644
--- a/Sources/CliDoc/Modifiers/SectionStyle.swift
+++ b/Sources/CliDoc/Modifiers/SectionStyle.swift
@@ -31,7 +31,7 @@ public struct DefaultSectionStyle: SectionStyle {
VStack {
content.header
content.content
- content.footer.textStyle(.italic)
+ content.footer
}
}
}
diff --git a/Sources/CliDoc/Nodes/ExampleSection.swift b/Sources/CliDoc/Nodes/ExampleSection.swift
index b2d4678..2f50f02 100644
--- a/Sources/CliDoc/Nodes/ExampleSection.swift
+++ b/Sources/CliDoc/Nodes/ExampleSection.swift
@@ -4,23 +4,32 @@ public struct ExampleSection: TextNode {
public typealias Example = (label: String, example: String)
@usableFromInline
- let examples: [Example]
-
- @usableFromInline
- let header: Header
-
- @usableFromInline
- let label: Label
+ let configuration: ExampleSectionConfiguration
@inlinable
public init(
examples: [Example],
- @TextBuilder header: () -> Header,
+ @TextBuilder title: () -> Header,
@TextBuilder label: () -> Label
) {
- self.examples = examples
- self.header = header()
- self.label = label()
+ self.configuration = .init(
+ title: title(),
+ label: label(),
+ examples: examples
+ )
+ }
+
+ @inlinable
+ public init(
+ _ title: @autoclosure () -> Header,
+ label: @autoclosure () -> Label,
+ examples: [Example]
+ ) {
+ self.init(
+ examples: examples,
+ title: title,
+ label: label
+ )
}
@inlinable
@@ -29,23 +38,105 @@ public struct ExampleSection: TextNode {
}
}
-public extension ExampleSection where Header == String, Label == String {
- @inlinable
- init(
- header: String = "Examples:".yellow.bold,
- label: String = "Some common usage examples.",
- examples: [Example]
- ) {
- self.init(examples: examples) { header } label: { label }
- }
+/// The type-erased configuration of an ``ExampleSection``
+public struct ExampleSectionConfiguration {
+ @usableFromInline
+ let title: any TextNode
- @inlinable
- init(
- header: String = "Examples:".yellow.bold,
- label: String = "Some common usage examples.",
- examples: Example...
- ) {
- self.init(header: header, label: label, examples: examples)
- }
+ @usableFromInline
+ let label: any TextNode
+ @usableFromInline
+ let examples: [ExampleSection.Example]
+
+ @usableFromInline
+ init(title: any TextNode, label: any TextNode, examples: [ExampleSection.Example]) {
+ self.title = title
+ self.label = label
+ self.examples = examples
+ }
+}
+
+// MARK: - Style
+
+public extension ExampleSection {
+
+ func style(_ style: S) -> some TextNode {
+ style.render(content: configuration)
+ }
+
+ func exampleStyle(_ style: S) -> some TextNode {
+ DefaultExamplesStyle(exampleStyle: style).render(content: configuration)
+ }
+}
+
+extension Array where Element == ExampleSection.Example {
+ func exampleStyle(_ style: S) -> some TextNode {
+ style.render(content: .init(examples: self))
+ }
+}
+
+public struct ExampleConfiguration {
+ @usableFromInline
+ let examples: [ExampleSection.Example]
+
+ @usableFromInline
+ init(examples: [ExampleSection.Example]) {
+ self.examples = examples
+ }
+}
+
+public protocol ExampleSectionStyle: NodeModifier where Content == ExampleSectionConfiguration {}
+public protocol ExampleStyle: NodeModifier where Content == ExampleConfiguration {}
+
+public extension ExampleSectionStyle where Self == DefaultExamplesStyle {
+ static func `default`(exampleStyle: any ExampleStyle = .default) -> Self {
+ DefaultExamplesStyle(exampleStyle: exampleStyle)
+ }
+}
+
+public extension ExampleStyle where Self == DefaultExampleStyle {
+ static var `default`: Self {
+ DefaultExampleStyle()
+ }
+}
+
+public struct DefaultExamplesStyle: ExampleSectionStyle {
+
+ @usableFromInline
+ let exampleStyle: any ExampleStyle
+
+ @inlinable
+ public init(exampleStyle: any ExampleStyle = .default) {
+ self.exampleStyle = exampleStyle
+ }
+
+ @inlinable
+ public func render(content: ExampleSectionConfiguration) -> some TextNode {
+ VStack(spacing: 2) {
+ HStack {
+ content.title
+ .color(.yellow)
+ .textStyle(.bold)
+
+ content.label
+ .textStyle(.italic)
+ }
+ exampleStyle.render(content: .init(examples: content.examples))
+ }
+ }
+}
+
+public struct DefaultExampleStyle: ExampleStyle {
+
+ public func render(content: ExampleConfiguration) -> some TextNode {
+ VStack(spacing: 2) {
+ content.examples.map { example in
+ VStack {
+ Label(example.label.green.bold)
+ ShellCommand { example.example }.style(.default)
+ }
+ }
+ }
+ }
}
diff --git a/Sources/CliDoc/Utils.swift b/Sources/CliDoc/Utils.swift
index 2acd04b..d6fbe5d 100644
--- a/Sources/CliDoc/Utils.swift
+++ b/Sources/CliDoc/Utils.swift
@@ -19,3 +19,18 @@ func seperator(_ separator: String, count: Int) -> any TextNode {
}
return output
}
+
+extension Array where Element == (any TextNode) {
+
+ @usableFromInline
+ func removingEmptys() -> [String] {
+ compactMap { node in
+ let string = node.render()
+ if string == "" {
+ return nil
+ }
+ return string
+ }
+ }
+
+}
diff --git a/Tests/CliDocTests/CliDocTests.swift b/Tests/CliDocTests/CliDocTests.swift
index 95a66a1..71e2fe1 100644
--- a/Tests/CliDocTests/CliDocTests.swift
+++ b/Tests/CliDocTests/CliDocTests.swift
@@ -56,11 +56,13 @@ func testNote() {
func testExamples() {
#expect(setupRainbow)
let examples = ExampleSection(
+ "Examples:",
+ label: "Some common usage examples.",
examples: [("First", "ls -lah"), ("Second", "find . -name foo")]
)
let expected = """
- \("Examples:".yellow.bold) Some common usage examples.
+ \("Examples:".yellow.bold)\(" ")\("Some common usage examples.".italic)
\("First".green.bold)
$ \("ls -lah".italic)
@@ -68,19 +70,22 @@ func testExamples() {
\("Second".green.bold)
$ \("find . -name foo".italic)
"""
- #expect(examples.render() == expected)
+ let result = printIfNotEqual(examples.render(), expected)
+ #expect(result)
}
@Test
func testExamplesWithCustomExampleOnlyStyle() {
#expect(setupRainbow)
let examples = ExampleSection(
+ "Examples:",
+ label: "Some common usage examples.",
examples: [("First", "ls -lah"), ("Second", "find . -name foo")]
)
.exampleStyle(CustomExampleOnlyStyle())
let expected = """
- \("Examples:".yellow.bold) Some common usage examples.
+ \("Examples:".applyingStyle(.bold).applyingColor(.yellow)) \("Some common usage examples.".italic)
\("First".red)
$ \("ls -lah".italic)
@@ -88,7 +93,73 @@ func testExamplesWithCustomExampleOnlyStyle() {
\("Second".red)
$ \("find . -name foo".italic)
"""
- #expect(examples.render() == expected)
+ let result = printIfNotEqual(examples.render(), expected)
+ #expect(result)
+}
+
+@Test(
+ arguments: SectionArg.arguments
+)
+func testSection(arg: SectionArg) {
+ #expect(setupRainbow)
+ printIfNotEqual(arg.section.render(), arg.expected)
+ #expect(arg.section.render() == arg.expected)
+}
+
+struct SectionArg: @unchecked Sendable {
+ let section: any TextNode
+ let expected: String
+
+ static var arguments: [Self] {
+ [
+ .init(
+ section: Section {
+ "Header"
+ } content: {
+ "Content"
+ } footer: {
+ "Footer"
+ },
+ expected: """
+ Header
+ Content
+ Footer
+ """
+ ),
+ .init(
+ section: Section {
+ "Content"
+ } footer: {
+ "Footer"
+ },
+ expected: """
+ Content
+ Footer
+ """
+ ),
+ .init(
+ section: Section {
+ "Header"
+ } content: {
+ "Content"
+ },
+ expected: """
+ Header
+ Content
+ """
+ )
+ ]
+ }
+}
+
+@discardableResult
+func printIfNotEqual(_ lhs: String, _ rhs: String) -> Bool {
+ guard lhs == rhs else {
+ print(lhs)
+ print(rhs)
+ return false
+ }
+ return true
}
struct CustomExampleOnlyStyle: ExampleStyle {
@@ -96,7 +167,7 @@ struct CustomExampleOnlyStyle: ExampleStyle {
VStack(spacing: 2) {
content.examples.map { example in
VStack {
- Label(example.label.red)
+ example.label.red
ShellCommand { example.example }
}
}