SortParagraph |
Pipelines v1.9 |
.* Example by TenFiftyTwo(c). |
.* &arg1. The number of the paragraph to sort.
.* &arg2. The sort type (a)scending or (d)escending.
.* The pipeline reads its input and selects the specified paragraph and sorts
.* it, writing the result back to its caller.
.* Note. that if any input record contains the hexadecimal characters x'fc'
.* through x'ff'; you will need to substitute the character for another character
.* not present in the record.
pipe (endchar ?)
in .* Input.
| literal xfdfe .* Ensure paragraph is marked.
| strip .* Trim off whitespace.
| a: locate .* Route out blank records.
.* Concatenate groups of records that make up a paragraph.
| specs xfc 1 1-* n .* Insert start of line flag.
| split after str xfc .* Split into individual records.
| b: faninany .* Feed blank records back into pipeline.
| join until str xfc .* Join records in current paragraph.
| c: nlocate xfd .* Go and mark start of paragraph.
| d: faninany .* Feed paragraph marker back into pipeline.
| split before str xfd .* Separate records back into paragraph format.
.* Select the paragraph that we want to sort.
| e: fromlab pat /Para #&arg1*/ .* Select records between the start of the..
| f: tolabel pat xfd2a .* ..paragraph and the start of the next.
| sort anycase &arg2 .* Sort the paragraph.
| nlocate /Para #/ .* Discard the paragraph marker.
| specs recno 1 1-* nw .* Insert leading record number.
| g: fanin 1 0 2 .* Merge all the streams.
| nlocate /Para #/ .* Discard all paragraph markers.
| nlocate xfdfe .* Discard start of file marker.
| change xfd // .* Discard blank record marker.
| out .* Output.
?
a:
| specs xfd 1 .* Indicate blank records with a marker.
| b:
?
c:
| specs 1-* 1 write .* Mark the start of a paragraph.
/Para#/ n
recno strip n
| d:
?
e:
| elastic .* Handle records that come before start..
| g: .* ..of a paragraph.
?
f:
| elastic .* Handle records that come after the end of..
| g: .* ..a paragraph.