mirror of
https://git.sr.ht/~cadence/bibliogram
synced 2024-11-22 16:17:29 +00:00
Add remove hashtags setting
This commit is contained in:
parent
ba5a5a7653
commit
ea81b945ce
@ -112,6 +112,11 @@ let constants = {
|
|||||||
default: "",
|
default: "",
|
||||||
boolean: true,
|
boolean: true,
|
||||||
replaceEmptyWithDefault: true
|
replaceEmptyWithDefault: true
|
||||||
|
},{
|
||||||
|
name: "remove_trailing_hashtags",
|
||||||
|
default: "",
|
||||||
|
boolean: true,
|
||||||
|
replaceEmptyWithDefault: false
|
||||||
},{
|
},{
|
||||||
name: "link_hashtags",
|
name: "link_hashtags",
|
||||||
default: "",
|
default: "",
|
||||||
@ -122,6 +127,11 @@ let constants = {
|
|||||||
default: "on",
|
default: "on",
|
||||||
boolean: true,
|
boolean: true,
|
||||||
replaceEmptyWithDefault: false
|
replaceEmptyWithDefault: false
|
||||||
|
},{
|
||||||
|
name: "infinite_scroll",
|
||||||
|
default: "normal",
|
||||||
|
boolean: false,
|
||||||
|
replaceEmptyWithDefault: true
|
||||||
},{
|
},{
|
||||||
name: "caption_side",
|
name: "caption_side",
|
||||||
default: "left",
|
default: "left",
|
||||||
@ -263,7 +273,7 @@ let constants = {
|
|||||||
|
|
||||||
additional_routes: [],
|
additional_routes: [],
|
||||||
|
|
||||||
database_version: 7
|
database_version: 8
|
||||||
}
|
}
|
||||||
|
|
||||||
// Override values from config and export the result
|
// Override values from config and export the result
|
||||||
|
@ -2,7 +2,7 @@ const constants = require("../constants")
|
|||||||
const {proxyImage, proxyExtendedOwner} = require("../utils/proxyurl")
|
const {proxyImage, proxyExtendedOwner} = require("../utils/proxyurl")
|
||||||
const {compile} = require("pug")
|
const {compile} = require("pug")
|
||||||
const collectors = require("../collectors")
|
const collectors = require("../collectors")
|
||||||
const {structure} = require("../utils/structuretext")
|
const {structure, removeTrailingHashtags} = require("../utils/structuretext")
|
||||||
const TimelineBaseMethods = require("./TimelineBaseMethods")
|
const TimelineBaseMethods = require("./TimelineBaseMethods")
|
||||||
const TimelineChild = require("./TimelineChild")
|
const TimelineChild = require("./TimelineChild")
|
||||||
require("../testimports")(collectors, TimelineChild, TimelineBaseMethods)
|
require("../testimports")(collectors, TimelineChild, TimelineBaseMethods)
|
||||||
@ -110,6 +110,12 @@ class TimelineEntry extends TimelineBaseMethods {
|
|||||||
else return structure(caption)
|
else return structure(caption)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
getStructuredCaptionWithoutTrailingHashtags() {
|
||||||
|
const structured = this.getStructuredCaption()
|
||||||
|
if (!structured) return null // no caption
|
||||||
|
else return removeTrailingHashtags(structured)
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Try to get the first meaningful line or sentence from the caption.
|
* Try to get the first meaningful line or sentence from the caption.
|
||||||
*/
|
*/
|
||||||
|
@ -1,5 +1,20 @@
|
|||||||
const constants = require("../constants")
|
const constants = require("../constants")
|
||||||
|
|
||||||
|
const dots = [
|
||||||
|
".", // full stop
|
||||||
|
"\u00b7", // middle dot
|
||||||
|
"\u2022", // bullet
|
||||||
|
"\u2027", // hyphenation point
|
||||||
|
"\u2219", // bullet operator
|
||||||
|
"\u22c5", // dot operator
|
||||||
|
"\u2e31", // word separator middle dot
|
||||||
|
"\u2e33", // raised dot
|
||||||
|
"\u30fb", // katakana middle dot
|
||||||
|
"\uff65", // halfwidth katakana middle dot
|
||||||
|
]
|
||||||
|
|
||||||
|
const dotRegex = new RegExp(`[\n ][\n #${dots.join("")}]*$`, "gms")
|
||||||
|
|
||||||
function tryMatch(text, against, callback) {
|
function tryMatch(text, against, callback) {
|
||||||
if (against instanceof RegExp && against.global) {
|
if (against instanceof RegExp && against.global) {
|
||||||
// if it's a global match, keep sending matches to the callback while the callback returns true
|
// if it's a global match, keep sending matches to the callback while the callback returns true
|
||||||
@ -67,6 +82,41 @@ function structure(text) {
|
|||||||
return parts
|
return parts
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Edit a structure in-place to remove trailing hashtags and separator characters.
|
||||||
|
*/
|
||||||
|
function removeTrailingHashtags(structured) {
|
||||||
|
let hasHashtags = structured.some(part => part.type === "hashtag")
|
||||||
|
let seenHashtags = false
|
||||||
|
|
||||||
|
function shouldRemoveLastPart() {
|
||||||
|
const part = structured[structured.length-1]
|
||||||
|
if (part.type === "hashtag") {
|
||||||
|
seenHashtags = true
|
||||||
|
return true
|
||||||
|
} else if (part.type === "user") {
|
||||||
|
if (hasHashtags && !seenHashtags) { // compromise?
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
} else if (part.type === "text") {
|
||||||
|
const content = part.text.replace(dotRegex, "")
|
||||||
|
if (content.length === 0) {
|
||||||
|
return true
|
||||||
|
} else {
|
||||||
|
part.text = content
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
while (shouldRemoveLastPart()) {
|
||||||
|
structured.pop()
|
||||||
|
}
|
||||||
|
|
||||||
|
return structured
|
||||||
|
}
|
||||||
|
|
||||||
module.exports.structure = structure
|
module.exports.structure = structure
|
||||||
module.exports.partsUsername = partsUsername
|
module.exports.partsUsername = partsUsername
|
||||||
module.exports.partsHashtag = partsHashtag
|
module.exports.partsHashtag = partsHashtag
|
||||||
|
module.exports.removeTrailingHashtags = removeTrailingHashtags
|
||||||
|
@ -80,7 +80,7 @@ const deltas = new Map([
|
|||||||
db.transaction(() => {
|
db.transaction(() => {
|
||||||
db.prepare("ALTER TABLE UserSettings ADD COLUMN save_data TEXT NOT NULL DEFAULT 'automatic'")
|
db.prepare("ALTER TABLE UserSettings ADD COLUMN save_data TEXT NOT NULL DEFAULT 'automatic'")
|
||||||
.run()
|
.run()
|
||||||
db.prepare("ALTER TABLE UserSettings ADD COLUMN rewrite_youtube TEXT NOT NULL DEFAULt ''")
|
db.prepare("ALTER TABLE UserSettings ADD COLUMN rewrite_youtube TEXT NOT NULL DEFAULT ''")
|
||||||
.run()
|
.run()
|
||||||
db.prepare("ALTER TABLE UserSettings ADD COLUMN rewrite_twitter TEXT NOT NULL DEFAULT ''")
|
db.prepare("ALTER TABLE UserSettings ADD COLUMN rewrite_twitter TEXT NOT NULL DEFAULT ''")
|
||||||
.run()
|
.run()
|
||||||
@ -94,6 +94,15 @@ const deltas = new Map([
|
|||||||
db.prepare("CREATE TABLE CSRFTokens (token TEXT NOT NULL, expires INTEGER NOT NULL, PRIMARY KEY (token))")
|
db.prepare("CREATE TABLE CSRFTokens (token TEXT NOT NULL, expires INTEGER NOT NULL, PRIMARY KEY (token))")
|
||||||
.run()
|
.run()
|
||||||
})()
|
})()
|
||||||
|
}],
|
||||||
|
// version 7 to version 8
|
||||||
|
[8, function() {
|
||||||
|
db.transaction(() => {
|
||||||
|
db.prepare("ALTER TABLE UserSettings ADD COLUMN remove_trailing_hashtags INTEGER NOT NULL DEFAULT 0")
|
||||||
|
.run()
|
||||||
|
db.prepare("ALTER TABLE UserSettings ADD COLUMN infinite_scroll TEXT NOT NULL DEFAULT 'normal'")
|
||||||
|
.run()
|
||||||
|
})()
|
||||||
}]
|
}]
|
||||||
])
|
])
|
||||||
|
|
||||||
|
@ -28,7 +28,10 @@ mixin post(post, headerWithNavigation)
|
|||||||
div
|
div
|
||||||
if post.getCaption()
|
if post.getCaption()
|
||||||
p.structured-text.description
|
p.structured-text.description
|
||||||
+display_structured(post.getStructuredCaption())
|
if settings.remove_trailing_hashtags
|
||||||
|
+display_structured(post.getStructuredCaptionWithoutTrailingHashtags())
|
||||||
|
else
|
||||||
|
+display_structured(post.getStructuredCaption())
|
||||||
|
|
||||||
footer
|
footer
|
||||||
if willDisplayAltInDescription
|
if willDisplayAltInDescription
|
||||||
|
@ -61,12 +61,20 @@ html
|
|||||||
|
|
||||||
+input("rewrite_twitter", "Rewrite Twitter domain", "twitter.com", true)
|
+input("rewrite_twitter", "Rewrite Twitter domain", "twitter.com", true)
|
||||||
|
|
||||||
+checkbox("show_comments", "Display comments", "Display", true)
|
+checkbox("remove_trailing_hashtags", "Hide trailing hashtags", false)
|
||||||
|
|
||||||
+checkbox("link_hashtags", "Clickable hashtags", "Clickable", true)
|
+checkbox("link_hashtags", "Clickable hashtags", "Clickable", true)
|
||||||
|
|
||||||
|
+checkbox("show_comments", "Display comments", "Display", true)
|
||||||
|
|
||||||
+checkbox("spa", "Fast navigation", "Enabled", false)
|
+checkbox("spa", "Fast navigation", "Enabled", false)
|
||||||
|
|
||||||
|
+select("infinite_scroll", "Infinite scroll", true, [
|
||||||
|
{value: "normal", text: "Normal"},
|
||||||
|
{value: "eager", text: "Eager"},
|
||||||
|
{value: "off", text: "Manual"}
|
||||||
|
])
|
||||||
|
|
||||||
+fieldset("Appearance")
|
+fieldset("Appearance")
|
||||||
+select("theme", "Theme", false, constants.themes.collated.map(entry => ({value: entry.file, text: entry.name})))
|
+select("theme", "Theme", false, constants.themes.collated.map(entry => ({value: entry.file, text: entry.name})))
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
const tap = require("tap")
|
const tap = require("tap")
|
||||||
const {structure, partsHashtag, partsUsername} = require("../src/lib/utils/structuretext.js")
|
const {structure, partsHashtag, partsUsername, removeTrailingHashtags} = require("../src/lib/utils/structuretext.js")
|
||||||
|
|
||||||
// lone test hashtag
|
// lone test hashtag
|
||||||
tap.same(
|
tap.same(
|
||||||
@ -154,3 +154,91 @@ tap.test("entire structure works", childTest => {
|
|||||||
|
|
||||||
childTest.end()
|
childTest.end()
|
||||||
})
|
})
|
||||||
|
|
||||||
|
tap.test("remove trailing hashtags", childTest => {
|
||||||
|
childTest.same(
|
||||||
|
removeTrailingHashtags(structure(
|
||||||
|
"Happy earth day folks #flyingfish"
|
||||||
|
)),
|
||||||
|
[
|
||||||
|
{type: "text", text: "Happy earth day folks"}
|
||||||
|
],
|
||||||
|
"earth day"
|
||||||
|
)
|
||||||
|
|
||||||
|
childTest.same(
|
||||||
|
removeTrailingHashtags(structure(
|
||||||
|
"🍌HELLO OLIVE HERE🍌...and we have been working hard on this magic trick for youuuUuu."
|
||||||
|
+ "\n."
|
||||||
|
+ "\n. ."
|
||||||
|
+ "\n."
|
||||||
|
+ "\n."
|
||||||
|
+ "\n#guineapig #cavy #guineapigs #guineapigsofinstagram #cute #babyanimals #cavylove #babyguineapig #guineapigsof_ig #cavy #thedodo #spoiltpets #funny #pets #guineapigpopcorning #popcorning #guineapigsleeping #vipmischief #tiktok #tiktokmemes"
|
||||||
|
)),
|
||||||
|
[
|
||||||
|
{type: "text", text: "🍌HELLO OLIVE HERE🍌...and we have been working hard on this magic trick for youuuUuu."}
|
||||||
|
],
|
||||||
|
"olive"
|
||||||
|
)
|
||||||
|
|
||||||
|
childTest.same(
|
||||||
|
removeTrailingHashtags(structure(
|
||||||
|
"PINK HOUSE. ."
|
||||||
|
+ "\n."
|
||||||
|
+ "\n."
|
||||||
|
+ "\n."
|
||||||
|
+ "\n."
|
||||||
|
+ "\n."
|
||||||
|
+ "\n#antireality #archicage #arqsketch #thebna #next_top_architects #architecturedose #architecture_hunter #morpholio #archdaily #designboom #arch_more #designmilk #arch_impressive #designwanted #nextarch #dezeen #amazingarchitecture #koozarch #superarchitects #thearchitecturestudentblog #architecturestudents #architecturefactor #allofarchitecture #archinect #soarch #"
|
||||||
|
)),
|
||||||
|
[
|
||||||
|
{type: "text", text: "PINK HOUSE."}
|
||||||
|
],
|
||||||
|
"pink house"
|
||||||
|
)
|
||||||
|
|
||||||
|
childTest.same(
|
||||||
|
removeTrailingHashtags(structure(
|
||||||
|
"This some research I’ve been doing for #FuturePlay at @futuredeluxe together with @curtisbaigent Expressive Computer Vision #1"
|
||||||
|
)),
|
||||||
|
[
|
||||||
|
{type: "text", text: "This some research I’ve been doing for "},
|
||||||
|
{type: "hashtag", text: "#FuturePlay", hashtag: "FuturePlay"},
|
||||||
|
{type: "text", text: " at "},
|
||||||
|
{type: "user", text: "@futuredeluxe", user: "futuredeluxe"},
|
||||||
|
{type: "text", text: " together with "},
|
||||||
|
{type: "user", text: "@curtisbaigent", user: "curtisbaigent"},
|
||||||
|
{type: "text", text: " Expressive Computer Vision"}
|
||||||
|
],
|
||||||
|
"computer vision"
|
||||||
|
)
|
||||||
|
|
||||||
|
childTest.same(
|
||||||
|
removeTrailingHashtags(structure(
|
||||||
|
"It is a flourishing building in"
|
||||||
|
+ "\nthe midst of a great bustling city."
|
||||||
|
+ "\nPeople will get out from difficulty,"
|
||||||
|
+ "\nand this will be the resurrection time."
|
||||||
|
+ "\n#hellofrom Chongqing China"
|
||||||
|
+ "\n・"
|
||||||
|
+ "\n・"
|
||||||
|
+ "\n・"
|
||||||
|
+ "\n・"
|
||||||
|
+ "\n#earthfocus #earthoffcial #earthpix #discoverearth #lifeofadventure #livingonearth #theweekoninstagram #theglobewanderer #visualambassadors #welivetoexplore #IamATraveler #wonderful_places #TLPics #depthobsessed #voyaged @sonyalpha @hypebeast @highsnobiety @lightroom @soul.planet @earthfever @9gag @500px"
|
||||||
|
)),
|
||||||
|
[
|
||||||
|
{type: "text", text:
|
||||||
|
"It is a flourishing building in"
|
||||||
|
+ "\nthe midst of a great bustling city."
|
||||||
|
+ "\nPeople will get out from difficulty,"
|
||||||
|
+ "\nand this will be the resurrection time."
|
||||||
|
+ "\n"
|
||||||
|
},
|
||||||
|
{type: "hashtag", text: "#hellofrom", hashtag: "hellofrom"},
|
||||||
|
{type: "text", text: " Chongqing China"}
|
||||||
|
],
|
||||||
|
"chongquing china"
|
||||||
|
)
|
||||||
|
|
||||||
|
childTest.end()
|
||||||
|
})
|
||||||
|
Loading…
Reference in New Issue
Block a user