├── .gitignore ├── LICENSE.txt ├── PRIVACY.md ├── README.md ├── RELEASE_PROCESS.md ├── ao3rdr.crx ├── ao3rdr.xpi ├── build-chrome.sh ├── build-firefox.sh ├── build-opera.sh ├── crxmake.sh ├── data ├── README.txt ├── images │ ├── all-dislike.svg │ ├── all-dislike2.svg │ ├── all-star.svg │ ├── all-star2.svg │ ├── all-star3.svg │ ├── bookmark-fill.svg │ ├── bookmark.svg │ ├── bug.svg │ ├── close.svg │ ├── cloud-offline.svg │ ├── cloud-ok.svg │ ├── cloud-sync.svg │ ├── delete-fill.png │ ├── delete-fill.svg │ ├── delete.png │ ├── delete.svg │ ├── dislike-fill.svg │ ├── dislike.svg │ ├── face_3.svg │ ├── flag.svg │ ├── hidden.svg │ ├── icon.png │ ├── icon.svg │ ├── icon_128.png │ ├── icon_16.png │ ├── icon_48.png │ ├── icon_64.png │ ├── menu.svg │ ├── read.svg │ ├── star-0.svg │ ├── star-1-fill.svg │ ├── star-1.svg │ ├── star-3-fill.svg │ ├── star-3.svg │ ├── star-5-fill.svg │ ├── star-5.svg │ ├── sync.svg │ └── unread.svg ├── settings │ ├── articles-table-chrome.js │ ├── articles-table-content.js │ ├── articles-table-lib.js │ ├── articles-table.js │ ├── credits.html │ ├── css │ │ ├── custom.css │ │ ├── normalize.css │ │ └── skeleton.css │ ├── index-chrome.html │ ├── index.html │ ├── jquery.tagsinput.css │ ├── jquery.tagsinput.js │ ├── popup.html │ └── popup.js └── style.css ├── lib ├── DataTables-1.10.7 │ ├── license.txt │ ├── media │ │ ├── css │ │ │ └── jquery.dataTables.css │ │ ├── images │ │ │ ├── Sorting icons.psd │ │ │ ├── favicon.ico │ │ │ ├── sort_asc.png │ │ │ ├── sort_asc_disabled.png │ │ │ ├── sort_both.png │ │ │ ├── sort_desc.png │ │ │ └── sort_desc_disabled.png │ │ └── js │ │ │ └── jquery.dataTables.js │ └── plugins │ │ └── alt-string.js ├── anime.min.js ├── ddSlick.js ├── html2dom.js ├── jquery-3.3.1.min.js └── spin.js ├── manifest.json-chrome ├── manifest.json-firefox ├── manifest.json-opera ├── src ├── ao3lib.js ├── article.js ├── background-chrome.js ├── background.js ├── contentscript.js ├── images.js ├── toolbar-ao3.js ├── toolbar-chrome.js └── toolbar-content.js ├── test.html └── test ├── qunitsrc ├── qunit-2.0.1.css └── qunit-2.0.1.js ├── test-main.js ├── test ├── ao3lib_tests.js ├── article_tests.js ├── toolbar-ao3_tests.js └── toolbar-content_tests.js └── tests.html /.gitignore: -------------------------------------------------------------------------------- 1 | *~ 2 | build/ 3 | manifest.json 4 | node_modules/ 5 | *.xpi 6 | watch.sh 7 | -------------------------------------------------------------------------------- /PRIVACY.md: -------------------------------------------------------------------------------- 1 | # PRIVACY NOTICE 2 | 3 | Last updated 2022-09-10 4 | 5 | This privacy notice for ao3rdr ("we", "us", "our", "I", "extension") describes how, why, and what we might collect, 6 | store, or use ("process") your information when you use our services ("Services"), such as when you: 7 | 8 | - Install and use our extension 9 | - Visit our website 10 | 11 | Questions or concerns? 12 | Reading this privacy notice will help you understand your privacy rights and choices. If you do not agree with our policies and practices, please do not use our Services. If you still have any questions or concerns, please contact us at privacy@ao3rdr.com 13 | 14 | ## Key Points 15 | 16 | ### What information do we collect? 17 | We collect information that you voluntarily provide to us when you contact us, and when you participate in activities on the Services. 18 | 19 | **Sensitive Information** We do not process sensitive information 20 | 21 | **Application Data** If you use our application(s), we may collect the following information: 22 | 23 | - *device data* We automatically collect device information, user agent, operating system, version information, browser type and version, Internet service provider and/or mobile carrier, and Internet Protocol (IP) address (or proxy server). 24 | - *Log and Usage Data* Log and usage data is service-related, diagnostic, usage, and performance information our servers automatically collect when you access or use our Services and which we record in log files. This log data may indluce your IP address, device information, browser type, and settings and information about your activity in the Services (such as the date/time stamps associated with your usage, pages and files viewed, and other actions you take such as which features you use). 25 | 26 | This information is primarily needed to maintain the security and operation of our application(s) you accessed. 27 | 28 | ### How do we process your information? 29 | 30 | We process your information to provide, improve, and administer our Services, communicate with you, for security and fraud prevention, and to comply with law. We may also process your information for other purposes with your consent. 31 | 32 | ### Do we use cookies and other tracking technologies? 33 | We may use cookies and similar tracking technologies to access or store information. 34 | 35 | ### How long do we keep your information? 36 | We keep your information for as long as necessary to fulfill the purposes outlined in this privacy notice unless otherwise required by law. 37 | 38 | ### How do we keep your information safe? 39 | We have implemented appropriate security measures designed to protect the security of any personal information we process. However, despite our safeguards and efforts to secure your information, no electronic transmission over the Internet or information storage technology can be guaranteed to be 100% secure, so we cannot promise or guarantee that hackers, cybercriminals, or other unauthorized 3rd parties will not be able to defeat our security and improperly collect, assess, steal, or modify your information. We will do our best to protect your personal information, transmission of personal information to and from our Services is at your own risk. 40 | 41 | ### What are your privacy rights? 42 | In some regions (like the EEA, UK, Canada, and California you have certain rights under applicable data protection laws. For example (i) request a copy of your personal information, (ii) request rectification or erasure, (iii) restrict processing of your personal information, and (iv) if applicable, to data portability. 43 | 44 | You can make a request by emailing data@ao3rdr.com 45 | 46 | Upon receiving your request, we will need to verify your identity to determine you are the same person about whom we have the information in our system. These verification efforts require us to ask you to provide information so that we can match it with information you have previously provided us. We may also use other verification methods as the circumstances dictate. We will only use personal information provided in your request to verify your identity or authority to make the request and communicate with you. If we cannot verify your identity from the information already maintained by us, we may request you provide additional information for identity verification, security, or fraud prevention purposes. 47 | 48 | ### Will your information be shared with anyone else? 49 | We may use your personal information for our own business purposes, such as internal research for technological development and demonstration. This is not considered to be "selling" of your personal information. 50 | 51 | ao3rdr has not disclosed or sold any personal information to third parties for a business or commercial purpose in the preceding twelve (12) months. We will not sell personal information in the future belonging to website visitors, users, and other consumers. 52 | 53 | ### Do we make updates to this notice? 54 | We may update this privacy notice from time to time. The update version will be indicated by and updated "Revised" date and the updated version will be effective as soon as it is accessible. If we make material changes to this privacy notice, we may notify you by prominently posting a notice of such changes. We encourage you to review this privacy notice frequently to be informed of how we are protecting your information. 55 | 56 | ### How can you contact us about this notice? 57 | Email us at privacy@ao3rdr.com 58 | 59 | ### How can your review, update, or delete the data we collect from you? 60 | Email us at privacy@ao3rdr.com 61 | 62 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | DK's Unofficial Reader Manager - AO3rdr 2 | ============================ 3 | 4 | A bookmark manager for reading on Archive of Our Own (http://archiveofourown.org). Please note that this is just made by me for fun, I am not affiliated with the Archive. 5 | 6 | Features include: 7 | - Three star rating system 8 | - Hide works 9 | - Blacklist by tags 10 | - Bookmark by chapter read 11 | - Keep track of last visit 12 | - Backup and restore user data 13 | - Cloud Sync for multiple browsers 14 | - Open source 15 | 16 | Where to get it 17 | --------------- 18 | 19 | ### Chrome 20 | 21 | Available from the Google Chrome webstore https://chrome.google.com/webstore/detail/ao3rdr/hbbcholilmaipbhjbcohpleofolpdnjl 22 | 23 | ### Firefox 24 | 25 | Latest testing version is available from https://github.com/darthkrallt/AO3rdr/blob/master/ao3rdr.xpi 26 | 27 | Available from the Mozilla Addon site: 28 | * Desktop https://addons.mozilla.org/En-us/firefox/addon/ao3rdr/ 29 | * Android https://addons.mozilla.org/en-us/android/addon/ao3rdr/ 30 | 31 | This is to be developed with both mobile and desktop use in mind, so no SDK's 32 | were used that are not available on Firefox's beta mobile browser. 33 | 34 | ### Opera 35 | 36 | Waiting for approval process. 37 | 38 | 39 | Credits 40 | ------- 41 | - Skeleton: getskeleton.com 42 | Easy CSS and layout bones for settings page 43 | - The Noun Project: thenounproject.com 44 | Icons (see the README in the data folder for more comprehensive list) 45 | - Tablesorter: tablesorter.com 46 | Sortable table 47 | - XOXCO's Tag Input plugin: xoxco.com/projects/code/tagsinput/ 48 | Fancy tag input 49 | - Spin.js: http://fgnass.github.io/spin.js/ 50 | Spinner grapic 51 | - html2dom: https://github.com/freddyb/html2dom 52 | Replacing calls to inner HTML to comply with Mozilla security requirements 53 | - Chrome build Script: 54 | https://developer.chrome.com/extensions/crx 55 | - qUnit: https://qunitjs.com 56 | jQuery testing suite 57 | 58 | Modifications to 3rd Party Libraries 59 | ------- 60 | - spin.js, line 28, hard coded create element type 61 | - jquery.dataTables.js, lines 1499, 1694, 3099, 3947, changed call from inner HTML to html2dom 62 | https://blog.mozilla.org/security/2013/09/24/introducing-html2dom-an-alternative-to-setting-innerhtml/ 63 | - jquery.dataTables.js, line 1688, hard coded create element type 64 | - Chrome build Script: Added a comment of the source URl. 65 | 66 | Bugs 67 | ---- 68 | - Check the [Github Issues](https://github.com/darthkrallt/AO3rdr/issues?q=is%3Aissue+is%3Aopen+label%3Abug) 69 | - Please report any others you find! 70 | 71 | Upcoming Features 72 | ------------------------------- 73 | - See the [Github Issues - Enhancements](https://github.com/darthkrallt/AO3rdr/issues?q=is%3Aissue+is%3Aopen+label%3Aenhancement) for the list of planned future features 74 | 75 | How to Build 76 | --------------- 77 | 78 | ### Chrome 79 | 80 | ``` 81 | ./build-chrome.sh # Then use "load unpacked extension" 82 | # to import the build/ao3rdr folder into chrome 83 | ``` 84 | 85 | ### Firefox 86 | 87 | - JPM, current release `jpm run` 88 | - (WebExtensions, NOT RELEASED) `build-firefox.sh # Must manually load into FF` 89 | 90 | ### Opera 91 | - See 'Chrome' 92 | 93 | How to Release 94 | --------------- 95 | See RELEASE_PROCESS.md 96 | 97 | License 98 | ------- 99 | Copyright (C) 2015 Darthkrallt 100 | 101 | This library is free software; you can redistribute it and/or 102 | modify it under the terms of the GNU Lesser General Public 103 | License as published by the Free Software Foundation; either 104 | version 2.1 of the License, or (at your option) any later version. 105 | 106 | This library is distributed in the hope that it will be useful, 107 | but WITHOUT ANY WARRANTY; without even the implied warranty of 108 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 109 | Lesser General Public License for more details. 110 | 111 | You should have received a copy of the GNU Lesser General Public 112 | License along with this library; if not, write to the Free Software 113 | Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 114 | USA 115 | -------------------------------------------------------------------------------- /RELEASE_PROCESS.md: -------------------------------------------------------------------------------- 1 | # Release Countdown Checklist! 2 | 3 | Alright, you've fixed some bugs, added some features, and are ready to release into the wild! What are the things you need to remember? 4 | 5 | We are supporting _three_ platforms, so let's have a rundown for each. 6 | 7 | ### Prepare for release: 8 | 9 | - [ ] Ensure new version number (eg, 1.X.0) 10 | Update in: 11 | - [ ] manifest.json-chrome 12 | - [ ] manifest.json-firefox 13 | - [ ] manifest.json-opera 14 | - [ ] Check for dependencies to AO3rdr-backend. Deploy if necessary. 15 | 16 | ### Automated Tests: 17 | 18 | - [ ] Check test results of AO3rdr/test/tests.html on: 19 | - [ ] Chrome 20 | - [ ] Firefox 21 | - [ ] Opera 22 | 23 | ### Manual QA tests: 24 | Run on EACH BROWSER. 25 | 26 | - [ ] Add bookmarks via: 27 | - [ ] Works page http://archiveofourown.org/works 28 | - [ ] Bookmarks page http://archiveofourown.org/users/USER/bookmarks 29 | - [ ] Article page (pick one from works page) 30 | - [ ] Delete bookmark from extension page 31 | - [ ] Download backup 32 | - [ ] Upload Backup 33 | - [ ] Run sync 34 | - [ ] Check blacklisting works 35 | - [ ] Toggle blackilsting on/off 36 | 37 | 38 | ### Build: 39 | 40 | - [ ] ./build-chrome.sh # you will use the unpacked generated folder build/ao3rdr for Chrome 41 | - [ ] ./build-opera.sh # you will use the generated crx file 42 | - [ ] ./build-firefox-jpm.sh # Firefox version 43 | 44 | ### Uploading A new version: 45 | 46 | - [ ] Firefox: https://addons.mozilla.org/en-US/firefox 47 | Expected wait time: Days to weeks depending on queue length. 48 | Be sure to keep an eye on email in case of rejection 49 | - [ ] Chrome: https://chrome.google.com/webstore/developer/dashboard 50 | Expected wait time: < 1 hour 51 | - [ ] Opera: https://addons.opera.com/developer/ 52 | Expected wait time is ??? 53 | 54 | ### What to do if rejected? 55 | 56 | - [ ] Address the bug. No ifs ands or buts. Their word is final. Only ask for clarification if you don't understand what they mean. 57 | - [ ] INCREMENT MINOR VERSION NUMBER (eg, 1.2.X). Failing to do so is an auto-reject. -------------------------------------------------------------------------------- /ao3rdr.crx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/darthkrallt/AO3rdr/d5fc8b879bbb7bfd5985a34b48a45ad9220947b6/ao3rdr.crx -------------------------------------------------------------------------------- /ao3rdr.xpi: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/darthkrallt/AO3rdr/d5fc8b879bbb7bfd5985a34b48a45ad9220947b6/ao3rdr.xpi -------------------------------------------------------------------------------- /build-chrome.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | opera_flag='' 3 | while getopts 'o' flag; do 4 | case "${flag}" in 5 | o) opera_flag='true' ;; 6 | *) error "Unexpected option ${flag}" ;; 7 | esac 8 | done 9 | 10 | MANIFEST_FILE='manifest.json-chrome' 11 | if [ $opera_flag ];then 12 | MANIFEST_FILE='manifest.json-opera' 13 | fi 14 | 15 | 16 | # Copy the files 17 | rm -r build 18 | mkdir build 19 | mkdir build/ao3rdr 20 | 21 | cp -r data build/ao3rdr/ 22 | cp -r lib build/ao3rdr/ 23 | cp -r src build/ao3rdr/ 24 | 25 | cp $MANIFEST_FILE build/ao3rdr/manifest.json 26 | cp README.md build/ao3rdr/ 27 | cp LICENSE.txt build/ao3rdr/ 28 | 29 | # File modification 30 | # index.html 31 | index_file='build/ao3rdr/data/settings/index.html' 32 | insert_file='build/ao3rdr/data/settings/index-chrome.html' 33 | 34 | sed "s/<\!-- WebExtensions insert -->/$(sed -e 's/[\&/]/\\&/g' -e 's/$/\\n/' $insert_file | tr -d '\n')/" $index_file > $index_file'-out' 35 | mv $index_file'-out' $index_file 36 | # finished with index.html 37 | 38 | ./crxmake.sh ./build/ao3rdr ~/.ssh/AO3rdr.pem 39 | -------------------------------------------------------------------------------- /build-firefox.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | # Copy the files 4 | rm -r build 5 | mkdir build 6 | 7 | cp -r data build/ 8 | cp -r lib build/ 9 | cp -r src build/ 10 | 11 | cp manifest.json-firefox build/manifest.json 12 | cp LICENSE.txt build/ 13 | cp README.md build/ 14 | 15 | # File modification 16 | # index.html 17 | index_file='build/data/settings/index.html' 18 | insert_file='build/data/settings/index-chrome.html' 19 | 20 | sed "s/<\!-- WebExtensions insert -->/$(sed -e 's/[\&/]/\\&/g' -e 's/$/\\n/' $insert_file | tr -d '\n')/" $index_file > $index_file'-out' 21 | mv $index_file'-out' $index_file 22 | # finished with index.html 23 | 24 | # Build the firefox add on 25 | cd build; zip -r ../ao3rdr.xpi * 26 | -------------------------------------------------------------------------------- /build-opera.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | # Let's be real here, it's just a chrome extension 4 | # use the -o flag to use opera manifest in build-chrome.sh 5 | ./build-chrome.sh -o 6 | 7 | # why is this file here at all? 8 | # because I want it to be. SO THERE. -------------------------------------------------------------------------------- /crxmake.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash -e 2 | # 3 | # Purpose: Pack a Chromium extension directory into crx format 4 | # Source: https://developer.chrome.com/extensions/crx 5 | 6 | if test $# -ne 2; then 7 | echo "Usage: crxmake.sh " 8 | exit 1 9 | fi 10 | 11 | dir=$1 12 | key=$2 13 | name=$(basename "$dir") 14 | crx="$name.crx" 15 | pub="$name.pub" 16 | sig="$name.sig" 17 | zip="$name.zip" 18 | trap 'rm -f "$pub" "$sig" "$zip"' EXIT 19 | 20 | # zip up the crx dir 21 | cwd=$(pwd -P) 22 | (cd "$dir" && zip -qr -9 -X "$cwd/$zip" .) 23 | 24 | # signature 25 | openssl sha1 -sha1 -binary -sign "$key" < "$zip" > "$sig" 26 | 27 | # public key 28 | openssl rsa -pubout -outform DER < "$key" > "$pub" 2>/dev/null 29 | 30 | byte_swap () { 31 | # Take "abcdefgh" and return it as "ghefcdab" 32 | echo "${1:6:2}${1:4:2}${1:2:2}${1:0:2}" 33 | } 34 | 35 | crmagic_hex="4372 3234" # Cr24 36 | version_hex="0200 0000" # 2 37 | pub_len_hex=$(byte_swap $(printf '%08x\n' $(ls -l "$pub" | awk '{print $5}'))) 38 | sig_len_hex=$(byte_swap $(printf '%08x\n' $(ls -l "$sig" | awk '{print $5}'))) 39 | ( 40 | echo "$crmagic_hex $version_hex $pub_len_hex $sig_len_hex" | xxd -r -p 41 | cat "$pub" "$sig" "$zip" 42 | ) > "$crx" 43 | echo "Wrote $crx" 44 | 45 | -------------------------------------------------------------------------------- /data/README.txt: -------------------------------------------------------------------------------- 1 | Icon by Shane Miller from the Noun Project: 2 | http://thenounproject.com/term/book/8198/ 3 | 4 | Star and other Icons by Julien Deveaux from the Noun Project: 5 | http://thenounproject.com/term/star/47902/ 6 | http://thenounproject.com/term/star/47903/ 7 | http://thenounproject.com/term/star/47898/ 8 | http://thenounproject.com/term/star/47901/ 9 | https://thenounproject.com/term/fire/47980/ 10 | 11 | Trash Icon by Julien Deveaux from the Noun Project: 12 | http://thenounproject.com/term/trash/49048/ 13 | 14 | Menu Icon by Corie Johnson from the Noun Project: 15 | http://thenounproject.com/term/menu/31701/ 16 | 17 | Gears Icon by Lubos Volkov from the Noun Project: 18 | http://thenounproject.com/term/gears/20921/ 19 | 20 | Hide Icon by Joshua Stearns from the Noun Project: 21 | http://thenounproject.com/term/hide-preview/82416/ 22 | 23 | Flag Icon by Richard Schumann from the Noun Project: 24 | http://thenounproject.com/term/flag/50851/ 25 | 26 | Bookmark Icon by Nice and Serious from the Noun Project: 27 | http://thenounproject.com/term/book/89086/ 28 | 29 | Unread Icon by Benny Forsberg from the Noun Project: 30 | http://thenounproject.com/term/book/14945/ 31 | 32 | Read Icon by Nicholas Menghini from the Noun Project: 33 | http://thenounproject.com/term/book/10777/ 34 | 35 | Hide Icon by Angela Noble from the Noun Project: 36 | https://thenounproject.com/term/blind/41992/ 37 | 38 | Bug Icon by Chameleon Design from the Noun Project: 39 | https://thenounproject.com/term/ladybug/604217/ -------------------------------------------------------------------------------- /data/images/all-dislike.svg: -------------------------------------------------------------------------------- 1 | 2 | image/svg+xml -------------------------------------------------------------------------------- /data/images/all-dislike2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /data/images/all-star2.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /data/images/bookmark-fill.svg: -------------------------------------------------------------------------------- 1 | 2 | image/svg+xml -------------------------------------------------------------------------------- /data/images/bookmark.svg: -------------------------------------------------------------------------------- 1 | 2 | image/svg+xml -------------------------------------------------------------------------------- /data/images/bug.svg: -------------------------------------------------------------------------------- 1 | 2 | 19 | 21 | 22 | 24 | image/svg+xml 25 | 27 | 28 | 29 | 30 | 31 | 33 | 57 | 60 | 66 | 67 | 68 | -------------------------------------------------------------------------------- /data/images/close.svg: -------------------------------------------------------------------------------- 1 | 2 | image/svg+xml -------------------------------------------------------------------------------- /data/images/cloud-offline.svg: -------------------------------------------------------------------------------- 1 | 2 | image/svg+xml -------------------------------------------------------------------------------- /data/images/cloud-ok.svg: -------------------------------------------------------------------------------- 1 | 2 | image/svg+xml -------------------------------------------------------------------------------- /data/images/delete-fill.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/darthkrallt/AO3rdr/d5fc8b879bbb7bfd5985a34b48a45ad9220947b6/data/images/delete-fill.png -------------------------------------------------------------------------------- /data/images/delete-fill.svg: -------------------------------------------------------------------------------- 1 | 2 | image/svg+xml -------------------------------------------------------------------------------- /data/images/delete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/darthkrallt/AO3rdr/d5fc8b879bbb7bfd5985a34b48a45ad9220947b6/data/images/delete.png -------------------------------------------------------------------------------- /data/images/delete.svg: -------------------------------------------------------------------------------- 1 | 2 | image/svg+xml -------------------------------------------------------------------------------- /data/images/dislike-fill.svg: -------------------------------------------------------------------------------- 1 | 2 | image/svg+xml -------------------------------------------------------------------------------- /data/images/dislike.svg: -------------------------------------------------------------------------------- 1 | 2 | image/svg+xml -------------------------------------------------------------------------------- /data/images/face_3.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 18 | 40 | 49 | 50 | 52 | 54 | 55 | 57 | image/svg+xml 58 | 60 | 61 | 62 | 63 | 64 | 69 | 73 | 77 | 81 | 82 | 83 | -------------------------------------------------------------------------------- /data/images/flag.svg: -------------------------------------------------------------------------------- 1 | 2 | image/svg+xml -------------------------------------------------------------------------------- /data/images/hidden.svg: -------------------------------------------------------------------------------- 1 | 2 | 18 | 20 | 21 | 23 | image/svg+xml 24 | 26 | 27 | 28 | 29 | 53 | 54 | preview 56 | Created with Sketch. 58 | 60 | 65 | 70 | 75 | 80 | 85 | 86 | 87 | 88 | -------------------------------------------------------------------------------- /data/images/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/darthkrallt/AO3rdr/d5fc8b879bbb7bfd5985a34b48a45ad9220947b6/data/images/icon.png -------------------------------------------------------------------------------- /data/images/icon_128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/darthkrallt/AO3rdr/d5fc8b879bbb7bfd5985a34b48a45ad9220947b6/data/images/icon_128.png -------------------------------------------------------------------------------- /data/images/icon_16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/darthkrallt/AO3rdr/d5fc8b879bbb7bfd5985a34b48a45ad9220947b6/data/images/icon_16.png -------------------------------------------------------------------------------- /data/images/icon_48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/darthkrallt/AO3rdr/d5fc8b879bbb7bfd5985a34b48a45ad9220947b6/data/images/icon_48.png -------------------------------------------------------------------------------- /data/images/icon_64.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/darthkrallt/AO3rdr/d5fc8b879bbb7bfd5985a34b48a45ad9220947b6/data/images/icon_64.png -------------------------------------------------------------------------------- /data/images/menu.svg: -------------------------------------------------------------------------------- 1 | 2 | image/svg+xml -------------------------------------------------------------------------------- /data/images/read.svg: -------------------------------------------------------------------------------- 1 | 2 | image/svg+xml -------------------------------------------------------------------------------- /data/images/star-0.svg: -------------------------------------------------------------------------------- 1 | 2 | image/svg+xml -------------------------------------------------------------------------------- /data/images/star-1-fill.svg: -------------------------------------------------------------------------------- 1 | 2 | image/svg+xml -------------------------------------------------------------------------------- /data/images/star-1.svg: -------------------------------------------------------------------------------- 1 | 2 | image/svg+xml -------------------------------------------------------------------------------- /data/images/star-3-fill.svg: -------------------------------------------------------------------------------- 1 | 2 | image/svg+xml -------------------------------------------------------------------------------- /data/images/star-3.svg: -------------------------------------------------------------------------------- 1 | 2 | image/svg+xml -------------------------------------------------------------------------------- /data/images/star-5-fill.svg: -------------------------------------------------------------------------------- 1 | 2 | image/svg+xml -------------------------------------------------------------------------------- /data/images/star-5.svg: -------------------------------------------------------------------------------- 1 | 2 | image/svg+xml -------------------------------------------------------------------------------- /data/images/sync.svg: -------------------------------------------------------------------------------- 1 | 2 | 17 | 19 | 41 | 43 | 44 | 46 | image/svg+xml 47 | 49 | 50 | 51 | 52 | 53 | 58 | 63 | 64 | 65 | -------------------------------------------------------------------------------- /data/images/unread.svg: -------------------------------------------------------------------------------- 1 | 2 | image/svg+xml -------------------------------------------------------------------------------- /data/settings/articles-table-chrome.js: -------------------------------------------------------------------------------- 1 | var artPort = chrome.runtime.connect({name: "articles-table"}); 2 | 3 | chrome.runtime.onMessage.addListener( 4 | function(request, sender, sendResponse) { 5 | articles_listener(request) 6 | }); 7 | 8 | artPort.onMessage.addListener(function(request, sender, sendResponse) { 9 | articles_listener(request); 10 | }); 11 | -------------------------------------------------------------------------------- /data/settings/articles-table-content.js: -------------------------------------------------------------------------------- 1 | var requestBackup = (function(artPort){ 2 | return function(){ 3 | artPort.postMessage({message:'fetchdata', data: {'exportdata': true}}); 4 | } 5 | })(artPort); 6 | 7 | var emitCloudSyncToggle = (function(artPort){ 8 | return function() { 9 | var val = $('#enable-cloud-sync').is(":checked"); 10 | artPort.postMessage({message: 'prefs', data: {'sync_enabled': val}}); 11 | }; 12 | })(artPort); 13 | 14 | var emitAutofilterToggle = (function(artPort){ 15 | return function() { 16 | var val = $('#enable-autofilter').is(":checked"); 17 | $('#blacklist-wrapper').toggle(); 18 | artPort.postMessage({message: 'prefs', data: {'autofilter': val}}); 19 | }; 20 | })(artPort); 21 | 22 | var emitTagData = (function(artPort){ 23 | return function() { 24 | var taglist = $('#blacklist').val(); 25 | artPort.postMessage({message: 'prefs', data: {'tags': taglist}}); 26 | }; 27 | })(artPort); 28 | 29 | 30 | var revealToken = (function(artPort){ 31 | return function(){ 32 | artPort.postMessage({message:'reveal-token'}); 33 | } 34 | })(artPort); 35 | 36 | var saveToken = (function(artPort){ 37 | return function(){ 38 | var token = $("#token-display").val(); 39 | artPort.postMessage({message: 'save-token', data:token}); 40 | } 41 | })(artPort); 42 | 43 | var syncNow = (function(artPort){ 44 | return function(){ 45 | artPort.postMessage({message:'runsync'}); 46 | // Also signal to the user that their message was recieved 47 | toggleSync(false); 48 | } 49 | })(artPort); 50 | 51 | var dismissHello = (function(artPort){ 52 | return function(){ 53 | artPort.postMessage({message:'hellobar-dismiss'}); 54 | } 55 | })(artPort); 56 | 57 | 58 | 59 | var emitWorkEdit = (function(artPort){ 60 | return function(ao3id, update_data) { 61 | var row = $('#articlesTable').find('#'+ao3id); 62 | var send_data = { 63 | metadata: {'ao3id': ao3id}, 64 | mutable_data: update_data 65 | }; 66 | artPort.postMessage({message: 'ficdata', data:send_data}); 67 | 68 | $(row).find('input').click(); 69 | }; 70 | })(artPort); 71 | 72 | var restoreData = (function(artPort){ 73 | // This is really confusing! it returns a function to generate another function! 74 | return function(fileData){ 75 | return function(){ 76 | // send the data somewhere 77 | artPort.postMessage({message: 'restorefrombackup', data: fileData}); 78 | $('#restore-data').click(null); 79 | $('#restore-data').attr('class', 'button'); 80 | } 81 | } 82 | })(artPort); 83 | 84 | function articles_listener(request){ 85 | switch (request.message) { 86 | case 'token-revealed': 87 | $('#token-display').val(request.data); 88 | $('#id-token-box').fadeIn(500); 89 | break; 90 | case 'exportcomplete': 91 | onExportComplete(incomming_data); 92 | break; 93 | case 'newfic': 94 | updateTableRow(request.data); 95 | break; 96 | case 'token-saved': 97 | onTokenSave(request.data['token_status']); 98 | break; 99 | case 'datadump': 100 | datadumper(request); 101 | break; 102 | default: 103 | break; 104 | } 105 | } 106 | 107 | 108 | function datadumper(request){ 109 | switch (request.data_type){ 110 | case 'prefs': 111 | prefs = request.data.prefs; 112 | onPrefs(prefs); 113 | break; 114 | case 'ficdict': 115 | tableData = request.data.ficdict; 116 | if (Object.keys(tableData).length === 0 && tableData.constructor === Object){ 117 | // Reveal the help message box 118 | $('#help-message-box').css("display", 'block'); 119 | }; 120 | loadTable(tableData); 121 | break; 122 | case 'exportdata': 123 | onExportComplete(request.data); 124 | break; 125 | default: 126 | break; 127 | 128 | } 129 | } 130 | 131 | 132 | $(document).ready(function() { 133 | artPort.postMessage({message: 'fetchdata', data: {prefs: true, ficdict: true}}); 134 | }); -------------------------------------------------------------------------------- /data/settings/articles-table-lib.js: -------------------------------------------------------------------------------- 1 | var ao3baseLink = 'https://archiveofourown.org/works/'; 2 | 3 | function safeDecode(encoded){ 4 | return $('