92 lines
3.3 KiB
Crystal
92 lines
3.3 KiB
Crystal
require "./notes/*"
|
|
require "file_utils"
|
|
require "option_parser"
|
|
|
|
# Usage
|
|
#
|
|
# ./notes blah blah blah ~~ blah blah on the second line
|
|
|
|
t = Time.local
|
|
notes_path = ENV["NOTES_PATH"]? || File.expand_path(".local/notes", ENV["HOME"])
|
|
date = t.to_s("%F-%A")
|
|
minute = ((t.minute / 15) * 15).to_s.rjust 2, '0'
|
|
hour = t.hour.to_s.rjust 2, '0'
|
|
time = "#{hour}:#{minute}"
|
|
|
|
increment = true
|
|
title = time
|
|
subtitle = ""
|
|
tag = ""
|
|
action = nil
|
|
file_path = ""
|
|
file_name = "#{date}"
|
|
read = :argv
|
|
days_to_display = 7.days
|
|
|
|
parsed = OptionParser.parse do |p|
|
|
p.banner = "Usage: notes [arguments]"
|
|
p.on("-c=TAG", "--category=TAG", "Choose a title prefix (change the directory)") { |arg_tag| tag = arg_tag }
|
|
p.on("-t=TITLE", "--title=TITLE", "Change de title (default = HOUR:MINUTE)") { |arg_title| title = arg_title }
|
|
p.on("-s=SUBTITLE", "--subtitle=TITLE", "Change de subtitle (default none)") { |arg_subtitle| subtitle = arg_subtitle }
|
|
p.on("-I", "--no-increment", "Do not increment the last note (new title)") { increment = false }
|
|
p.on("-P", "--show-path", "Show this current file's path") { action = :show_path }
|
|
p.on("-p=PATH", "--path=PATH", "Choose the file's path") { |path| file_path = path }
|
|
p.on("-D", "--show-directory", "Show this current file's directory") { action = :show_dir }
|
|
p.on("-d=PATH", "--directory=PATH", "Choose the file's directory") { |path| notes_path = path }
|
|
p.on("-N", "--show-name", "Show this current file's name") { action = :show_name }
|
|
p.on("-n=NAME", "--name=NAME", "Choose the file's name") { |name| file_name = name }
|
|
p.on("-w", "--week", "Show the last week of notes") { action = :show_days }
|
|
p.on("--last-days=N", "Show the last days of notes") { |n| action = :show_days; days_to_display = Int32.new(n).days }
|
|
p.on("--stdin", "Read on stdin") { read = :stdin }
|
|
p.on("-h", "--help", "Show this help") { puts p; exit }
|
|
end
|
|
|
|
note = read == :stdin ? STDIN.gets_to_end : ARGV.map(&.strip).join(" ")
|
|
note = note.split("~~").map(&.strip).join("\n").strip
|
|
action = note.empty? ? :show : :add if action.nil?
|
|
|
|
notes_path = File.expand_path(tag, notes_path) unless tag.empty?
|
|
file_path = File.expand_path("#{file_name}.md", notes_path) if file_path.empty?
|
|
|
|
case action
|
|
when :show_path
|
|
puts "File path: " + file_path
|
|
when :show_dir
|
|
puts "File directory: " + notes_path
|
|
when :show_name
|
|
puts "File name: " + file_name
|
|
when :show
|
|
puts (File.read(file_path) rescue "nothing published yet")
|
|
when :show_days
|
|
paths = Dir.entries(notes_path)
|
|
paths.sort!
|
|
paths.select! do |path|
|
|
date = path.match /^(\d{4}-\d{2}-\d{2})-\w+\.md$/
|
|
Time.parse_local(date[1], "%F") > (Time.local - days_to_display) if date
|
|
end
|
|
paths.reverse! unless STDOUT.tty?
|
|
paths.each_with_index do |path, i|
|
|
title = path.chomp(".md")
|
|
puts "#{title}"
|
|
puts "="*title.size
|
|
puts "" # syntax color on emacs :')
|
|
puts File.read(File.expand_path(path, notes_path))
|
|
puts "\n\n\n\n" unless i == paths.size - 1
|
|
end
|
|
when :add
|
|
Dir.mkdir notes_path rescue nil
|
|
data = if increment && File.exists?(file_path) && !File.read(file_path).match(/^# #{title}$/m).nil?
|
|
""
|
|
else
|
|
"\n# #{title}"
|
|
end
|
|
data = data.strip unless File.exists?(file_path)
|
|
data += "\n## #{subtitle}" unless subtitle.empty?
|
|
data += "\n#{note}\n"
|
|
|
|
puts data
|
|
File.open(file_path, "a") do |f|
|
|
f << data
|
|
end
|
|
end
|