Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
193 changes: 187 additions & 6 deletions ext/stringio/stringio.c
Original file line number Diff line number Diff line change
Expand Up @@ -1428,15 +1428,177 @@ strio_readline(int argc, VALUE *argv, VALUE self)
}

/*
* :markup: markdown
*
* call-seq:
* each_line(sep = $/, chomp: false) {|line| ... } -> self
* each_line(limit, chomp: false) {|line| ... } -> self
* each_line(sep, limit, chomp: false) {|line| ... } -> self
*
* Calls the block with each remaining line read from the stream;
* does nothing if already at end-of-file;
* returns +self+.
* See {Line IO}[rdoc-ref:IO@Line+IO].
* With a block given calls the block with each remaining line (see "Position" below) in the stream;
* returns `self`.
*
* Leaves stream position as end-of-stream.
*
* **No Arguments**
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

How about using ### Subsection (####?) instead of **Subsection**?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Doc guide says not to. I think a reason is that in some renderings, the heading can show up in the left-pane TOC.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oh, I didn't know it...

*
* With no arguments given,
* reads lines using the default record separator global variable `$/`, whose initial value is `"\n"`.
*
* ```
* strio = StringIO.new(TEXT)
* strio.each_line {|line| p line }
* strio.eof? # => true
* ```
*
* Output:
*
* ```
* "First line\n"
* "Second line\n"
* "\n"
* "Fourth line\n"
* "Fifth line\n"
* ```
*
* **Argument `sep`**
*
* With only string argument `sep` given,
* reads lines using that string as the record separator:
*
* ```
* strio = StringIO.new(TEXT)
* strio.each_line(' ') {|line| p line }
* ```
*
* Output:
*
* ```
* "First "
* "line\nSecond "
* "line\n\nFourth "
* "line\nFifth "
* "line\n"
* ```
*
* **Argument `limit`**
*
* With only integer argument `limit` given,
* reads lines using the default record separator global variable `$/`, whose initial value is `"\n"`;
* also limits the size (in characters) of each line to the given limit:
*
* ```
* strio = StringIO.new(TEXT)
* strio.each_line(10) {|line| p line }
* ```
*
* Output:
*
* ```
* "First line"
* "\n"
* "Second lin"
* "e\n"
* "\n"
* "Fourth lin"
* "e\n"
* "Fifth line"
* "\n"
* ```
* **Arguments `sep` and `limit`**
*
* With arguments `sep` and `limit` both given,
* honors both:
*
* ```
* strio = StringIO.new(TEXT)
* strio.each_line(' ', 10) {|line| p line }
* ```
*
* Output:
*
* ```
* "First "
* "line\nSecon"
* "d "
* "line\n\nFour"
* "th "
* "line\nFifth"
* " "
* "line\n"
* ```
*
* **Position**
*
* As stated above, method `each` _remaining_ line in the stream.
*
* In the examples above each `strio` object starts with its position at beginning-of-stream;
* but in other cases the position may be anywhere (see StringIO#pos):
*
* ```
* strio = StringIO.new(TEXT)
* strio.pos = 30 # Set stream position to character 30.
* strio.each_line {|line| p line }
* ```
*
* Output:
*
* ```
* " line\n"
* "Fifth line\n"
* ```
*
* **Special Record Separators**
*
* Like some methds in class `IO`, StringIO.each honors two special record separators;
* see {Special Line Separators}[https://docs.ruby-lang.org/en/master/IO.html#class-IO-label-Special+Line+Separator+Values].
*
* ```
* strio = StringIO.new(TEXT)
* strio.each_line('') {|line| p line } # Read as paragraphs (separated by blank lines).
* ```
*
* Output:
*
* ```
* "First line\nSecond line\n\n"
* "Fourth line\nFifth line\n"
* ```
*
* ```
* strio = StringIO.new(TEXT)
* strio.each_line(nil) {|line| p line } # "Slurp"; read it all.
* ```
*
* Output:
*
* ```
* "First line\nSecond line\n\nFourth line\nFifth line\n"
* ```
*
* **Keyword Argument `chomp`**
*
* With keyword argument `chomp` given as `true` (the default is `false`),
* removes trailing newline (if any) from each line:
*
* ```
* strio = StringIO.new(TEXT)
* strio.each_line(chomp: true) {|line| p line }
* ```
*
* Output:
*
* ```
* "First line"
* "Second line"
* ""
* "Fourth line"
* "Fifth line"
* ```
*
* With no block given, returns a new {Enumerator}[https://docs.ruby-lang.org/en/master/Enumerator.html].
*
* Related: StringIO.each_byte, StringIO.each_char, StringIO.each_codepoint.
*/
static VALUE
strio_each(int argc, VALUE *argv, VALUE self)
Expand Down Expand Up @@ -1935,15 +2097,34 @@ strio_set_encoding_by_bom(VALUE self)
}

/*
* :markup: markdown
*
* \IO streams for strings, with access similar to
* {IO}[rdoc-ref:IO];
* see {IO}[rdoc-ref:IO].
*
* === About the Examples
* ### About the Examples
*
* Examples on this page assume that \StringIO has been required:
*
* require 'stringio'
* ```
* require 'stringio'
* ```
*
* And that these constants have been defined:
*
* ```
* TEXT = <<EOT
* First line
* Second line
*
* Fourth line
* Fifth line
* EOT
*
* RUSSIAN = 'тест'
* DATA = "\u9990\u9991\u9992\u9993\u9994"
* ```
*
*/
void
Expand Down