diff options
author | Jaakko Keränen <jaakko.keranen@iki.fi> | 2020-12-17 13:07:58 +0200 |
---|---|---|
committer | Jaakko Keränen <jaakko.keranen@iki.fi> | 2020-12-17 13:07:58 +0200 |
commit | d8a95f267f4f1865a58cbed15e6b45349e9d2c09 (patch) | |
tree | 5501245d7ef1209319a10ad824ac29b33e26a428 /src | |
parent | 48ba3598db53f249f3a8bfd577ca95afde52c760 (diff) |
Added "about:bookmarks"
A simple way to export all or some of your bookmarks.
Diffstat (limited to 'src')
-rw-r--r-- | src/bookmarks.c | 36 | ||||
-rw-r--r-- | src/bookmarks.h | 19 | ||||
-rw-r--r-- | src/gmrequest.c | 4 |
3 files changed, 52 insertions, 7 deletions
diff --git a/src/bookmarks.c b/src/bookmarks.c index 54b0407f..6d7302c0 100644 --- a/src/bookmarks.c +++ b/src/bookmarks.c | |||
@@ -70,6 +70,10 @@ static int cmpTimeDescending_Bookmark_(const iBookmark **a, const iBookmark **b) | |||
70 | return iCmp(seconds_Time(&(*b)->when), seconds_Time(&(*a)->when)); | 70 | return iCmp(seconds_Time(&(*b)->when), seconds_Time(&(*a)->when)); |
71 | } | 71 | } |
72 | 72 | ||
73 | static int cmpTitleAscending_Bookmark_(const iBookmark **a, const iBookmark **b) { | ||
74 | return cmpStringCase_String(&(*a)->title, &(*b)->title); | ||
75 | } | ||
76 | |||
73 | /*----------------------------------------------------------------------------------------------*/ | 77 | /*----------------------------------------------------------------------------------------------*/ |
74 | 78 | ||
75 | static const char *fileName_Bookmarks_ = "bookmarks.txt"; | 79 | static const char *fileName_Bookmarks_ = "bookmarks.txt"; |
@@ -222,3 +226,35 @@ const iPtrArray *list_Bookmarks(const iBookmarks *d, iBookmarksCompareFunc cmp, | |||
222 | sort_Array(list, (int (*)(const void *, const void *)) cmp); | 226 | sort_Array(list, (int (*)(const void *, const void *)) cmp); |
223 | return list; | 227 | return list; |
224 | } | 228 | } |
229 | |||
230 | const iString *bookmarkListPage_Bookmarks(const iBookmarks *d) { | ||
231 | iString *str = collectNew_String(); | ||
232 | setCStr_String(str, "Here are all your bookmarks. " | ||
233 | "You can save this page to export them, or you can copy them to " | ||
234 | "the clipboard.\n"); | ||
235 | lock_Mutex(d->mtx); | ||
236 | iConstForEach(PtrArray, i, list_Bookmarks(d, cmpTitleAscending_Bookmark_, NULL, NULL)) { | ||
237 | const iBookmark *bm = i.ptr; | ||
238 | appendFormat_String(str, "\n=> %s %s\n", cstr_String(&bm->url), cstr_String(&bm->title)); | ||
239 | iRangecc tag = iNullRange; | ||
240 | while (nextSplit_Rangecc(range_String(&bm->tags), " ", &tag)) { | ||
241 | if (!isEmpty_Range(&tag)) { | ||
242 | appendCStr_String(str, "* "); | ||
243 | appendRange_String(str, tag); | ||
244 | appendChar_String(str, '\n'); | ||
245 | } | ||
246 | } | ||
247 | } | ||
248 | unlock_Mutex(d->mtx); | ||
249 | appendCStr_String(str, | ||
250 | "\nPAGE FORMAT: " | ||
251 | "Text lines and preformatted text are comments and should be ignored. " | ||
252 | "Each link line represents a bookmark. " | ||
253 | "Folder structure is defined by headings. " | ||
254 | "All links before the first heading are root level bookmarks. " | ||
255 | "Bullet lines following a link are used for tags; each tag gets its own " | ||
256 | "bullet line. Quotes are reserved for additional information about a " | ||
257 | "bookmark.\n"); | ||
258 | appendCStr_String(str, "\nLagrange v" LAGRANGE_APP_VERSION "\n"); | ||
259 | return str; | ||
260 | } | ||
diff --git a/src/bookmarks.h b/src/bookmarks.h index 9a1ecba3..4768af9f 100644 --- a/src/bookmarks.h +++ b/src/bookmarks.h | |||
@@ -45,17 +45,20 @@ iBool hasTag_Bookmark (const iBookmark *d, const char *tag); | |||
45 | void addTag_Bookmark (iBookmark *d, const char *tag); | 45 | void addTag_Bookmark (iBookmark *d, const char *tag); |
46 | void removeTag_Bookmark (iBookmark *d, const char *tag); | 46 | void removeTag_Bookmark (iBookmark *d, const char *tag); |
47 | 47 | ||
48 | /*----------------------------------------------------------------------------------------------*/ | ||
49 | |||
48 | iDeclareType(Bookmarks) | 50 | iDeclareType(Bookmarks) |
49 | iDeclareTypeConstruction(Bookmarks) | 51 | iDeclareTypeConstruction(Bookmarks) |
50 | 52 | ||
51 | void clear_Bookmarks (iBookmarks *); | 53 | void clear_Bookmarks (iBookmarks *); |
52 | void load_Bookmarks (iBookmarks *, const char *dirPath); | 54 | void load_Bookmarks (iBookmarks *, const char *dirPath); |
53 | void save_Bookmarks (const iBookmarks *, const char *dirPath); | 55 | void save_Bookmarks (const iBookmarks *, const char *dirPath); |
54 | 56 | ||
55 | void add_Bookmarks (iBookmarks *, const iString *url, const iString *title, const iString *tags, iChar icon); | 57 | void add_Bookmarks (iBookmarks *, const iString *url, const iString *title, |
56 | iBool remove_Bookmarks (iBookmarks *, uint32_t id); | 58 | const iString *tags, iChar icon); |
57 | iBookmark *get_Bookmarks (iBookmarks *, uint32_t id); | 59 | iBool remove_Bookmarks (iBookmarks *, uint32_t id); |
58 | uint32_t findUrl_Bookmarks (const iBookmarks *, const iString *url); /* O(n) */ | 60 | iBookmark * get_Bookmarks (iBookmarks *, uint32_t id); |
61 | uint32_t findUrl_Bookmarks (const iBookmarks *, const iString *url); /* O(n) */ | ||
59 | 62 | ||
60 | typedef iBool (*iBookmarksFilterFunc) (void *context, const iBookmark *); | 63 | typedef iBool (*iBookmarksFilterFunc) (void *context, const iBookmark *); |
61 | typedef int (*iBookmarksCompareFunc)(const iBookmark **, const iBookmark **); | 64 | typedef int (*iBookmarksCompareFunc)(const iBookmark **, const iBookmark **); |
@@ -75,3 +78,5 @@ iBool filterTagsRegExp_Bookmarks (void *regExp, const iBookmark *); | |||
75 | */ | 78 | */ |
76 | const iPtrArray *list_Bookmarks(const iBookmarks *, iBookmarksCompareFunc cmp, | 79 | const iPtrArray *list_Bookmarks(const iBookmarks *, iBookmarksCompareFunc cmp, |
77 | iBookmarksFilterFunc filter, void *context); | 80 | iBookmarksFilterFunc filter, void *context); |
81 | |||
82 | const iString * bookmarkListPage_Bookmarks (const iBookmarks *); | ||
diff --git a/src/gmrequest.c b/src/gmrequest.c index 1f922142..97634bd4 100644 --- a/src/gmrequest.c +++ b/src/gmrequest.c | |||
@@ -27,6 +27,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ | |||
27 | #include "app.h" /* dataDir_App() */ | 27 | #include "app.h" /* dataDir_App() */ |
28 | #include "mimehooks.h" | 28 | #include "mimehooks.h" |
29 | #include "feeds.h" | 29 | #include "feeds.h" |
30 | #include "bookmarks.h" | ||
30 | #include "ui/text.h" | 31 | #include "ui/text.h" |
31 | #include "embedded.h" | 32 | #include "embedded.h" |
32 | #include "defs.h" | 33 | #include "defs.h" |
@@ -298,6 +299,9 @@ static const iBlock *aboutPageSource_(iRangecc path) { | |||
298 | if (equalCase_Rangecc(path, "feeds")) { | 299 | if (equalCase_Rangecc(path, "feeds")) { |
299 | return utf8_String(entryListPage_Feeds()); | 300 | return utf8_String(entryListPage_Feeds()); |
300 | } | 301 | } |
302 | if (equalCase_Rangecc(path, "bookmarks")) { | ||
303 | return utf8_String(bookmarkListPage_Bookmarks(bookmarks_App())); | ||
304 | } | ||
301 | if (equalCase_Rangecc(path, "blank")) { | 305 | if (equalCase_Rangecc(path, "blank")) { |
302 | return utf8_String(collectNewCStr_String("\n")); | 306 | return utf8_String(collectNewCStr_String("\n")); |
303 | } | 307 | } |