How?
ṫø⁹‘‘µFL‘⁶ẋ - link 1: get the spaces for after the code, dyadic(split string, index)
ø - next chain as a nilad
⁹‘‘ - right argument incremented twice (the index we actually want)
ṫ - tail (get the rest of the split string)
µ - next chain as a monad
FL‘ - flatten, get its length and increment
⁶ - a space character " "
ẋ - repeat the space character that many times
‘ị - Link 2: get the code for a line dyadic(index, split string)
‘ - increment the index
ị - retrieve the string at that index
ḣFL⁶ẋ$;ç@;1ŀ - Link 3: get the code and join with spaces, dyadic (index, split string)
ḣ - head: split string[index:]
FL - flatten and get its length
$ - previous two atoms as a monad
⁶ - a space character, " "
ẋ - repeat the space that many times
; - concatenate with
ç@ - the result of the previous link (the code) - reverse inputs
; - concatenate with
1ŀ - the result of Link 1 (the spaces after the code)
J’ç@€ - Link 3: a for loop, monadic(split string)
J’ - [0,...,Len(split string)-1]
ç@€ - the result of the previous link, with revered inputs, for each
ṣ”|Ç;€Y - Main Link: dyadic(code string, comment character)
ṣ”| - split on "|"
Ç - the result of the previous link
;€ - concatenate each with the comment character
Y - join with line feeds
- implicit print