|
|
|
#!/usr/bin/env bash
|
|
|
|
|
|
|
|
# This file contains functions relating to file operations such as new, edit and deleting files
|
|
|
|
|
|
|
|
newFile(){
|
|
|
|
vecho "newFile $*"
|
|
|
|
cd "$dataDir" || return
|
|
|
|
# While there is a - at the begining
|
|
|
|
local title="$*"
|
|
|
|
if [ -z "$title" ]; then
|
|
|
|
echo -n "Enter a title: "
|
|
|
|
read -r title
|
|
|
|
fi
|
|
|
|
local filename
|
|
|
|
filename="$(escapeFilename "$title.md")"
|
|
|
|
[ -e "$filename" ] && die "$filename already exists"
|
|
|
|
echo -e "---
|
|
|
|
Title: $title
|
|
|
|
Tags:
|
|
|
|
-
|
|
|
|
---
|
|
|
|
" > "$filename"
|
|
|
|
editFile "$filename"
|
|
|
|
}
|
|
|
|
|
|
|
|
addFile(){
|
|
|
|
vecho "addFile $*"
|
|
|
|
local copiedFile
|
|
|
|
local subFolder=""
|
|
|
|
local ext
|
|
|
|
local file
|
|
|
|
local filenameTitle
|
|
|
|
local yaml
|
|
|
|
local yamlBlock
|
|
|
|
local yamlTitle
|
|
|
|
while [[ $1 = -?* ]]; do
|
|
|
|
case "$1" in
|
|
|
|
--asset) mkdir -p "${dataDir}assets"; subFolder+="assets/" ;;
|
|
|
|
--yaml-header) yaml="header" ;;
|
|
|
|
--yaml-file) yaml="file" ;;
|
|
|
|
*) die "invalid add option: '$1'." ;;
|
|
|
|
esac
|
|
|
|
shift
|
|
|
|
done
|
|
|
|
file="$1"
|
|
|
|
[ -z "$file" ] && die "You must specify a file"
|
|
|
|
[ -f "$file" ] || die "File $file not found"
|
|
|
|
|
|
|
|
ext="${file##*.}"
|
|
|
|
copiedFile="${file##*/}"
|
|
|
|
|
|
|
|
# If the type of yaml entry hasn't been specified on the command line
|
|
|
|
if [ -z "$yaml" ]; then
|
|
|
|
# We want a header if it's markdown, otherwise a seperate file
|
|
|
|
if [ "$ext" = "md" ]; then
|
|
|
|
yaml="header"
|
|
|
|
else
|
|
|
|
yaml="file"
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
[ -e "$dataDir$copiedFile" ] && die "File $copiedFile already exists"
|
|
|
|
cp "$file" "$dataDir$subFolder$copiedFile"
|
|
|
|
|
|
|
|
# The title as specified in yaml (or empty string)
|
|
|
|
yamlBlock="$(getYamlBlock "$subFolder$copiedFile")"
|
|
|
|
yamlTitle="$(getYamlTitle "$subFolder$copiedFile")"
|
|
|
|
# The title generated from filename
|
|
|
|
filenameTitle="$(echo "$copiedFile" | tr '_' ' ' | sed -E 's/\..[^.]+$//')"
|
|
|
|
if [ -z "$yamlTitle" ] || [ "$yamlTitle" = "null" ]; then
|
|
|
|
# If empty, generate the title from the filename
|
|
|
|
yamlTitle="$filenameTitle"
|
|
|
|
else
|
|
|
|
# If the yaml title and the filename title are different, then use the yaml title
|
|
|
|
if [ "$yamlTitle" != "$filenameTitle" ]; then
|
|
|
|
local newFilename=$(escapeFilename "$yamlTitle").$ext
|
|
|
|
mv "$dataDir$subFolder$copiedFile" "$dataDir$subFolder$newFilename"
|
|
|
|
warn "File renamed from $copiedFile to "$newFilename
|
|
|
|
copiedFile="$newFilename"
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
yamlBlock="Title: $yamlTitle
|
|
|
|
$yamlBlock"
|
|
|
|
|
|
|
|
|
|
|
|
if [ "$yaml" = "header" ]; then
|
|
|
|
local tmpfile=$(mktemp)
|
|
|
|
echo "---
|
|
|
|
$yamlBlock
|
|
|
|
---" > $tmpfile
|
|
|
|
sed '1 { /^---/ { :a N; /\n---/! ba; d} }' "$dataDir$subFolder$copiedFile" >> "$tmpfile"
|
|
|
|
mv "$tmpfile" "$dataDir$subFolder$copiedFile"
|
|
|
|
else
|
|
|
|
echo "$yamlBlock" > "$dataDir$subFolder$copiedFile.yaml"
|
|
|
|
fi
|
|
|
|
|
|
|
|
updateFileChange "$subFolder$copiedFile"
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
# Takes the filename as a parameter
|
|
|
|
editFile(){
|
|
|
|
vecho "editFile $*"
|
|
|
|
cd "$dataDir" || return
|
|
|
|
local filename
|
|
|
|
filename="$(findFile "$*")"
|
|
|
|
[ ! -e "$filename" ] && exit 1
|
|
|
|
"$editor" "$filename"
|
|
|
|
updateFileChange "$filename"
|
|
|
|
}
|
|
|
|
|
|
|
|
# This is used to update the DB when a file is changed
|
|
|
|
# param1 is the file
|
|
|
|
updateFileChange(){
|
|
|
|
vecho "updateFileChange $*"
|
|
|
|
cd "$dataDir" || return
|
|
|
|
local filename
|
|
|
|
local directory=""
|
|
|
|
local title
|
|
|
|
local newFilename
|
|
|
|
local filetype="normal"
|
|
|
|
local ext
|
|
|
|
filename="$(findFile "$*")"
|
|
|
|
ext="${filename##*.}"
|
|
|
|
[ ! -e "$filename" ] && die "No such file $1"
|
|
|
|
if echo "$filename" | grep -q '^assets/'; then
|
|
|
|
filetype="asset"
|
|
|
|
directory="assets/"
|
|
|
|
fi
|
|
|
|
title="$(getYamlTitle "$filename")"
|
|
|
|
newFilename="$directory$(escapeFilename "$title.$ext")"
|
|
|
|
if [ "$filename" = "$newFilename" ]; then
|
|
|
|
# The title hasn't changed
|
|
|
|
# check if the file is in the DB
|
|
|
|
if ! fileInDB "$filename"; then
|
|
|
|
# If not, add it
|
|
|
|
echo "INSERT INTO items (filename, title, type)
|
|
|
|
VALUES ( '$(safeSQL "$filename")',
|
|
|
|
'$(safeSQL "$title")', '$(safeSQL "$filetype")' );" |
|
|
|
|
sqlite3 "${sqliteFile}"
|
|
|
|
fi
|
|
|
|
# Make sure all the tags are up to date
|
|
|
|
getYamlTags "$filename" | assignTags "$filename"
|
|
|
|
gitChange "$filename"
|
|
|
|
else
|
|
|
|
# The title has changed so we need to move the file
|
|
|
|
if [ -e "$newFilename" ]; then
|
|
|
|
# If the place we need to move it to already exists, die
|
|
|
|
die -e "$newFilename already exists
|
|
|
|
$filename title changed
|
|
|
|
Please resolve manually"
|
|
|
|
else
|
|
|
|
mv "$filename" "$newFilename"
|
|
|
|
[ -e "$filename.yaml" ] && mv "$filename.yaml" "$newFilename.yaml"
|
|
|
|
if fileInDB "$filename"; then
|
|
|
|
echo "UPDATE items
|
|
|
|
SET (filename,title) =
|
|
|
|
('$(safeSQL "$newFilename")','$(safeSQL "$title")')
|
|
|
|
WHERE filename = '$(safeSQL "$filename")';" |
|
|
|
|
sqlite3 "${sqliteFile}"
|
|
|
|
else
|
|
|
|
# We get here if the title was changed in the create process
|
|
|
|
echo "INSERT INTO items (filename, title, type)
|
|
|
|
VALUES ( '$(safeSQL "$newFilename")',
|
|
|
|
'$(safeSQL "$title")', '$(safeSQL "$filetype")' );" |
|
|
|
|
sqlite3 "${sqliteFile}"
|
|
|
|
|
|
|
|
fi
|
|
|
|
getYamlTags "$newFilename" | assignTags "$newFilename"
|
|
|
|
gitChange "$filename" "$newFilename"
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
|
|
|
deleteFile(){
|
|
|
|
vecho "deleteFile $*"
|
|
|
|
cd "$dataDir" || return
|
|
|
|
local filename
|
|
|
|
local fileID
|
|
|
|
local rsp
|
|
|
|
filename="$(findFile "$*")"
|
|
|
|
fileID="$(findFileId "$filename")"
|
|
|
|
[ ! -e "$filename" ] && exit 1
|
|
|
|
echo -n "Are you sure? [yN] "
|
|
|
|
read -r rsp
|
|
|
|
if [[ "$(echo "$rsp" | tr '[:upper:]' '[:lower:]')" = "y"* ]]; then
|
|
|
|
rm "$filename"
|
|
|
|
[ -e "$filename.yaml" ] && rm "$filename.yaml"
|
|
|
|
# This deletes the file from the sql database and any tag links
|
|
|
|
echo "DELETE FROM items
|
|
|
|
WHERE id = '$(safeSQL "$fileID")';
|
|
|
|
DELETE FROM links
|
|
|
|
WHERE itemID = '$(safeSQL "$fileID")';" |
|
|
|
|
sqlite3 --column --header "${sqliteFile}"
|
|
|
|
gitChange "$filename"
|
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
|
|
|
viewFile(){
|
|
|
|
vecho "viewFile $*"
|
|
|
|
cd "$dataDir" || return
|
|
|
|
|
|
|
|
local id="$*"
|
|
|
|
local filename
|
|
|
|
|
|
|
|
filename="$(findFile "$id")"
|
|
|
|
|
|
|
|
"$pager" "$filename"
|
|
|
|
}
|
|
|
|
|