diff --git a/src/Cowsay.jl b/src/Cowsay.jl index cebc554..68dcdb9 100644 --- a/src/Cowsay.jl +++ b/src/Cowsay.jl @@ -81,12 +81,12 @@ julia> cowthink("Have I mooed today?") || || ``` """ -function cowsay(message::AbstractString; cow=default, eyes="oo", tongue=" ", wrap=40) - cowsay(stdout, message, cow=cow, eyes=eyes, tongue=tongue, wrap=wrap) +function cowsay(message::AbstractString; kwargs...) + cowsay(stdout, message; kwargs...) end -function cowsay(io::IO, message::AbstractString; cow=default, eyes="oo", tongue=" ", wrap=40) - println(io, cowsaid(message, cow=cow, eyes=eyes, tongue=tongue, wrap=wrap)) +function cowsay(io::IO, message::AbstractString; kwargs...) + println(io, cowsaid(message; kwargs...)) end """ @@ -96,12 +96,12 @@ Print an ASCII picture of a cow thinking `message` See [`cowsay`](@ref) """ -function cowthink(message::AbstractString; cow=default, eyes="oo", tongue=" ", wrap=40) - cowthink(stdout, message, cow=cow, eyes=eyes, tongue=tongue, wrap=wrap) +function cowthink(message::AbstractString; kwargs...) + cowthink(stdout, message; kwargs...) end -function cowthink(io::IO, message::AbstractString; cow=default, eyes="oo", tongue=" ", wrap=40) - println(io, cowthunk(message, cow=cow, eyes=eyes, tongue=tongue, wrap=wrap)) +function cowthink(io::IO, message::AbstractString; kwargs...) + println(io, cowthunk(message; kwargs...)) end """ @@ -123,9 +123,8 @@ julia> cowthunk("Have I mooed today?") " _____________________\\n( Have I mooed today? )\\n ---------------------\\n o ^__^\\n o (oo)\\\\_______\\n (__)\\\\ )\\\\/\\\\\\n ||----w |\\n || ||\\n" ``` """ -function cowsaid(message::AbstractString; cow=default, eyes="oo", tongue=" ", wrap=40) - balloon = sayballoon(TextWrap.wrap(message, width=wrap)) - return string(balloon, cow(eyes=eyes, tongue=tongue)) +function cowsaid(message::AbstractString; kwargs...) + return cowmoo(message, :say; kwargs...) end """ @@ -135,9 +134,59 @@ Construct art of a cow thinking `message`. See [`cowsaid`](@ref) and [`cowsay`](@ref) """ -function cowthunk(message::AbstractString; cow=default, eyes="oo", tongue=" ", wrap=40) - balloon = thinkballoon(TextWrap.wrap(message, width=wrap)) - return string(balloon, cow(eyes=eyes, tongue=tongue, thoughts="o")) +function cowthunk(message::AbstractString; kwargs...) + return cowmoo(message, :think; kwargs...) +end + +""" + cowmoo(message::AbstractString, mode, kwargs...) + +Converts `message` into either saying or thinking art based on the value of `mode`. All of +the default values for `kwargs` for pretty much every other function live here. See +[`cowsay`](@ref) for their descriptions. +""" +function cowmoo(message::AbstractString, mode; kwargs...) + cow = dict_or_default(kwargs, :cow, Cowsay.default) + eyes = dict_or_default(kwargs, :eyes, "oo") + tongue = dict_or_default(kwargs, :tongue, " ") + wrap = dict_or_default(kwargs, :wrap, 40) + + # Default to 'say' mode + if mode ==:think + balloon = thinkballoon + thoughts = "o" + else + balloon = sayballoon + thoughts = "\\" + end + + speechbubble = balloon(TextWrap.wrap(message, width=wrap)) + + return string(speechbubble, cow(eyes=eyes, tongue=tongue, thoughts=thoughts)) +end + +""" + dict_or_default(dict, key, value) + +If `key` is present in `dict`, then return `dict[key]`, otherwise return `value` + +# Example +```jldoctest +julia> dict = Dict(:holstein => "lotsa milk", :jersey => "butterfat", :shorthorn => "worthless"); + +julia> Cowsay.dict_or_default(dict, :holstein, "fluid") +"lotsa milk" + +julia> Cowsay.dict_or_default(dict, :brown_swiss, "cheese") +"cheese" +``` +""" +function dict_or_default(dict, key, value) + if haskey(dict, key) + return dict[key] + else + return value + end end """