Work on #16 This was a relatively large amount of work. It introduces assets which are stored in the assets sub directory and stored in the database with the asset type in the database.
211 lines
5.2 KiB
Bash
211 lines
5.2 KiB
Bash
#!/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
|
|
echo 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 "$1")"
|
|
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"
|
|
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
|
|
gitChange "$filename" "$newFilename"
|
|
fi
|
|
fi
|
|
}
|
|
|
|
deleteFile(){
|
|
vecho "deleteFile $*"
|
|
cd "$dataDir" || return
|
|
local filename
|
|
local fileID
|
|
local rsp
|
|
filename="$(findFile "$1")"
|
|
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"
|
|
# 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="$1"
|
|
local filename
|
|
|
|
filename="$(findFile "$id")"
|
|
|
|
"$pager" "$filename"
|
|
}
|
|
|