From 611377152e5ad61b8acbfc51e9b5398d9425e345 Mon Sep 17 00:00:00 2001 From: Zixaphir Date: Tue, 12 Mar 2013 03:53:57 -0700 Subject: [PATCH] Start my quest to integrate 4chan-X V3 --- .gitattributes | 22 ++ .gitignore | 5 + 4chan_x.user.js | 26 +-- Gruntfile.coffee | 110 +++++++++ Gruntfile.js | 97 -------- src/config.coffee | 562 ++++++++++++++++++++++++++++++++++------------ 6 files changed, 566 insertions(+), 256 deletions(-) create mode 100644 .gitattributes create mode 100644 Gruntfile.coffee delete mode 100644 Gruntfile.js diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 000000000..67d83c596 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,22 @@ +# Auto detect text files and perform LF normalization +* text=auto + +# Custom for Visual Studio +*.cs diff=csharp +*.sln merge=union +*.csproj merge=union +*.vbproj merge=union +*.fsproj merge=union +*.dbproj merge=union + +# Standard to msysgit +*.doc diff=astextplain +*.DOC diff=astextplain +*.docx diff=astextplain +*.DOCX diff=astextplain +*.dot diff=astextplain +*.DOT diff=astextplain +*.pdf diff=astextplain +*.PDF diff=astextplain +*.rtf diff=astextplain +*.RTF diff=astextplain diff --git a/.gitignore b/.gitignore index 92b2c45a1..777eaf649 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,7 @@ node_modules/ tmp/ +4chan_x.user.js +Cakefile +script.coffee +*~ +*.db \ No newline at end of file diff --git a/4chan_x.user.js b/4chan_x.user.js index fb6c9d0a8..405870105 100644 --- a/4chan_x.user.js +++ b/4chan_x.user.js @@ -125,20 +125,20 @@ 'Expand from here': [true, 'Expand all images only from current position to thread end.'] }, filter: { - name: ['# Filter any namefags:', '#/^(?!Anonymous$)/'].join('\n'), - uniqueID: ['# Filter a specific ID:', '#/Txhvk1Tl/'].join('\n'), - tripcode: ['# Filter any tripfag', '#/^!/'].join('\n'), - capcode: ['# Set a custom class for mods:', '#/Mod$/;highlight:mod;op:yes', '# Set a custom class for moot:', '#/Admin$/;highlight:moot;op:yes'].join('\n'), - email: ['# Filter any e-mails that are not `sage` on /a/ and /jp/:', '#/^(?!sage$)/;boards:a,jp'].join('\n'), - subject: ['# Filter Generals on /v/:', '#/general/i;boards:v;op:only'].join('\n'), - comment: ['# Filter Stallman copypasta on /g/:', '#/what you\'re refer+ing to as linux/i;boards:g'].join('\n'), - flag: [''].join('\n'), - filename: [''].join('\n'), - dimensions: ['# Highlight potential wallpapers:', '#/1920x1080/;op:yes;highlight;top:no;boards:w,wg'].join('\n'), - filesize: [''].join('\n'), - MD5: [''].join('\n') + name: "# Filter any namefags:\n#/^(?!Anonymous$)/", + uniqueID: "# Filter a specific ID:\n#/Txhvk1Tl/", + tripcode: "# Filter any tripfag\n#/^!/", + capcode: "# Set a custom class for mods:\n#/Mod$/;highlight:mod;op:yes\n# Set a custom class for moot:\n#/Admin$/;highlight:moot;op:yes", + email: "# Filter any e-mails that are not `sage` on /a/ and /jp/:\n#/^(?!sage$)/;boards:a,jp", + subject: "# Filter Generals on /v/:\n#/general/i;boards:v;op:only", + comment: "# Filter Stallman copypasta on /g/:\n#/what you\'re refer+ing to as linux/i;boards:g", + flag: '', + filename: '', + dimensions: "# Highlight potential wallpapers:\n#/1920x1080/;op:yes;highlight;top:no;boards:w,wg", + filesize: '', + MD5: '' }, - sauces: ['http://iqdb.org/?url=%turl', 'http://www.google.com/searchbyimage?image_url=%turl', '#http://tineye.com/search?url=%turl', '#http://saucenao.com/search.php?db=999&url=%turl', '#http://3d.iqdb.org/?url=%turl', '#http://regex.info/exif.cgi?imgurl=%url', '# uploaders:', '#http://imgur.com/upload?url=%url;text:Upload to imgur', '#http://omploader.org/upload?url1=%url;text:Upload to omploader', '# "View Same" in archives:', '#//archive.foolz.us/_/search/image/%MD5/;text:View same on foolz', '#//archive.foolz.us/%board/search/image/%MD5/;text:View same on foolz /%board/', '#//archive.installgentoo.net/%board/image/%MD5;text:View same on installgentoo /%board/'].join('\n'), + sauces: "http://iqdb.org/?url=%turl\nhttp://www.google.com/searchbyimage?image_url=%turl\n#http://tineye.com/search?url=%turl\n#http://saucenao.com/search.php?db=999&url=%turl\n#http://3d.iqdb.org/?url=%turl\n#http://regex.info/exif.cgi?imgurl=%url\n# uploaders:\n#http://imgur.com/upload?url=%url;text:Upload to imgur\n#http://omploader.org/upload?url1=%url;text:Upload to omploader\n# \"View Same\" in archives:\n#//archive.foolz.us/_/search/image/%MD5/;text:View same on foolz\n#//archive.foolz.us/%board/search/image/%MD5/;text:View same on foolz /%board/\n#//archive.installgentoo.net/%board/image/%MD5;text:View same on installgentoo /%board/", time: '%m/%d/%y(%a)%H:%M:%S', backlink: '>>%id', fileInfo: '%l (%p%s, %r)', diff --git a/Gruntfile.coffee b/Gruntfile.coffee new file mode 100644 index 000000000..396f6f0c0 --- /dev/null +++ b/Gruntfile.coffee @@ -0,0 +1,110 @@ +module.exports = (grunt) -> + + pkg = grunt.file.readJSON 'package.json' + + # Project configuration. + grunt.initConfig + pkg: pkg + concat: + coffee: + options: + process: + data: pkg + src: [ + 'src/config.coffee' + 'src/globals.coffee' + 'lib/ui.coffee' + 'lib/$.coffee' + 'lib/polyfill.coffee' + 'src/features.coffee' + 'src/qr.coffee' + 'src/report.coffee' + 'src/main.coffee' + ] + dest: 'tmp/script.coffee' + + script: + options: + process: + data: pkg + src: [ + 'src/metadata.js' + 'src/banner.js' + 'tmp/script.js' + ] + dest: '<%= pkg.meta.files.userjs %>' + + metadata: + options: + process: + data: pkg + src: 'src/metadata.js', + dest: '<%= pkg.meta.files.metajs %>' + + coffee: + script: + src: 'tmp/script.coffee' + dest: 'tmp/script.js' + + exec: + commit: + command: -> + release = "#{pkg.meta.name} v#{pkg.version}" + return [ + "git checkout #{pkg.meta.mainBranch}" + "git commit -am 'Release #{release}.'" + "git tag -a #{pkg.version} -m '#{release}.'" + "git tag -af stable -m '#{release}.'" + ].join(' && '); + stdout: true + + push: + command: 'git push origin --all && git push origin --tags' + stdout: true + + watch: + all: + options: + interrupt: true + files: [ + 'Gruntfile.js' + 'package.json' + 'lib/**/*.coffee' + 'src/**/*.coffee' + 'src/**/*.js' + 'css/**/*.css' + 'img/*' + ] + tasks: 'default' + + clean: + tmp: 'tmp' + + grunt.loadNpmTasks 'grunt-bump' + grunt.loadNpmTasks 'grunt-contrib-clean' + grunt.loadNpmTasks 'grunt-contrib-coffee' + grunt.loadNpmTasks 'grunt-contrib-concat' + grunt.loadNpmTasks 'grunt-contrib-watch' + grunt.loadNpmTasks 'grunt-exec' + + grunt.registerTask 'default', [ + 'concat:coffee' + 'coffee:script' + 'concat:script' + 'concat:metadata' + 'clean' + ] + + grunt.registerTask 'release', [ + 'default' + 'exec:commit' + 'exec:push' + ] + + grunt.registerTask 'patch', [ + 'bump' + ] + + grunt.registerTask 'upgrade', [ + 'bump:minor' + ] diff --git a/Gruntfile.js b/Gruntfile.js deleted file mode 100644 index cdde902a2..000000000 --- a/Gruntfile.js +++ /dev/null @@ -1,97 +0,0 @@ -module.exports = function(grunt) { - - var pkg = grunt.file.readJSON('package.json'); - - // Project configuration. - grunt.initConfig({ - pkg: pkg, - concat: { - coffee: { - options: { process: { data: pkg } }, - src: [ - 'src/config.coffee', - 'src/globals.coffee', - 'lib/ui.coffee', - 'lib/$.coffee', - 'lib/polyfill.coffee', - 'src/features.coffee', - 'src/qr.coffee', - 'src/report.coffee', - 'src/main.coffee' - ], - dest: 'tmp/script.coffee' - }, - script: { - options: { process: { data: pkg } }, - src: [ - 'src/metadata.js', - 'src/banner.js', - 'tmp/script.js' - ], - dest: '<%= pkg.meta.files.userjs %>' - }, - metadata: { - options: { process: { data: pkg } }, - src: 'src/metadata.js', - dest: '<%= pkg.meta.files.metajs %>' - } - }, - coffee: { - script: { - src: 'tmp/script.coffee', - dest: 'tmp/script.js' - } - }, - exec: { - commit: { - command: function() { - var release = pkg.meta.name + ' v' + pkg.version; - return [ - 'git checkout ' + pkg.meta.mainBranch, - 'git commit -am "Release ' + release + '."', - 'git tag -a ' + pkg.version + ' -m "' + release + '."', - 'git tag -af stable -m "' + release + '."' - ].join(' && '); - }, - stdout: true - }, - push: { - command: 'git push origin --all && git push origin --tags', - stdout: true - } - }, - watch: { - all: { - options: { - interrupt: true - }, - files: [ - 'Gruntfile.js', - 'package.json', - 'lib/**/*.coffee', - 'src/**/*.coffee', - 'src/**/*.js', - 'css/**/*.css', - 'img/*' - ], - tasks: 'default' - } - }, - clean: { - tmp: 'tmp' - } - }); - - grunt.loadNpmTasks('grunt-bump'); - grunt.loadNpmTasks('grunt-contrib-clean'); - grunt.loadNpmTasks('grunt-contrib-coffee'); - grunt.loadNpmTasks('grunt-contrib-concat'); - grunt.loadNpmTasks('grunt-contrib-watch'); - grunt.loadNpmTasks('grunt-exec'); - - grunt.registerTask('default', ['concat:coffee', 'coffee:script', 'concat:script', 'concat:metadata', 'clean']); - grunt.registerTask('release', ['default', 'exec:commit', 'exec:push']); - grunt.registerTask('patch', ['bump']); - grunt.registerTask('upgrade', ['bump:minor']); - -}; diff --git a/src/config.coffee b/src/config.coffee index 62060df04..c63db17df 100644 --- a/src/config.coffee +++ b/src/config.coffee @@ -1,172 +1,442 @@ Config = main: 'Miscellaneous': - 'Enable 4chan\'s Extension': [false, 'Compatibility between <%= meta.name %> and 4chan\'s inline extension is NOT guaranteed.'] - '404 Redirect': [true, 'Redirect dead threads and images.'] - 'Keybinds': [true, 'Bind actions to keyboard shortcuts.'] - 'Time Formatting': [true, 'Localize and format timestamps arbitrarily.'] - 'Relative Post Dates': [false, 'Display dates like "3 minutes ago". Tooltip shows the timestamp.'] - 'File Info Formatting': [true, 'Reformat the file information.'] - 'Comment Expansion': [true, 'Can expand too long comments.'] - 'Thread Expansion': [true, 'Can expand threads to view all replies.'] - 'Index Navigation': [false, 'Navigate to previous / next thread.'] - 'Custom CSS': [false, 'Apply custom CSS to 4chan.'] - 'Check for Updates': [true, 'Check for updated versions of <%= meta.name %>.'] + 'Enable 4chan\'s Extension': [ + false + 'Compatibility between <%= meta.name %> and 4chan\'s inline extension is NOT guaranteed.' + ] + '404 Redirect': [ + true + 'Redirect dead threads and images.' + ] + 'Keybinds': [ + true + 'Bind actions to keyboard shortcuts.' + ] + 'Time Formatting': [ + true + 'Localize and format timestamps arbitrarily.' + ] + 'Relative Post Dates': [ + false + 'Display dates like "3 minutes ago". Tooltip shows the timestamp.' + ] + 'File Info Formatting': [ + true + 'Reformat the file information.' + ] + 'Comment Expansion': [ + true + 'Can expand too long comments.' + ] + 'Thread Expansion': [ + true + 'Can expand threads to view all replies.' + ] + 'Index Navigation': [ + false + 'Navigate to previous / next thread.' + ] + 'Custom CSS': [ + false + 'Apply custom CSS to 4chan.' + ] + 'Check for Updates': [ + true + 'Check for updated versions of <%= meta.name %>.' + ] + 'Filtering': - 'Anonymize': [false, 'Turn everyone Anonymous.'] - 'Filter': [true, 'Self-moderation placebo.'] - 'Recursive Hiding': [true, 'Hide replies of hidden posts, recursively.'] - 'Thread Hiding': [true, 'Hide entire threads.'] - 'Reply Hiding': [true, 'Hide single replies.'] - 'Hiding Buttons': [true, 'Make buttons to hide threads / replies, in addition to menu links.'] - 'Stubs': [true, 'Make stubs of hidden threads / replies.'] + 'Anonymize': [ + false + 'Turn everyone Anonymous.' + ] + 'Filter': [ + true + 'Self-moderation placebo.' + ] + 'Recursive Hiding': [ + true + 'Hide replies of hidden posts, recursively.' + ] + 'Thread Hiding': [ + true + 'Hide entire threads.' + ] + 'Reply Hiding': [ + true + 'Hide single replies.' + ] + 'Hiding Buttons': [ + true + 'Make buttons to hide threads / replies, in addition to menu links.' + ] + 'Stubs': [ + true + 'Make stubs of hidden threads / replies.' + ] + 'Images': - 'Auto-GIF': [false, 'Animate GIF thumbnails.'] - 'Image Expansion': [true, 'Expand images.'] - 'Image Hover': [false, 'Show full image on mouseover.'] - 'Sauce': [true, 'Add sauce links to images.'] - 'Reveal Spoilers': [false, 'Reveal spoiler thumbnails.'] + 'Auto-GIF': [ + false + 'Animate GIF thumbnails.' + ] + 'Image Expansion': [ + true + 'Expand images.' + ] + 'Image Hover': [ + false + 'Show full image on mouseover.' + ] + 'Sauce': [ + true + 'Add sauce links to images.' + ] + 'Reveal Spoilers': [ + false + 'Reveal spoiler thumbnails.' + ] + 'Menu': - 'Menu': [true, 'Add a drop-down menu in posts.'] - 'Report Link': [true, 'Add a report link to the menu.'] - 'Delete Link': [true, 'Add post and image deletion links to the menu.'] - 'Download Link': [true, 'Add a download with original filename link to the menu. Chrome-only currently.'] - 'Archive Link': [true, 'Add an archive link to the menu.'] + 'Menu': [ + true + 'Add a drop-down menu in posts.' + ] + 'Report Link': [ + true + 'Add a report link to the menu.' + ] + 'Delete Link': [ + true + 'Add post and image deletion links to the menu.' + ] + 'Download Link': [ + true + 'Add a download with original filename link to the menu. Chrome-only currently.' + ] + 'Archive Link': [ + true + 'Add an archive link to the menu.' + ] + 'Monitoring': - 'Thread Updater': [true, 'Fetch and insert new replies. Has more options in its own dialog.'] - 'Unread Count': [true, 'Show the unread posts count in the tab title.'] - 'Unread Tab Icon': [true, 'Show a different favicon when there are unread posts.'] - 'Thread Excerpt': [true, 'Show an excerpt of the thread in the tab title.'] - 'Thread Stats': [true, 'Display reply and image count.'] - 'Thread Watcher': [true, 'Bookmark threads.'] - 'Auto Watch': [true, 'Automatically watch threads you start.'] - 'Auto Watch Reply': [false, 'Automatically watch threads you reply to.'] + 'Thread Updater': [ + true + 'Fetch and insert new replies. Has more options in its own dialog.' + ] + 'Unread Count': [ + true + 'Show the unread posts count in the tab title.' + ] + 'Unread Tab Icon': [ + true + 'Show a different favicon when there are unread posts.' + ] + 'Thread Excerpt': [ + true + 'Show an excerpt of the thread in the tab title.' + ] + 'Thread Stats': [ + true + 'Display reply and image count.' + ] + 'Thread Watcher': [ + true + 'Bookmark threads.' + ] + 'Auto Watch': [ + true + 'Automatically watch threads you start.' + ] + 'Auto Watch Reply': [ + false + 'Automatically watch threads you reply to.' + ] + 'Posting': - 'Quick Reply': [true, 'All-in-one form to reply, create threads, automate dumping and more.'] - 'Persistent QR': [false, 'The Quick reply won\'t disappear after posting.'] - 'Auto Hide QR': [false, 'Automatically hide the quick reply when posting.'] - 'Remember Subject': [false, 'Remember the subject field, instead of resetting after posting.'] - 'Remember Spoiler': [false, 'Remember the spoiler state, instead of resetting after posting.'] - 'Hide Original Post Form': [true, 'Hide the normal post form.'] + 'Quick Reply': [ + true + 'All-in-one form to reply, create threads, automate dumping and more.' + ] + 'Persistent QR': [ + false + 'The Quick reply won\'t disappear after posting.' + ] + 'Auto Hide QR': [ + false + 'Automatically hide the quick reply when posting.' + ] + 'Remember Subject': [ + false + 'Remember the subject field, instead of resetting after posting.' + ] + 'Remember Spoiler': [ + false + 'Remember the spoiler state, instead of resetting after posting.' + ] + 'Hide Original Post Form': [ + true + 'Hide the normal post form.' + ] + 'Quote links': - 'Quote Backlinks': [true, 'Add quote backlinks.'] - 'OP Backlinks': [false, 'Add backlinks to the OP.'] - 'Quote Inlining': [true, 'Inline quoted post on click.'] - 'Forward Hiding': [true, 'Hide original posts of inlined backlinks.'] - 'Quote Previewing': [true, 'Show quoted post on hover.'] - 'Quote Highlighting': [true, 'Highlight the previewed post.'] - 'Resurrect Quotes': [true, 'Link dead quotes to the archives.'] - 'Mark Quotes of You': [true, 'Add \'(You)\' to quotes linking to your posts.'] - 'Mark OP Quotes': [true, 'Add \'(OP)\' to OP quotes.'] - 'Mark Cross-thread Quotes': [true, 'Add \'(Cross-thread)\' to cross-threads quotes.'] + 'Quote Backlinks': [ + true + 'Add quote backlinks.' + ] + 'OP Backlinks': [ + false + 'Add backlinks to the OP.' + ] + 'Quote Inlining': [ + true + 'Inline quoted post on click.' + ] + 'Forward Hiding': [ + true + 'Hide original posts of inlined backlinks.' + ] + 'Quote Previewing': [ + true + 'Show quoted post on hover.' + ] + 'Quote Highlighting': [ + true + 'Highlight the previewed post.' + ] + 'Resurrect Quotes': [ + true + 'Link dead quotes to the archives.' + ] + 'Mark Quotes of You': [ + true + 'Add \'(You)\' to quotes linking to your posts.' + ] + 'Mark OP Quotes': [ + true + 'Add \'(OP)\' to OP quotes.' + ] + 'Mark Cross-thread Quotes': [ + true + 'Add \'(Cross-thread)\' to cross-threads quotes.' + ] + imageExpansion: - 'Fit width': [true, ''] - 'Fit height': [false, ''] - 'Expand spoilers': [true, 'Expand all images along with spoilers.'] - 'Expand from here': [true, 'Expand all images only from current position to thread end.'] + 'Fit width': [ + true + '' + ] + 'Fit height': [ + false + '' + ] + 'Expand spoilers': [ + true + 'Expand all images along with spoilers.' + ] + 'Expand from here': [ + true + 'Expand all images only from current position to thread end.' + ] + filter: - name: [ - '# Filter any namefags:' - '#/^(?!Anonymous$)/' - ].join '\n' - uniqueID: [ - '# Filter a specific ID:' - '#/Txhvk1Tl/' - ].join '\n' - tripcode: [ - '# Filter any tripfag' - '#/^!/' - ].join '\n' - capcode: [ - '# Set a custom class for mods:' - '#/Mod$/;highlight:mod;op:yes' - '# Set a custom class for moot:' - '#/Admin$/;highlight:moot;op:yes' - ].join '\n' - email: [ - '# Filter any e-mails that are not `sage` on /a/ and /jp/:' - '#/^(?!sage$)/;boards:a,jp' - ].join '\n' - subject: [ - '# Filter Generals on /v/:' - '#/general/i;boards:v;op:only' - ].join '\n' - comment: [ - '# Filter Stallman copypasta on /g/:' - '#/what you\'re refer+ing to as linux/i;boards:g' - ].join '\n' - flag: [ - '' - ].join '\n' - filename: [ - '' - ].join '\n' - dimensions: [ - '# Highlight potential wallpapers:' - '#/1920x1080/;op:yes;highlight;top:no;boards:w,wg' - ].join '\n' - filesize: [ - '' - ].join '\n' - MD5: [ - '' - ].join '\n' - sauces: [ - 'http://iqdb.org/?url=%turl' - 'http://www.google.com/searchbyimage?image_url=%turl' - '#http://tineye.com/search?url=%turl' - '#http://saucenao.com/search.php?db=999&url=%turl' - '#http://3d.iqdb.org/?url=%turl' - '#http://regex.info/exif.cgi?imgurl=%url' - '# uploaders:' - '#http://imgur.com/upload?url=%url;text:Upload to imgur' - '#http://omploader.org/upload?url1=%url;text:Upload to omploader' - '# "View Same" in archives:' - '#//archive.foolz.us/_/search/image/%MD5/;text:View same on foolz' - '#//archive.foolz.us/%board/search/image/%MD5/;text:View same on foolz /%board/' - '#//archive.installgentoo.net/%board/image/%MD5;text:View same on installgentoo /%board/' - ].join '\n' + name: """ +# Filter any namefags: +#/^(?!Anonymous$)/ +""" + + uniqueID: """ +# Filter a specific ID: +#/Txhvk1Tl/ +""" + + tripcode: """ +# Filter any tripfag +#/^!/ +""" + + capcode: """ +# Set a custom class for mods: +#/Mod$/;highlight:mod;op:yes +# Set a custom class for moot: +#/Admin$/;highlight:moot;op:yes +""" + + email: """ +# Filter any e-mails that are not `sage` on /a/ and /jp/: +#/^(?!sage$)/;boards:a,jp +""" + subject: """ +# Filter Generals on /v/: +#/general/i;boards:v;op:only +""" + + comment: """ +# Filter Stallman copypasta on /g/: +#/what you\'re refer+ing to as linux/i;boards:g +""" + + flag: '' + filename: '' + dimensions: """ +# Highlight potential wallpapers: +#/1920x1080/;op:yes;highlight;top:no;boards:w,wg +""" + + filesize: '' + + MD5: '' + + sauces: """ +http://iqdb.org/?url=%turl +http://www.google.com/searchbyimage?image_url=%turl +#http://tineye.com/search?url=%turl +#http://saucenao.com/search.php?db=999&url=%turl +#http://3d.iqdb.org/?url=%turl +#http://regex.info/exif.cgi?imgurl=%url +# uploaders: +#http://imgur.com/upload?url=%url;text:Upload to imgur +#http://omploader.org/upload?url1=%url;text:Upload to omploader +# "View Same" in archives: +#//archive.foolz.us/_/search/image/%MD5/;text:View same on foolz +#//archive.foolz.us/%board/search/image/%MD5/;text:View same on foolz /%board/ +#//archive.installgentoo.net/%board/image/%MD5;text:View same on installgentoo /%board/ +""" + time: '%m/%d/%y(%a)%H:%M:%S' + backlink: '>>%id' + fileInfo: '%l (%p%s, %r)' + favicon: 'ferongr' + usercss: '' + hotkeys: # QR & Options - 'Open empty QR': ['q', 'Open QR without post number inserted.'] - 'Open QR': ['Shift+q', 'Open QR with post number inserted.'] - 'Open settings': ['Alt+o', 'Open Settings.'] - 'Close': ['Esc', 'Close Settings, Notifications or QR.'] - 'Spoiler tags': ['Ctrl+s', 'Insert spoiler tags.'] - 'Code tags': ['Alt+c', 'Insert code tags.'] - 'Math tags': ['Alt+m', 'Insert math tags.'] - 'Submit QR': ['Alt+s', 'Submit post.'] + 'Open empty QR': [ + 'q' + 'Open QR without post number inserted.' + ] + 'Open QR': [ + 'Shift+q' + 'Open QR with post number inserted.' + ] + 'Open settings': [ + 'Alt+o' + 'Open Settings.' + ] + 'Close': [ + 'Esc' + 'Close Settings, Notifications or QR.' + ] + 'Spoiler tags': [ + 'Ctrl+s' + 'Insert spoiler tags.' + ] + 'Code tags': [ + 'Alt+c' + 'Insert code tags.' + ] + 'Math tags': [ + 'Alt+m' + 'Insert math tags.' + ] + 'Submit QR': [ + 'Alt+s' + 'Submit post.' + ] # Thread related - 'Watch': ['w', 'Watch thread.'] - 'Update': ['r', 'Update the thread now.'] + 'Watch': [ + 'w' + 'Watch thread.' + ] + 'Update': [ + 'r' + 'Update the thread now.' + ] # Images - 'Expand image': ['Shift+e', 'Expand selected image.'] - 'Expand images': ['e', 'Expand all images.'] + 'Expand image': [ + 'Shift+e' + 'Expand selected image.' + ] + 'Expand images': [ + 'e' + 'Expand all images.' + ] # Board Navigation - 'Front page': ['0', 'Jump to page 0.'] - 'Open front page': ['Shift+0', 'Open page 0 in a new tab.'] - 'Next page': ['Right', 'Jump to the next page.'] - 'Previous page': ['Left', 'Jump to the previous page.'] + 'Front page': [ + '0' + 'Jump to page 0.' + ] + 'Open front page': [ + 'Shift+0' + 'Open page 0 in a new tab.' + ] + 'Next page': [ + 'Right' + 'Jump to the next page.' + ] + 'Previous page': [ + 'Left' + 'Jump to the previous page.' + ] # Thread Navigation - 'Next thread': ['Down', 'See next thread.'] - 'Previous thread': ['Up', 'See previous thread.'] - 'Expand thread': ['Ctrl+e', 'Expand thread.'] - 'Open thread': ['o', 'Open thread in current tab.'] - 'Open thread tab': ['Shift+o', 'Open thread in new tab.'] + 'Next thread': [ + 'Down' + 'See next thread.' + ] + 'Previous thread': [ + 'Up' + 'See previous thread.' + ] + 'Expand thread': [ + 'Ctrl+e' + 'Expand thread.' + ] + 'Open thread': [ + 'o' + 'Open thread in current tab.' + ] + 'Open thread tab': [ + 'Shift+o' + 'Open thread in new tab.' + ] # Reply Navigation - 'Next reply': ['j', 'Select next reply.'] - 'Previous reply': ['k', 'Select previous reply.'] - 'Hide': ['x', 'Hide thread.'] + 'Next reply': [ + 'j' + 'Select next reply.' + ] + 'Previous reply': [ + 'k' + 'Select previous reply.' + ] + 'Hide': [ + 'x' + 'Hide thread.' + ] updater: checkbox: - 'Beep': [false, 'Beep on new post to completely read thread.'] - 'Auto Scroll': [false, 'Scroll updated posts into view. Only enabled at bottom of page.'] - 'Bottom Scroll': [false, 'Always scroll to the bottom, not the first new post. Useful for event threads.'] - 'Scroll BG': [false, 'Auto-scroll background tabs.'] - 'Auto Update': [true, 'Automatically fetch new posts.'] + 'Beep': [ + false + 'Beep on new post to completely read thread.' + ] + 'Auto Scroll': [ + false + 'Scroll updated posts into view. Only enabled at bottom of page.' + ] + 'Bottom Scroll': [ + false + 'Always scroll to the bottom, not the first new post. Useful for event threads.' + ] + 'Scroll BG': [ + false + 'Auto-scroll background tabs.' + ] + 'Auto Update': [ + true + 'Automatically fetch new posts.' + ] 'Interval': 30