Compare commits
54 Commits
df4019ef0f
...
v0.15.4
Author | SHA1 | Date | |
---|---|---|---|
e0fa31b7a1 | |||
ed614026ec | |||
87f8786c43 | |||
acae07b8f3 | |||
1b100483de | |||
e03fd78ea9 | |||
370ef205a9 | |||
d328ddb749 | |||
5dc5590da9 | |||
364112a0a4 | |||
a38523e933 | |||
200672dae2 | |||
3d3aad88c8 | |||
e4e43d1a83 | |||
737a9ec314 | |||
1ebe0380ee | |||
d62d71b5d1 | |||
b36e0ea503 | |||
bc4d8fa37e | |||
d2b21e7405 | |||
e3c192359f | |||
46532e4c85 | |||
c722135a56 | |||
887fa863bc | |||
74d71cfb6a | |||
ca7e7cddd3 | |||
94431a2aa9 | |||
5b1f20c5bc | |||
d0c566f8df | |||
5e586aa49a | |||
66b2743d3d | |||
3723b2b5e6 | |||
ce788bfd50 | |||
230a6278cc | |||
42d6e0c198 | |||
e1af2979af | |||
f6dedc6f10 | |||
cdf0a49550 | |||
c3c0650210 | |||
d077f700d8 | |||
ec752b1c66 | |||
46aef4f12f | |||
1b29e328cf | |||
e50cb819f3 | |||
c32e38ca10 | |||
d7c8c7a43a | |||
1cd3edc90c | |||
0e768c9f61 | |||
1fcd775cc5 | |||
203a1ed147 | |||
ef1914ee5c | |||
084b101e31 | |||
b2db128aa9 | |||
081e880fb6 |
@ -175,10 +175,6 @@ func (db *DB) GetCertainArticles(attribute string, value bool) ([]*Article, erro
|
|||||||
articleList = append(articleList, article)
|
articleList = append(articleList, article)
|
||||||
}
|
}
|
||||||
|
|
||||||
if err = rows.Err(); err != nil {
|
|
||||||
return nil, fmt.Errorf("error iterating over rows: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
return articleList, nil
|
return articleList, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -247,13 +243,6 @@ func (db *DB) GetCurrentIssueArticles() ([]*Article, error) {
|
|||||||
articleList = append(articleList, article)
|
articleList = append(articleList, article)
|
||||||
}
|
}
|
||||||
|
|
||||||
if err = rows.Err(); err != nil {
|
|
||||||
if rollbackErr := tx.Rollback(); rollbackErr != nil {
|
|
||||||
log.Fatalf("transaction error: %v, rollback error: %v", err, rollbackErr)
|
|
||||||
}
|
|
||||||
return nil, fmt.Errorf("error iterating over rows: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
if err = tx.Commit(); err != nil {
|
if err = tx.Commit(); err != nil {
|
||||||
return nil, fmt.Errorf("error committing transaction when getting articles of issue %v: %v", issueID, err)
|
return nil, fmt.Errorf("error committing transaction when getting articles of issue %v: %v", issueID, err)
|
||||||
}
|
}
|
||||||
|
@ -68,10 +68,6 @@ func (db *DB) GetArticleAuthors(c *Config, articleID int64) ([]*User, error) {
|
|||||||
authors = append(authors, author)
|
authors = append(authors, author)
|
||||||
}
|
}
|
||||||
|
|
||||||
if err = rows.Err(); err != nil {
|
|
||||||
return nil, fmt.Errorf("error iterating over rows: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
return authors, nil
|
return authors, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -68,10 +68,6 @@ func (db *DB) GetArticleContributors(c *Config, articleID int64) ([]*User, error
|
|||||||
contributors = append(contributors, contributor)
|
contributors = append(contributors, contributor)
|
||||||
}
|
}
|
||||||
|
|
||||||
if err = rows.Err(); err != nil {
|
|
||||||
return nil, fmt.Errorf("error iterating over rows: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
return contributors, nil
|
return contributors, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -61,10 +61,6 @@ func (db *DB) GetArticleTags(articleID int64) ([]*Tag, error) {
|
|||||||
tags = append(tags, tag)
|
tags = append(tags, tag)
|
||||||
}
|
}
|
||||||
|
|
||||||
if err = rows.Err(); err != nil {
|
|
||||||
return nil, fmt.Errorf("error iterating over rows: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
return tags, nil
|
return tags, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -52,7 +52,7 @@ func newConfig() *Config {
|
|||||||
MaxImgWidth: 1920,
|
MaxImgWidth: 1920,
|
||||||
PDFDir: "/var/www/cpolis/pdfs",
|
PDFDir: "/var/www/cpolis/pdfs",
|
||||||
Port: ":1664",
|
Port: ":1664",
|
||||||
Version: "v0.16.0",
|
Version: "v0.15.4",
|
||||||
WebDir: "/var/www/cpolis/web",
|
WebDir: "/var/www/cpolis/web",
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -21,7 +21,7 @@ func ConvertToMarkdown(c *Config, filename string) ([]byte, error) {
|
|||||||
defer os.RemoveAll(tmpDir)
|
defer os.RemoveAll(tmpDir)
|
||||||
|
|
||||||
articleFileName := filepath.Join(os.TempDir(), fmt.Sprint(uuid.New(), ".md"))
|
articleFileName := filepath.Join(os.TempDir(), fmt.Sprint(uuid.New(), ".md"))
|
||||||
cmd := exec.Command("pandoc", "-s", "-L", filepath.Join("scripts", "create_toc.lua"), "-f", "docx", "-t", "commonmark_x", "-o", articleFileName, "--extract-media", tmpDir, filename) // TODO: Is writing to a file necessary?
|
cmd := exec.Command("pandoc", "-s", "-f", "docx", "-t", "commonmark_x", "-o", articleFileName, "--extract-media", tmpDir, filename) // TODO: Is writing to a file necessary?
|
||||||
cmd.Stderr = &stderr
|
cmd.Stderr = &stderr
|
||||||
if err = cmd.Run(); err != nil {
|
if err = cmd.Run(); err != nil {
|
||||||
return nil, fmt.Errorf("error converting docx to markdown: %v: %v", err, stderr.String())
|
return nil, fmt.Errorf("error converting docx to markdown: %v: %v", err, stderr.String())
|
||||||
@ -33,9 +33,6 @@ func ConvertToMarkdown(c *Config, filename string) ([]byte, error) {
|
|||||||
return nil, fmt.Errorf("error reading markdown file: %v", err)
|
return nil, fmt.Errorf("error reading markdown file: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
re := regexp.MustCompile(`\{width=[^}]+height=[^}]+\}`)
|
|
||||||
articleContent = re.ReplaceAll(articleContent, []byte(""))
|
|
||||||
|
|
||||||
imageNames, err := filepath.Glob(filepath.Join(tmpDir, "media", "*"))
|
imageNames, err := filepath.Glob(filepath.Join(tmpDir, "media", "*"))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("error getting docx images from temporary directory: %v", err)
|
return nil, fmt.Errorf("error getting docx images from temporary directory: %v", err)
|
||||||
|
@ -31,9 +31,5 @@ func (db *DB) GetTagList() ([]*Tag, error) {
|
|||||||
tagList = append(tagList, tag)
|
tagList = append(tagList, tag)
|
||||||
}
|
}
|
||||||
|
|
||||||
if err = rows.Err(); err != nil {
|
|
||||||
return nil, fmt.Errorf("error iterating over rows: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
return tagList, nil
|
return tagList, nil
|
||||||
}
|
}
|
||||||
|
@ -117,9 +117,6 @@ func aesDecrypt(c *Config, ciphertext string) (string, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
nonceSize := gcm.NonceSize()
|
nonceSize := gcm.NonceSize()
|
||||||
if len(data) < nonceSize {
|
|
||||||
return "", errors.New("ciphertext too short")
|
|
||||||
}
|
|
||||||
nonce, cipherText := data[:nonceSize], data[nonceSize:]
|
nonce, cipherText := data[:nonceSize], data[nonceSize:]
|
||||||
|
|
||||||
plaintext, err := gcm.Open(nil, nonce, cipherText, nil)
|
plaintext, err := gcm.Open(nil, nonce, cipherText, nil)
|
||||||
@ -453,6 +450,8 @@ func (db *DB) AddFirstUser(c *Config, u *User, pass string) (int64, error) {
|
|||||||
|
|
||||||
func (db *DB) GetAllUsers(c *Config) ([]*User, error) {
|
func (db *DB) GetAllUsers(c *Config) ([]*User, error) {
|
||||||
var aesFirstName, aesLastName, aesEmail string
|
var aesFirstName, aesLastName, aesEmail string
|
||||||
|
var err error
|
||||||
|
|
||||||
query := "SELECT id, username, first_name, last_name, email, profile_pic_link, role FROM users"
|
query := "SELECT id, username, first_name, last_name, email, profile_pic_link, role FROM users"
|
||||||
|
|
||||||
rows, err := db.Query(query)
|
rows, err := db.Query(query)
|
||||||
@ -485,10 +484,6 @@ func (db *DB) GetAllUsers(c *Config) ([]*User, error) {
|
|||||||
users = append(users, user)
|
users = append(users, user)
|
||||||
}
|
}
|
||||||
|
|
||||||
if err = rows.Err(); err != nil {
|
|
||||||
return nil, fmt.Errorf("error iterating over rows: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
return users, nil
|
return users, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -528,10 +523,6 @@ func (db *DB) GetAllUsersMap(c *Config) (map[int64]*User, error) {
|
|||||||
users[user.ID] = user
|
users[user.ID] = user
|
||||||
}
|
}
|
||||||
|
|
||||||
if err = rows.Err(); err != nil {
|
|
||||||
return nil, fmt.Errorf("error iterating over rows: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
return users, nil
|
return users, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -901,7 +901,6 @@ func AllowEditArticle(c *b.Config, db *b.DB, s map[string]*Session) http.Handler
|
|||||||
}
|
}
|
||||||
|
|
||||||
newArticle := *oldArticle
|
newArticle := *oldArticle
|
||||||
newArticle.UUID = uuid.New()
|
|
||||||
newArticle.Published = false
|
newArticle.Published = false
|
||||||
newArticle.Rejected = true
|
newArticle.Rejected = true
|
||||||
newArticle.EditedID = oldArticle.ID
|
newArticle.EditedID = oldArticle.ID
|
||||||
|
@ -1,33 +0,0 @@
|
|||||||
-- Helper function: remove all image inlines from a list of inlines.
|
|
||||||
local function remove_images(inlines)
|
|
||||||
local result = {}
|
|
||||||
for _, item in ipairs(inlines) do
|
|
||||||
if item.t ~= "Image" then
|
|
||||||
table.insert(result, item)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
return result
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Build a bullet list representing the table of contents.
|
|
||||||
local function build_toc(doc)
|
|
||||||
local toc_items = {}
|
|
||||||
for _, block in ipairs(doc.blocks) do
|
|
||||||
if block.t == "Header" then
|
|
||||||
local clean_inlines = remove_images(block.content)
|
|
||||||
local header_text = pandoc.utils.stringify(clean_inlines)
|
|
||||||
if header_text ~= "" then
|
|
||||||
local link = pandoc.Link(clean_inlines, "#" .. block.identifier)
|
|
||||||
table.insert(toc_items, { link })
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
return pandoc.BulletList(toc_items)
|
|
||||||
end
|
|
||||||
|
|
||||||
-- The Pandoc function runs after the document is fully constructed.
|
|
||||||
function Pandoc(doc)
|
|
||||||
local toc = build_toc(doc)
|
|
||||||
table.insert(doc.blocks, 1, toc) -- Insert the TOC at the very beginning of the document.
|
|
||||||
return doc
|
|
||||||
end
|
|
58
update.sh
Executable file
58
update.sh
Executable file
@ -0,0 +1,58 @@
|
|||||||
|
#! /bin/sh -
|
||||||
|
|
||||||
|
CPOLIS_REPO_URL="https://git.streifling.com/api/v1/repos/jason/cpolis/releases"
|
||||||
|
EXTRACTION_DIR=$HOME
|
||||||
|
CPOLIS_DIR=$EXTRACTION_DIR/cpolis
|
||||||
|
TAILWINDCSS_REPO_URL=https://api.github.com/repos/tailwindlabs/tailwindcss/releases/latest
|
||||||
|
TMP_DIR=/tmp
|
||||||
|
BIN_DIR=/usr/local/bin
|
||||||
|
SYSTEMD_DIR=/etc/systemd/system
|
||||||
|
|
||||||
|
check_dependency() {
|
||||||
|
if ! which $1 >/dev/null 2>&1; then
|
||||||
|
echo "$1 needs to be installed" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
if ! groups | grep -E 'root|wheel|sudo' >/dev/null; then
|
||||||
|
echo "You need administrative privileges for this script" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
check_dependency curl
|
||||||
|
check_dependency go
|
||||||
|
check_dependency jq
|
||||||
|
check_dependency tar
|
||||||
|
check_dependency xargs
|
||||||
|
|
||||||
|
echo '\nDownloading cpolis...' >&2
|
||||||
|
rm -fr $CPOLIS_DIR/*
|
||||||
|
latest_release=$(curl -s $CPOLIS_REPO_URL | jq -r '.[0].tag_name')
|
||||||
|
curl -Lo $TMP_DIR/cpolis.tar.gz https://git.streifling.com/jason/cpolis/archive/$latest_release.tar.gz
|
||||||
|
tar -xzf $TMP_DIR/cpolis.tar.gz -C $EXTRACTION_DIR
|
||||||
|
rm $TMP_DIR/cpolis.tar.gz
|
||||||
|
|
||||||
|
echo '\nDownloading TailwindCSS...' >&2
|
||||||
|
curl -s $TAILWINDCSS_REPO_URL |
|
||||||
|
grep -F browser_download_url |
|
||||||
|
grep -F linux-x64 |
|
||||||
|
cut -d'"' -f4 |
|
||||||
|
xargs -r curl -Lo $CPOLIS_DIR/tailwindcss
|
||||||
|
chmod +x $CPOLIS_DIR/tailwindcss
|
||||||
|
$CPOLIS_DIR/tailwindcss -i $CPOLIS_DIR/web/static/css/input.css -o $CPOLIS_DIR/web/static/css/style.css
|
||||||
|
|
||||||
|
echo '\nBuilding cpolis...' >&2
|
||||||
|
cd $CPOLIS_DIR
|
||||||
|
go build -o $BIN_DIR/cpolis cmd/main.go
|
||||||
|
cd
|
||||||
|
|
||||||
|
echo '\nSetting up system files...' >&2
|
||||||
|
sudo chown root:root $BIN_DIR/cpolis
|
||||||
|
chmod +x $BIN_DIR/cpolis
|
||||||
|
|
||||||
|
echo '\nSetting up service...' >&2
|
||||||
|
sudo mv $CPOLIS_DIR/cpolis.service $SYSTEMD_DIR
|
||||||
|
sudo chown root:root $SYSTEMD_DIR/cpolis.service
|
||||||
|
sudo systemctl daemon-reload
|
||||||
|
sudo systemctl is-active --quiet cpolis.service && sudo systemctl restart cpolis.service
|
Reference in New Issue
Block a user