diff --git a/idl/idl_api.ysl2 b/idl/idl_api.ysl2 index 3759107..f7571a4 100644 --- a/idl/idl_api.ysl2 +++ b/idl/idl_api.ysl2 @@ -17,6 +17,80 @@ def "func:exists" { } } +def "func:repeat_until" { + param "str"; + param "count"; + + choose { + when "string-length($str) < $count" { + result "func:repeat_until(concat($str, $str), $count)"; + } otherwise { + result "substring($str, 0, $count+1)"; + } + } +} + +def "func:indent" { + param "content"; + param "indent_count"; + param "indent_char", "'\t'"; + result > «func:repeat_until($indent_char, $indent_count)»«$content» +} + +def "func:paragraph_block" { + param "content"; + param "nth", "80"; + param "wrap_char", "'\n'"; + const "cont_oneline", "translate($content, '\n', ' ')"; + result > «func:line_wrap($cont_oneline, $nth, $wrap_char)» +} + +def "func:line_wrap" { + param "content"; + param "nth", "80"; + param "wrap_char", "'\n'"; + const "sep_char", "''"; + const "nth_minus_dash", "$nth - string-length($sep_char)"; + const "ret", "substring($content, 0, $nth_minus_dash)"; + const "remainder", "substring($content, $nth_minus_dash)"; + + choose { + when "string-length($remainder) > $nth_minus_dash" { + result > «$ret»«$sep_char»«$wrap_char»«func:line_wrap($remainder, $nth)» + } otherwise { + result > «$ret»«$sep_char»«$wrap_char»«$remainder» + } + } +} + +def "func:column_paragraph" { + param "title"; + param "content"; + param "max_width"; + result call "column_paragraph" + with "title", "$title", + with "content", "$content", + with "max_width", "$max_width"; +} +function "column_paragraph" { + param "title"; + param "content"; + param "max_width"; + const "title_width", "string-length($title)"; + const "cont_width", "$max_width - $title_width"; + + const "cont_wrapped", "func:paragraph_block($content, $cont_width)"; + for "str:split($cont_wrapped, '\n')" { + const "line", "."; + choose { + when "position() = 1" + | «$title»«func:indent($line,1,' ')» + otherwise + | «func:indent($line, $title_width+1,' ')» + } + } +} + // ---------------------------------------------------------------------- // idl-api (ysl2) // ---------------------------------------------------------------------- @@ -105,7 +179,6 @@ def "func:idl_type_is_generic" { result "contains($idltype,'<') and contains($idltype,'>')" } - // TODO: generic is actually not a typekid, this should return the generic typekind like list/map/pair def "func:idl_type_get_typekind_of_type" { param "idltype";