diff --git a/examples/doc/example.html b/examples/doc/example.html
index 96e463bb..ca559375 100644
--- a/examples/doc/example.html
+++ b/examples/doc/example.html
@@ -721,7 +721,9 @@ Model
model_name |
string |
required |
- The car model name, e.g. "Z3". |
+ model_name represents the car model name.
+
+This field typically contains the manufacturer name, e.g. "Porsche 911". |
diff --git a/examples/doc/example.json b/examples/doc/example.json
index 08486ccd..29611017 100644
--- a/examples/doc/example.json
+++ b/examples/doc/example.json
@@ -564,7 +564,7 @@
},
{
"name": "model_name",
- "description": "The car model name, e.g. \"Z3\".",
+ "description": "model_name represents the car model name.\n\nThis field typically contains the manufacturer name, e.g. \"Porsche 911\".",
"label": "required",
"type": "string",
"longType": "string",
diff --git a/examples/doc/example.md b/examples/doc/example.md
index 15b5bf35..cc73bca8 100644
--- a/examples/doc/example.md
+++ b/examples/doc/example.md
@@ -70,7 +70,7 @@ Represents the status of a vehicle booking.
| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
| id | [int32](#int32) | | Unique booking status ID. |
-| description | [string](#string) | | Booking status description. E.g. "Active". |
+| description | [string](#string) | | Booking status description. E.g. "Active". |
@@ -195,7 +195,7 @@ Represents a manufacturer of cars.
| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
| id | [int32](#int32) | required | The unique manufacturer ID. |
-| code | [string](#string) | required | A manufacturer code, e.g. "DKL4P". |
+| code | [string](#string) | required | A manufacturer code, e.g. "DKL4P". |
| details | [string](#string) | optional | Manufacturer details (minimum orders et.c.). |
| category | [Manufacturer.Category](#com-example-Manufacturer-Category) | optional | Manufacturer category. Default: CATEGORY_EXTERNAL |
@@ -213,8 +213,8 @@ Represents a vehicle model.
| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
| id | [string](#string) | required | The unique model ID. |
-| model_code | [string](#string) | required | The car model code, e.g. "PZ003". |
-| model_name | [string](#string) | required | The car model name, e.g. "Z3". |
+| model_code | [string](#string) | required | The car model code, e.g. "PZ003". |
+| model_name | [string](#string) | required | model_name represents the car model name.
This field typically contains the manufacturer name, e.g. "Porsche 911". |
| daily_hire_rate_dollars | [sint32](#sint32) | required | Dollars per day. |
| daily_hire_rate_cents | [sint32](#sint32) | required | Cents per day. |
@@ -257,8 +257,8 @@ Represents a vehicle category. E.g. "Sedan" or "Truck".
| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
-| code | [string](#string) | required | Category code. E.g. "S". |
-| description | [string](#string) | required | Category name. E.g. "Sedan". |
+| code | [string](#string) | required | Category code. E.g. "S". |
+| description | [string](#string) | required | Category name. E.g. "Sedan". |
diff --git a/examples/doc/example.txt b/examples/doc/example.txt
index db07a128..170d3bc8 100644
--- a/examples/doc/example.txt
+++ b/examples/doc/example.txt
@@ -158,7 +158,9 @@ Represents a vehicle model.
|model_code | <> |required |The car model code, e.g. "PZ003".
-|model_name | <> |required |The car model name, e.g. "Z3".
+|model_name | <> |required |model_name represents the car model name.
+
+This field typically contains the manufacturer name, e.g. "Porsche 911".
|daily_hire_rate_dollars | <> |required |Dollars per day.
diff --git a/examples/proto/Vehicle.proto b/examples/proto/Vehicle.proto
index db6daac0..cac869b9 100644
--- a/examples/proto/Vehicle.proto
+++ b/examples/proto/Vehicle.proto
@@ -38,7 +38,11 @@ extend Manufacturer {
message Model {
required string id = 1; /** The unique model ID. */
required string model_code = 2; /** The car model code, e.g. "PZ003". */
- required string model_name = 3; /** The car model name, e.g. "Z3". */
+
+ // model_name represents the car model name.
+ //
+ // This field typically contains the manufacturer name, e.g. "Porsche 911".
+ required string model_name = 3;
required sint32 daily_hire_rate_dollars = 4; /// Dollars per day.
required sint32 daily_hire_rate_cents = 5; /// Cents per day.
diff --git a/filters.go b/filters.go
index 6138b786..729b72d5 100644
--- a/filters.go
+++ b/filters.go
@@ -28,6 +28,18 @@ func ParaFilter(content string) string {
// NoBrFilter removes single CR and LF from content.
func NoBrFilter(content string) string {
+ paragraphs := contentToParagraphs(content)
+ return strings.Join(paragraphs, "\n\n")
+}
+
+// BrFilterMD removes single CR and LF from content and replaces it with unescaped
+// HTML line breaks for markdown.
+func BrFilterMD(content string) template.HTML {
+ paragraphs := contentToParagraphs(content)
+ return template.HTML(strings.Join(paragraphs, "
"))
+}
+
+func contentToParagraphs(content string) []string {
normalized := strings.Replace(content, "\r\n", "\n", -1)
paragraphs := multiNewlinePattern.Split(normalized, -1)
for i, p := range paragraphs {
@@ -35,7 +47,7 @@ func NoBrFilter(content string) string {
withoutLF := strings.Replace(withoutCR, "\n", " ", -1)
paragraphs[i] = spacePattern.ReplaceAllString(withoutLF, " ")
}
- return strings.Join(paragraphs, "\n\n")
+ return paragraphs
}
// AnchorFilter replaces all special characters with URL friendly dashes
diff --git a/filters_test.go b/filters_test.go
index 353583c4..907c6345 100644
--- a/filters_test.go
+++ b/filters_test.go
@@ -50,6 +50,20 @@ func TestNoBrFilter(t *testing.T) {
}
}
+func TestBrMdFilter(t *testing.T) {
+ tests := map[string]string{
+ "My content": "My content",
+ "My content \r\nHere.": "My content Here.",
+ "My\n content\r right\r\n here.": "My content right here.",
+ "My\ncontent\rright\r\nhere.": "My content right here.",
+ "My content.\n\nMore content.": "My content.
More content.",
+ }
+
+ for input, output := range tests {
+ require.Equal(t, html.HTML(output), BrFilterMD(input))
+ }
+}
+
func TestAnchorFilter(t *testing.T) {
tests := map[string]string{
"com/example/test.proto": "com_example_test-proto",
diff --git a/renderer.go b/renderer.go
index eba74c5f..ce9dd02f 100644
--- a/renderer.go
+++ b/renderer.go
@@ -78,6 +78,7 @@ var funcMap = map[string]interface{}{
"p": PFilter,
"para": ParaFilter,
"nobr": NoBrFilter,
+ "brmd": BrFilterMD,
"anchor": AnchorFilter,
}