Word Count Sample
Blind Watch Maker 1
Download
Find Words
forth
Fractal Benchmark
Genetic Algorithm
Gtk Source Editor
Hex Dump
Notepad
Point
Shapes
Simple English Parser
Sizes
TPK
Word Count
"""
wordcount.cobra

> cd \path\to\directory\of\wordcount.cobra
> cobra -c wordcount.cobra
> wordcount \path\to\some\textfile
..\Docs\ReleaseNotes\Cobra-0.0.2.text:
chars       = 1258
words       = 180
sentences   = 18
lines       = 61
blank lines = 20
"""

class WordCounter
    """
    This class stores the counts accumulated, in other words, the number of:
        characters
        words
        sentences
        lines
        blank lines

    Several `countFoo` methods provide the ability to count:
        * a file with a given name
        * the contents of a TextReader
        * any string
        * a line at a time

    The count methods can be invoked as many times as you like.

    A word counter can be reused by invoking `reset`.
    """

    test
        assert WordCounter().countText('').numWords==0

        c = WordCounter().countText('aoeu')
        assert c.numWords == 1
        assert c.numSentences == 0
        assert c.numLines == 1

        c = WordCounter().countText('aoeu qwerty')
        assert c.numWords == 2
        assert c.numSentences == 0
        assert c.numLines == 1

        c = WordCounter().countText('aoeu\nqwerty')
        assert c.numWords == 2
        assert c.numSentences == 0
        assert c.numLines == 2

        c.reset
        assert c.numWords == 0
        assert c.numLines == 0

        sw = StringWriter()
        print to sw
            c.dump
        s = sw.toString
        assert s.contains('words')
        assert s.contains('lines')

    var _numChars = 0
    var _numWords = 0
    var _numSentences = 0

    var _numLines = 0  # all lines, even blank
    var _numBlankLines = 0

    get numChars from var

    get numWords from var

    get numSentences from var

    get numLines from var

    get numBlankLines from var

    def dump
        print 'chars       = [.numChars]'
        print 'words       = [.numWords]'
        print 'sentences   = [.numSentences]'
        print 'lines       = [.numLines]'
        print 'blank lines = [.numBlankLines]'

    def countText(text as String) as WordCounter
        """
        Counts the chars, words, etc. of any arbitrary string.
        """
        text = text.replace('\r\n', '\n')  # windows
        text = text.replace('\r', '\n')    # mac
        for line in text.split(c'\n')
            .countLine(line)
        return this

    def countLine(line as String) as WordCounter
        """
        Counts a single line of text.
        """
        _numChars += line.length
        line = line.trim
        _numLines += 1
        if not line.length
            _numBlankLines += 1
        else
            while '..' in line
                line = line.replace('..', '.')  # so '...' does not make for 3 sentences
            while '!!' in line
                line = line.replace('!!', '!')
            while '??' in line
                line = line.replace('??', '?')
            _numSentences += _countChars(line, c'.') + _countChars(line, c'!') + _countChars(line, c'?')
            _numWords += line.split(nil).length
        return this

    def countTextReader(tr as TextReader) as WordCounter
        while true
            line = tr.readLine
            if line, .countLine(line)
            else, break
        return this

    def countFileNamed(fileName as String) as WordCounter
        using tr = File.openText(fileName)
            .countTextReader(tr)
        return this

    def reset
        _numChars = 0
        _numWords = 0
        _numSentences = 0
        _numLines = 0
        _numBlankLines = 0

    def _countChars(s as String, c as char) as int
        test
            wc = WordCounter()
            assert wc._countChars('', c'x')==0
            assert wc._countChars('x', c'x')==1
            assert wc._countChars('X', c'x')==0  # case sensitive
            assert wc._countChars(' ! ! ', c'!')==2
        body
            count = 0
            for ch in s, if c==ch, count += 1
            return count

    def main
        args = CobraCore.commandLineArgs
        if args.count < 2
            print ns'usage: wordcount FILES'
            return

        wc = WordCounter()
        for fileName in args[1:]
            print '[fileName]:'
            wc.countFileNamed(fileName)
            wc.dump
            wc.reset