├── .Rhistory ├── .github └── ISSUE_TEMPLATE │ ├── bug-report-template.md │ └── feature_request.md ├── Code_of_Conduct.md ├── Contributing.MD ├── Distributed Setting Join.me.pdf ├── Distributed Setting Zoom.pdf ├── HOW TO Use the Tool REMOTELY for DISTRIBUTED teams.docx ├── LICENSE ├── PULL_REQUEST_TEMPLATE.md ├── README.md ├── Recorder's Assistant Testing_Pull Request Guide .pdf ├── Stuk-jszip-4cbaf0e ├── .codeclimate.yml ├── .editorconfig ├── .gitignore ├── .jshintignore ├── .jshintrc ├── .npmignore ├── .travis.yml ├── CHANGES.md ├── Gruntfile.js ├── LICENSE.markdown ├── README.markdown ├── _config.yml ├── bower.json ├── component.json ├── dist │ ├── jszip.js │ └── jszip.min.js ├── docs │ ├── APPNOTE.TXT │ ├── ZIP spec.txt │ └── references.txt ├── documentation │ ├── _layouts │ │ └── default.html │ ├── api_jszip.md │ ├── api_jszip │ │ ├── constructor.md │ │ ├── external.md │ │ ├── file_data.md │ │ ├── file_name.md │ │ ├── file_regex.md │ │ ├── filter.md │ │ ├── folder_data.md │ │ ├── folder_regex.md │ │ ├── for_each.md │ │ ├── generate_async.md │ │ ├── generate_internal_stream.md │ │ ├── generate_node_stream.md │ │ ├── load_async.md │ │ ├── load_async_object.md │ │ ├── remove.md │ │ └── support.md │ ├── api_streamhelper.md │ ├── api_streamhelper │ │ ├── accumulate.md │ │ ├── on.md │ │ ├── pause.md │ │ └── resume.md │ ├── api_zipobject.md │ ├── api_zipobject │ │ ├── async.md │ │ ├── internal_stream.md │ │ └── node_stream.md │ ├── contributing.md │ ├── css │ │ ├── main.css │ │ └── pygments.css │ ├── examples.md │ ├── examples │ │ ├── download-zip-file.html │ │ ├── downloader.html │ │ ├── downloader.js │ │ ├── get-binary-files-ajax.html │ │ └── read-local-file-api.html │ ├── faq.md │ ├── howto │ │ ├── read_zip.md │ │ └── write_zip.md │ ├── limitations.md │ └── upgrade_guide.md ├── index.html ├── lib │ ├── base64.js │ ├── compressedObject.js │ ├── compressions.js │ ├── crc32.js │ ├── defaults.js │ ├── external.js │ ├── flate.js │ ├── generate │ │ ├── ZipFileWorker.js │ │ └── index.js │ ├── index.js │ ├── license_header.js │ ├── load.js │ ├── nodejs │ │ ├── NodejsStreamInputAdapter.js │ │ └── NodejsStreamOutputAdapter.js │ ├── nodejsUtils.js │ ├── object.js │ ├── reader │ │ ├── ArrayReader.js │ │ ├── DataReader.js │ │ ├── NodeBufferReader.js │ │ ├── StringReader.js │ │ ├── Uint8ArrayReader.js │ │ └── readerFor.js │ ├── signature.js │ ├── stream │ │ ├── ConvertWorker.js │ │ ├── Crc32Probe.js │ │ ├── DataLengthProbe.js │ │ ├── DataWorker.js │ │ ├── GenericWorker.js │ │ └── StreamHelper.js │ ├── support.js │ ├── utf8.js │ ├── utils.js │ ├── zipEntries.js │ ├── zipEntry.js │ └── zipObject.js ├── package.json ├── test │ ├── asserts │ │ ├── constructor.js │ │ ├── delete.js │ │ ├── deprecated.js │ │ ├── external.js │ │ ├── file.js │ │ ├── filter.js │ │ ├── foreach.js │ │ ├── generate.js │ │ ├── load.js │ │ ├── permissions.js │ │ ├── stream.js │ │ └── unicode.js │ ├── helpers │ │ ├── browser-test-utils.js │ │ ├── node-test-utils.js │ │ └── test-utils.js │ ├── index.html │ ├── jquery-1.8.3.min.js │ ├── ref │ │ ├── all-stream.zip │ │ ├── all.7zip.zip │ │ ├── all.windows.zip │ │ ├── all.zip │ │ ├── all_appended_bytes.zip │ │ ├── all_missing_bytes.zip │ │ ├── all_prepended_bytes.zip │ │ ├── archive_comment.zip │ │ ├── backslash.zip │ │ ├── complex_files │ │ │ ├── AntarcticaTemps.ods │ │ │ ├── AntarcticaTemps.xlsx │ │ │ ├── Franz Kafka - The Metamorphosis.epub │ │ │ └── Outlook2007_Calendar.xps │ │ ├── data_descriptor.zip │ │ ├── deflate-stream.zip │ │ ├── deflate.zip │ │ ├── empty.zip │ │ ├── encrypted.zip │ │ ├── extra_attributes.zip │ │ ├── folder.zip │ │ ├── image.zip │ │ ├── invalid │ │ │ ├── bad_decompressed_size.zip │ │ │ ├── bad_offset.zip │ │ │ ├── compression.zip │ │ │ └── crc32.zip │ │ ├── local_encoding_in_name.zip │ │ ├── nested.zip │ │ ├── nested_data_descriptor.zip │ │ ├── nested_zip64.zip │ │ ├── permissions │ │ │ ├── linux_7z.zip │ │ │ ├── linux_ark.zip │ │ │ ├── linux_file_roller-ubuntu.zip │ │ │ ├── linux_file_roller-xubuntu.zip │ │ │ ├── linux_zip.zip │ │ │ ├── mac_finder.zip │ │ │ ├── windows_7z.zip │ │ │ ├── windows_compressed_folders.zip │ │ │ ├── windows_izarc.zip │ │ │ └── windows_winrar.zip │ │ ├── pile_of_poo.zip │ │ ├── slashes_and_izarc.zip │ │ ├── store-stream.zip │ │ ├── store.zip │ │ ├── subfolder.zip │ │ ├── text.zip │ │ ├── utf8.zip │ │ ├── utf8_in_name.zip │ │ ├── winrar_utf8_in_name.zip │ │ ├── zip64.zip │ │ ├── zip64_appended_bytes.zip │ │ ├── zip64_missing_bytes.zip │ │ └── zip64_prepended_bytes.zip │ └── smile.gif └── vendor │ └── FileSaver.js ├── Updated_OutputFile.csv ├── core ├── background.js ├── setup.js ├── stateManager.js └── utilities.js ├── distributed_setting_guide.md ├── features ├── persona.js ├── prewalkthrough.js └── walkthroughHandlers.js ├── font-awesome-4.6.1 ├── HELP-US-OUT.txt ├── css │ ├── font-awesome.css │ └── font-awesome.min.css ├── fonts │ ├── FontAwesome.otf │ ├── fontawesome-webfont.eot │ ├── fontawesome-webfont.svg │ ├── fontawesome-webfont.ttf │ ├── fontawesome-webfont.woff │ └── fontawesome-webfont.woff2 ├── less │ ├── animated.less │ ├── bordered-pulled.less │ ├── core.less │ ├── fixed-width.less │ ├── font-awesome.less │ ├── icons.less │ ├── larger.less │ ├── list.less │ ├── mixins.less │ ├── path.less │ ├── rotated-flipped.less │ ├── screen-reader.less │ ├── stacked.less │ └── variables.less └── scss │ ├── _animated.scss │ ├── _bordered-pulled.scss │ ├── _core.scss │ ├── _fixed-width.scss │ ├── _icons.scss │ ├── _larger.scss │ ├── _list.scss │ ├── _mixins.scss │ ├── _path.scss │ ├── _rotated-flipped.scss │ ├── _screen-reader.scss │ ├── _stacked.scss │ ├── _variables.scss │ └── font-awesome.scss ├── icon.png ├── icon128.png ├── icon32.png ├── icon48.png ├── images ├── Abi-lowres.jpg ├── Abi_square.jpg ├── Patmulti.png ├── Patricia-lowres.jpg ├── Patricia_square.jpg ├── Patrick-lowres.jpg ├── Patrick_square.jpg ├── Patricmulti.png ├── Tim-lowres.jpg ├── Tim_square.jpg ├── Timmulti.png ├── abimulti.PNG ├── arrow_collapsed.png ├── arrow_expanded.png ├── create_persona.png ├── ico-chrome.png ├── image1.png ├── image2.jpg ├── maroon_button.png ├── scenario.png └── screenshot.png ├── jquery-ui-1.12.1 ├── AUTHORS.txt ├── LICENSE.txt ├── external │ └── jquery │ │ └── jquery.js ├── images │ ├── ui-icons_444444_256x240.png │ ├── ui-icons_555555_256x240.png │ ├── ui-icons_777620_256x240.png │ ├── ui-icons_777777_256x240.png │ ├── ui-icons_cc0000_256x240.png │ └── ui-icons_ffffff_256x240.png ├── index.css ├── index.html ├── jquery-ui.css ├── jquery-ui.js ├── jquery-ui.min.css ├── jquery-ui.min.js ├── jquery-ui.structure.css ├── jquery-ui.structure.min.css ├── jquery-ui.theme.css ├── jquery-ui.theme.min.css └── package.json ├── manifest.json ├── privacy-policy.md ├── profile_pic.png ├── scripts ├── action.js ├── background.js ├── jcanvas.min.js ├── output.js ├── overlayScreen.js ├── saveState.js ├── screenshot.js ├── script.js ├── setup.js ├── tooltip.js ├── utilities.js └── walkthrough.js ├── style_guidelines.md ├── styles ├── .DS_Store ├── index.css ├── overlayScreen.css ├── slider.css ├── sliderbody.css └── styles.css ├── templates ├── Abi │ ├── abiIPSToolTip.html │ ├── abiMToolTip.html │ ├── abiPersona.html │ ├── abiRToolTip.html │ ├── abiSEToolTip.html │ └── abiTToolTip.html ├── Pat │ ├── patIPSToolTip.html │ ├── patMToolTip.html │ ├── patPersona.html │ ├── patRToolTip.html │ ├── patSEToolTip.html │ └── patTToolTip.html ├── Tim │ ├── timIPSToolTip.html │ ├── timMToolTip.html │ ├── timPersona.html │ ├── timRToolTip.html │ ├── timSEToolTip.html │ └── timTToolTip.html ├── action.html ├── actionAnswers.html ├── actionPrompt.html ├── background.html ├── custom │ └── custom.html ├── firstState.html ├── imageAnnotation.html ├── output.html ├── popup.html ├── setupToolTip.html ├── slider.html ├── sliderFinalWarning.html └── subgoal.html └── ui └── uiController.js /.Rhistory: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GenderMagProject/GenderMagRecordersAssistant/abe500348a36b9adc9766d11bcf355f61418c2bc/.Rhistory -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug-report-template.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report template 3 | about: Bug reporting for GenderMag Recorders Assistant project 4 | 5 | --- 6 | 7 | * **What Operating System?** 8 | 9 | * **What version of Chrome?** 10 | 11 | * **What version of Recorder's Assistant (GitHub version or Chrome Store version)?** 12 | 13 | * **What steps will reproduce the issue?** 14 | 15 | * **What would you expect to be the outcome?** 16 | 17 | * **Any additional details/screenshots to help people to fix any potential bugs?** 18 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request template 3 | about: Suggest an idea for GenderMag Recorders Assistant project 4 | 5 | --- 6 | 7 | * **Feature description:** (Example: Add an exit button) 8 | 9 | 10 | 11 | 12 | * **Reason for the feature or improvement:** (Example: there is no right way to exit from the application) 13 | 14 | 15 | 16 | 17 | * **How does your idea fit with the aim/scope of the project?** (Example: feature gives the workflow) 18 | 19 | 20 | 21 | 22 | * **What are the merits of the feature?** (Example: prevent data loss) 23 | 24 | 25 | 26 | 27 | * **Screenshots, if you can show something similar, or a sketch:** 28 | 29 | 30 | 31 | 32 | * **Any other information:** 33 | -------------------------------------------------------------------------------- /Contributing.MD: -------------------------------------------------------------------------------- 1 | # GenderMag Recorder's Assistant Contributing Guide 2 | 3 | ## Git Resources 4 | 5 | * Please review the resources available at https://try.github.io/ if you are not already familiar with Git/GitHub or need a reference for Git terms and commands as you prepare to contribute. 6 | 7 | ## How to install and edit: 8 | 9 | 1. Install the tool via instructions in the README 10 | 11 | 2. If you want to run the tool at this point, navigate to the page you wish to perform GenderMag on and click the maroon GenderMag button at the bottom of the screen. The video posted at http://gendermag.org has an example. 12 | 3. Open the project files in an editor, like Intellij, or whatever you perfer. 13 | 4. Make and save edits. 14 | 5. To view and test your edits, navigate to “Extensions”, which has a triple dot icon, at the top right corner of the broswer. Then, hover over 'More Tools' and click on Extentions. 15 | 6. After that, you might have to hit the refresh button (↻) and reload the page where you are using the tool. 16 | 17 | ## To Contribute: 18 | 1. Create a new branch to work on. 19 | * Ex: The command `git branch test` creates a new branch called test. 20 | 2. Use `git checkout [name of branch]` to switch to that branch. 21 | 3. Navigate to the place you stored your local copy of the GenderMagsRecordersAssistant (the copy that you cloned to your local desktop) 22 | 4. To look for issues you can contribute to navigate back to the original GenderMag repo, not your forked repo, and look at the issues under the issue tab on the top. 23 | * You can also filter the issues by the "Good first issue" tag to get started. 24 | 5. Make any new changes or fixes on your branch and then push the branch to your remote repo. 25 | 6. Then make a pull request using [this guide](https://github.com/mendezc1/GenderMagRecordersAssistant/blob/master/Recorder's%20Assistant%20Testing_Pull%20Request%20Guide%20.pdf). 26 | * If you have questions on how to push, pull, and commit check out the [guide](https://github.com/git-guides/) GitHub has posted. 27 | 28 | Before you push your changes, check out our [style guidelines](https://github.com/GenderMagProject/GenderMagRecordersAssistant/blob/master/style_guidelines.md). This will inform you on how to write code and comments that are consistent with the rest of the code in the repo. 29 | 30 | You will hear back from us soon! 31 | 32 | 33 | ## IMPORTANT: 34 | By submitting a patch, you agree to allow the project owner to license your work under the same license as that used by the project. 35 | 36 | ## Contributors 37 | 38 | Please see the 39 | [Contributors Graph](https://github.com/mendezc1/GenderMagRecordersAssistant/graphs/contributors) for our 40 | list of contributors. 41 | 42 | -------------------------------------------------------------------------------- /Distributed Setting Join.me.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GenderMagProject/GenderMagRecordersAssistant/abe500348a36b9adc9766d11bcf355f61418c2bc/Distributed Setting Join.me.pdf -------------------------------------------------------------------------------- /Distributed Setting Zoom.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GenderMagProject/GenderMagRecordersAssistant/abe500348a36b9adc9766d11bcf355f61418c2bc/Distributed Setting Zoom.pdf -------------------------------------------------------------------------------- /HOW TO Use the Tool REMOTELY for DISTRIBUTED teams.docx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GenderMagProject/GenderMagRecordersAssistant/abe500348a36b9adc9766d11bcf355f61418c2bc/HOW TO Use the Tool REMOTELY for DISTRIBUTED teams.docx -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 Chris Mendez 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /PULL_REQUEST_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Pull request template 3 | about: GenderMag Recorders Assistant project 4 | 5 | --- 6 | 7 | * **What does this implementation fix? Explain your changes.** 8 | 9 | * **Does this close any open issue? (Give issue id from issue tracker)** 10 | 11 | * **Include any related logs, error, output file etc.** 12 | 13 | * **Did you test on Mac and Windows?** 14 | 15 | * **Did you test the full GM process and verify that the code does not contribute any unexpected errors/bugs?** 16 | 17 | * **Did you follow the style guidelines and verify that the code does not have any incorrect formatting?** 18 | 19 | * **If possible, provide a screenshot of the functionality.** 20 | 21 | * **Any other information?** 22 | 23 | ## Sample Responses 24 | 25 | * **What does this implementation fix? Explain your changes.** 26 | - This implementation adds sample responses and a screenshot of a pull request comment to the pull_request_template.md file. The addition gives contributors an example of how to respond to the template questions. 27 | * **Does this close any open issue? (Give issue id from issue tracker)** 28 | - Yes, this closes issue #145. 29 | * **Include any related logs, error, output file etc.** 30 | - No logs, errors, or output files were produced. 31 | * **Did you test on Mac and Windows?** 32 | - No testing was done because the addition was made to documentation. 33 | * **Did you test the full GM process and verify that the code does not contribute any unexpected errors/bugs?** 34 | - No, I did not test the full GM process. The addition was made to documentation; therefore, it will not introduce any unexpected errors or bugs. 35 | * **Did you follow the style guidelines and verify that the code does not have any incorrect formatting?** 36 | - Yes, I followed style guidelines. No, there was no code to verify for incorrect formatting. 37 | * **If possible, provide a screenshot of the functionality.** 38 | - Additions did not change any functionality. 39 | * **Any other information?** 40 | - There is no additional information. 41 | 42 | ## Screenshot of a Sample Pull Request Comment 43 | ![screenshot_of_pull_request](https://github.com/SYee50/Screenshots/assets/102485385/2ed35332-c29c-40ae-8d09-9a992d52106f) 44 | -------------------------------------------------------------------------------- /Recorder's Assistant Testing_Pull Request Guide .pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GenderMagProject/GenderMagRecordersAssistant/abe500348a36b9adc9766d11bcf355f61418c2bc/Recorder's Assistant Testing_Pull Request Guide .pdf -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/.codeclimate.yml: -------------------------------------------------------------------------------- 1 | --- 2 | engines: 3 | duplication: 4 | enabled: true 5 | config: 6 | languages: 7 | - javascript 8 | eslint: 9 | enabled: true 10 | fixme: 11 | enabled: true 12 | ratings: 13 | paths: 14 | - "lib/*.js" 15 | exclude_paths: 16 | - "dist/*" 17 | -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | end_of_line = lf 5 | insert_final_newline = true 6 | charset = utf-8 7 | indent_style = space 8 | indent_size = 4 9 | -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/.gitignore: -------------------------------------------------------------------------------- 1 | *~ 2 | node_modules 3 | sauce_connect.log 4 | .c9revisions -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/.jshintignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/.jshintrc: -------------------------------------------------------------------------------- 1 | { 2 | "curly": true, 3 | "eqeqeq": true, 4 | "nonew": true, 5 | "noarg": true, 6 | "forin": true, 7 | "futurehostile": true, 8 | "freeze": true, 9 | "undef": true, 10 | "strict": true, 11 | "sub": true, 12 | "esversion": 3, 13 | 14 | "globals": { 15 | "TextEncoder": false, 16 | "TextDecoder": false 17 | }, 18 | "browser": true, 19 | "node": true 20 | } 21 | -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/.npmignore: -------------------------------------------------------------------------------- 1 | _config.yml 2 | bower.json 3 | component.json 4 | docs 5 | documentation 6 | Gruntfile.js 7 | index.html 8 | test 9 | -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | sudo: false 3 | matrix: 4 | include: 5 | - node_js: "0.10" 6 | env: COMMAND=test-node 7 | - node_js: "0.12" 8 | env: COMMAND=test-node 9 | - node_js: "4.4" 10 | env: COMMAND=test-node 11 | - node_js: "stable" 12 | env: COMMAND=test-node 13 | - node_js: "stable" 14 | env: COMMAND=test-browser 15 | env: 16 | global: 17 | - secure: MhA8GHU42X3GWTUMaqdZVvarx4BMjhQCUGNi3kvuD/iCmKVb7gMwj4jbds7AcJdsCRsRk8bBGzZs/E7HidBJMPDa5DhgLKy9EV1s42JlHq8lVzbJeWIGgrtyJvhVUkGRy2OJjnDSgh3U6elkQmvDn74jreSQc6m/yGoPFF1nqq8= 18 | - secure: qREw6aUu2DnB+2reMuHgygSkumRiJvt7Z5Fz4uEVoraqbe65e4PGhtzypr9uIgCN43vxS2D5tAIeDbfid5VQrWFUQnrC9O5Z5qgVPsKN94zZ1tvYurXI4wRlAg58nNjkfGXWhLI3VUjjDTp5gYcMqgfe5hpEFYUPnUQkKGnaqAk= 19 | script: npm run $COMMAND 20 | -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/README.markdown: -------------------------------------------------------------------------------- 1 | JSZip [![Build Status](https://api.travis-ci.org/Stuk/jszip.svg?branch=master)](http://travis-ci.org/Stuk/jszip) [![Code Climate](https://codeclimate.com/github/Stuk/jszip/badges/gpa.svg)](https://codeclimate.com/github/Stuk/jszip) 2 | ===== 3 | 4 | [![Selenium Test Status](https://saucelabs.com/browser-matrix/jszip.svg)](https://saucelabs.com/u/jszip) 5 | 6 | A library for creating, reading and editing .zip files with Javascript, with a 7 | lovely and simple API. 8 | 9 | See http://stuartk.com/jszip for all the documentation. 10 | 11 | ```javascript 12 | var zip = new JSZip(); 13 | 14 | zip.file("Hello.txt", "Hello World\n"); 15 | 16 | var img = zip.folder("images"); 17 | img.file("smile.gif", imgData, {base64: true}); 18 | 19 | zip.generateAsync({type:"blob"}).then(function(content) { 20 | // see FileSaver.js 21 | saveAs(content, "example.zip"); 22 | }); 23 | 24 | /* 25 | Results in a zip containing 26 | Hello.txt 27 | images/ 28 | smile.gif 29 | */ 30 | ``` 31 | License 32 | ------- 33 | 34 | JSZip is dual-licensed. You may use it under the MIT license *or* the GPLv3 35 | license. See [LICENSE.markdown](LICENSE.markdown). 36 | -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/_config.yml: -------------------------------------------------------------------------------- 1 | # will be overwritten by github, see https://help.github.com/articles/using-jekyll-with-pages 2 | lsi: false 3 | safe: true 4 | source: ./ 5 | incremental: false 6 | highlighter: rouge 7 | gist: 8 | noscript: false 9 | # /overwritten 10 | 11 | baseurl: /jszip 12 | 13 | layouts_dir: ./documentation/_layouts 14 | permalink: none 15 | exclude: ['bin', 'README.md', 'node_modules'] 16 | 17 | 18 | kramdown: 19 | input: GFM 20 | hard_wrap: false 21 | gems: 22 | - jekyll-coffeescript 23 | - jekyll-paginate 24 | 25 | -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "jszip", 3 | "homepage": "http://stuartk.com/jszip", 4 | "authors": [ 5 | "Stuart Knightley " 6 | ], 7 | "description": "Create, read and edit .zip files with Javascript http://stuartk.com/jszip", 8 | "main": "dist/jszip.js", 9 | "keywords": [ 10 | "zip", 11 | "deflate", 12 | "inflate" 13 | ], 14 | "license": "MIT or GPLv3", 15 | "ignore": [ 16 | "**/.*", 17 | "node_modules", 18 | "bower_components", 19 | "test", 20 | "tests" 21 | ] 22 | } 23 | -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/component.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "jszip", 3 | "repo": "Stuk/jszip", 4 | "description": "Create, read and edit .zip files with Javascript http://stuartk.com/jszip", 5 | "version": "3.0.0", 6 | "keywords": [ 7 | "zip", 8 | "deflate", 9 | "inflate" 10 | ], 11 | "main": "dist/jszip.js", 12 | "license": "MIT or GPLv3", 13 | "scripts": [ 14 | "dist/jszip.js" 15 | ] 16 | } 17 | -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/docs/ZIP spec.txt: -------------------------------------------------------------------------------- 1 | Here are the notes I made while working through the ZIP file specification. 2 | 3 | For each file: 4 | 5 | local file header signature 4 bytes (0x04034b50) 6 | version needed to extract 2 bytes 7 | general purpose bit flag 2 bytes 8 | compression method 2 bytes 9 | last mod file time 2 bytes 10 | last mod file date 2 bytes 11 | crc-32 4 bytes 12 | compressed size 4 bytes 13 | uncompressed size 4 bytes 14 | file name length 2 bytes 15 | extra field length 2 bytes 16 | 17 | |sig |v |g |c |t |d |crc |csz |usz |n |x | 18 | PK.. ## 00 00 ?? ?? xxxx ???? ???? ?? 00 19 | 20 | 21 | Central directory: 22 | 23 | central file header signature 4 bytes (0x02014b50) 24 | version made by 2 bytes 25 | version needed to extract 2 bytes * 26 | general purpose bit flag 2 bytes * 27 | compression method 2 bytes * 28 | last mod file time 2 bytes * 29 | last mod file date 2 bytes * 30 | crc-32 4 bytes * 31 | compressed size 4 bytes * 32 | uncompressed size 4 bytes * 33 | file name length 2 bytes * 34 | extra field length 2 bytes * 35 | file comment length 2 bytes 36 | disk number start 2 bytes 37 | internal file attributes 2 bytes 38 | external file attributes 4 bytes 39 | relative offset of local header 4 bytes 40 | 41 | file name (variable size) 42 | extra field (variable size) 43 | file comment (variable size) 44 | 45 | |sig |vm|vx|g |c |d |t |crc |csz |usz |n |x |cm|dn|ia|xa |roff| 46 | PK.. ## ## 00 00 ?? ?? xxxx ???? ???? ?? 00 00 00 00 xxxx ???? 47 | 48 | End of central directory: 49 | 50 | end of central dir signature 4 bytes (0x06054b50) 51 | number of this disk 2 bytes 52 | number of the disk with the 53 | start of the central directory 2 bytes 54 | total number of entries in the 55 | central directory on this disk 2 bytes 56 | total number of entries in 57 | the central directory 2 bytes 58 | size of the central directory 4 bytes 59 | offset of start of central 60 | directory with respect to 61 | the starting disk number 4 bytes 62 | .ZIP file comment length 2 bytes 63 | .ZIP file comment (variable size) 64 | 65 | |sig |n1|n2|e |ne|size|off |cm| 66 | PK.. 00 00 ?? ?? ???? ???? 00 67 | -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/docs/references.txt: -------------------------------------------------------------------------------- 1 | Zip format 2 | ---------- 3 | http://www.pkware.com/support/zip-application-note 4 | http://www.xxcopy.com/xxcopy06.htm 5 | 6 | Data URL 7 | -------- 8 | https://developer.mozilla.org/en/The_data_URL_scheme 9 | http://msdn.microsoft.com/en-us/library/cc848897(VS.85).aspx 10 | http://www.phpied.com/mhtml-when-you-need-data-uris-in-ie7-and-under/ 11 | 12 | http://www.motobit.com/util/base64-decoder-encoder.asp 13 | 14 | Saving files 15 | ------------ 16 | http://msdn.microsoft.com/en-us/library/ms536676(VS.85).aspx 17 | http://msdn.microsoft.com/en-us/library/ms536419(VS.85).aspx 18 | http://msdn.microsoft.com/en-us/library/ms537418(VS.85).aspx 19 | -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/documentation/api_jszip.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "JSZip API" 3 | layout: default 4 | section: api 5 | --- 6 | 7 | An instance of JSZip represents a set of files. You can add them, remove them, 8 | modify them. You can also import an existing zip file or generate one. 9 | 10 | ### Attributes 11 | 12 | attribute name | type | description 13 | ---------------------|-------------|------------- 14 | `files` | object | the [ZipObject]({{site.baseurl}}/documentation/api_zipobject.html)s inside the zip with the name as key. See [file(name)]({{site.baseurl}}/documentation/api_jszip/file_name.html). 15 | `comment` | string | the comment of the zip file. 16 | -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/documentation/api_jszip/constructor.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "new JSZip() or JSZip()" 3 | layout: default 4 | section: api 5 | --- 6 | 7 | __Description__ : Create a new JSZip instance. 8 | 9 | __Arguments__ : None 10 | 11 | __Returns__ : A new JSZip. 12 | 13 | __Throws__ : Nothing. 14 | 15 | 16 | 17 | __Example__ 18 | 19 | ```js 20 | var zip = new JSZip(); 21 | // same as 22 | var zip = JSZip(); 23 | ``` 24 | -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/documentation/api_jszip/external.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "JSZip.external" 3 | layout: default 4 | section: api 5 | --- 6 | 7 | JSZip uses polyfills of objects that may not exist on every platform. 8 | Accessing or replacing these objects can sometimes be useful. JSZip.external 9 | contains the following properties : 10 | 11 | * `Promise` : the [Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise) implementation used. 12 | 13 | __Example__ 14 | 15 | ```js 16 | // use bluebird instead 17 | JSZip.external.Promise = Bluebird; 18 | 19 | // use the native Promise object: 20 | JSZip.external.Promise = Promise; 21 | ``` 22 | 23 | -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/documentation/api_jszip/file_name.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "file(name)" 3 | layout: default 4 | section: api 5 | --- 6 | 7 | __Description__ : Get a file with the specified name. You can specify folders 8 | in the name : the folder separator is a forward slash ("/"). 9 | 10 | __Arguments__ 11 | 12 | name | type | description 13 | -----|--------|------------- 14 | name | string | the name of the file. 15 | 16 | __Returns__ : An instance of [ZipObject]({{site.baseurl}}/documentation/api_zipobject.html) representing 17 | the file if any, `null` otherwise. 18 | 19 | __Throws__ : Nothing. 20 | 21 | 22 | 23 | __Examples__ 24 | 25 | ```js 26 | var zip = new JSZip(); 27 | zip.file("file.txt", "content"); 28 | 29 | zip.file("file.txt").name // "file.txt" 30 | zip.file("file.txt").async("string") // a promise of "content" 31 | zip.file("file.txt").options.dir // false 32 | 33 | // utf8 example 34 | var zip = new JSZip(); 35 | zip.file("amount.txt", "€15"); 36 | zip.file("amount.txt").async("string") // a promise of "€15" 37 | zip.file("amount.txt").async("arraybuffer") // a promise of an ArrayBuffer containing €15 encoded as utf8 38 | zip.file("amount.txt").async("uint8array") // a promise of an Uint8Array containing €15 encoded as utf8 39 | 40 | // with folders 41 | zip.folder("sub").file("file.txt", "content"); 42 | zip.file("sub/file.txt"); // the file 43 | // or 44 | zip.folder("sub").file("file.txt") // the file 45 | ``` 46 | 47 | 48 | -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/documentation/api_jszip/file_regex.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "file(regex)" 3 | layout: default 4 | section: api 5 | --- 6 | 7 | __Description__ : Search a file in the current folder and subfolders with a 8 | [regular expression](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions). 9 | The regex is tested against the relative filename. 10 | 11 | __Arguments__ 12 | 13 | name | type | description 14 | ------|--------|------------ 15 | regex | RegExp | the regex to use. 16 | 17 | __Returns__ : An array of matching files (an empty array if none matched). Each 18 | maching file is an instance of [ZipObject]({{site.baseurl}}/documentation/api_zipobject.html). 19 | 20 | __Throws__ : Nothing. 21 | 22 | 26 | 27 | __Example__ 28 | 29 | ```js 30 | var zip = new JSZip(); 31 | zip.file("file1.txt", "content"); 32 | zip.file("file2.txt", "content"); 33 | 34 | zip.file(/file/); // array of size 2 35 | 36 | // example with a relative path : 37 | var folder = zip.folder("sub"); 38 | folder 39 | .file("file3.txt", "content") // relative path from folder : file3.txt 40 | .file("file4.txt", "content"); // relative path from folder : file4.txt 41 | 42 | folder.file(/file/); // array of size 2 43 | folder.file(/^file/); // array of size 2, the relative paths start with file 44 | 45 | // arrays contain objects in the form: 46 | // {name: "file2.txt", dir: false, async : function () {...}, ...} 47 | ``` 48 | 49 | 50 | -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/documentation/api_jszip/filter.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "filter(predicate)" 3 | layout: default 4 | section: api 5 | --- 6 | 7 | __Description__ : Filter nested files/folders with the specified function. 8 | 9 | __Arguments__ 10 | 11 | name | type | description 12 | ----------|----------|------------ 13 | predicate | function | the predicate to use. 14 | 15 | The predicate has the following signature : `function (relativePath, file) {...}` : 16 | 17 | name | type | description 18 | -------------|-----------|------------ 19 | relativePath | string | the filename and its path, reliatively to the current folder. 20 | file | ZipObject | the file being tested. See [ZipObject]({{site.baseurl}}/documentation/api_zipobject.html). 21 | 22 | The predicate must return true if the file should be included, false otherwise. 23 | 24 | 25 | __Returns__ : An array of matching ZipObject. 26 | 27 | __Throws__ : Nothing. 28 | 29 | 30 | 31 | __Example__ 32 | 33 | ```js 34 | var zip = new JSZip().folder("dir"); 35 | zip.file("readme.txt", "content"); 36 | zip.filter(function (relativePath, file){ 37 | // relativePath == "readme.txt" 38 | // file = {name:"dir/readme.txt",options:{...},async:function} 39 | return true/false; 40 | }); 41 | ``` 42 | 43 | 44 | -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/documentation/api_jszip/folder_data.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "folder(name)" 3 | layout: default 4 | section: api 5 | --- 6 | 7 | __Description__ : Create a directory if it doesn't exist, return a new JSZip 8 | object with the new folder as root. 9 | 10 | See also [the `dir` option of file()]({{site.baseurl}}/documentation/api_jszip/file_data.html). 11 | 12 | __Arguments__ 13 | 14 | name | type | description 15 | -----|--------|------------ 16 | name | string | the name of the directory. 17 | 18 | __Returns__ : A new JSZip (for chaining), with the new folder as root. 19 | 20 | __Throws__ : Nothing. 21 | 22 | 23 | 24 | __Example__ 25 | 26 | ```js 27 | zip.folder("images"); 28 | zip.folder("css").file("style.css", "body {background: #FF0000}"); 29 | // or specify an absolute path (using forward slashes) 30 | zip.file("css/font.css", "body {font-family: sans-serif}") 31 | 32 | // result : images/, css/, css/style.css, css/font.css 33 | ``` 34 | 35 | -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/documentation/api_jszip/folder_regex.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "folder(regex)" 3 | layout: default 4 | section: api 5 | --- 6 | 7 | __Description__ : Search a subdirectory in the current directory with a 8 | [regular expression](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions). 9 | The regex is tested against the relative path. 10 | 11 | __Arguments__ 12 | 13 | name | type | description 14 | ------|--------|------------ 15 | regex | RegExp | the regex to use. 16 | 17 | __Returns__ : An array of matching folders (an empty array if none matched). 18 | Each maching folder is an instance of [ZipObject]({{site.baseurl}}/documentation/api_zipobject.html). 19 | 20 | __Throws__ : Nothing. 21 | 22 | 26 | 27 | __Example__ 28 | 29 | ```js 30 | var zip = new JSZip(); 31 | zip.folder("home/Pierre/videos"); 32 | zip.folder("home/Pierre/photos"); 33 | zip.folder("home/Jean/videos"); 34 | zip.folder("home/Jean/photos"); 35 | 36 | zip.folder(/videos/); // array of size 2 37 | 38 | zip.folder("home/Jean").folder(/^vid/); // array of 1 39 | ``` 40 | 41 | -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/documentation/api_jszip/for_each.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "forEach(callback)" 3 | layout: default 4 | section: api 5 | --- 6 | 7 | __Description__ : Call a callback function for each entry at this folder level. 8 | 9 | __Arguments__ 10 | 11 | name | type | description 12 | ----------|----------|------------ 13 | callback | function | the callback to use. 14 | 15 | The callback has the following signature : `function (relativePath, file) {...}` : 16 | 17 | name | type | description 18 | -------------|-----------|------------ 19 | relativePath | string | the filename and its path, reliatively to the current folder. 20 | file | ZipObject | the current file. See [ZipObject]({{site.baseurl}}/documentation/api_zipobject.html). 21 | 22 | 23 | __Returns__ : Nothing. 24 | 25 | __Throws__ : Nothing. 26 | 27 | 28 | 29 | __Example__ 30 | 31 | ```js 32 | var zip = new JSZip(); 33 | zip.file("package.json", "..."); 34 | zip.file("lib/index.js", "..."); 35 | zip.file("test/index.html", "..."); 36 | zip.file("test/asserts/file.js", "..."); 37 | zip.file("test/asserts/generate.js", "..."); 38 | 39 | zip.folder("test").forEach(function (relativePath, file){ 40 | console.log("iterating over", relativePath); 41 | }); 42 | 43 | // will display: 44 | // iterating over index.html 45 | // iterating over asserts/ 46 | // iterating over asserts/file.js 47 | // iterating over asserts/generate.js 48 | ``` 49 | -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/documentation/api_jszip/generate_internal_stream.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "generateInternalStream(options)" 3 | layout: default 4 | section: api 5 | --- 6 | 7 | __Description__ : Generates the complete zip file with the internal stream 8 | implementation. 9 | 10 | __Arguments__ 11 | 12 | name | type | default | description 13 | --------------------|----------|---------|------------ 14 | options | object | | the options to generate the zip file, see [the options of `generateAsync()`]({{site.baseurl}}/documentation/api_jszip/generate_async.html) 15 | 16 | __Metadata__ : see [the metadata of `generateAsync()`]({{site.baseurl}}/documentation/api_jszip/generate_async.html). 17 | 18 | __Returns__ : a [StreamHelper]({{site.baseurl}}/documentation/api_streamhelper.html). 19 | 20 | __Throws__ : Nothing. 21 | 22 | __Example__ 23 | 24 | ```js 25 | zip.generateInternalStream({type:"blob"}).accumulate(function callback(err, content) { 26 | if (err) { 27 | // handle error 28 | } 29 | // see FileSaver.js 30 | saveAs(content, "hello.zip"); 31 | }, function updateCallback(metadata) { 32 | // print progression with metadata.percent and metadata.currentFile 33 | }); 34 | ``` 35 | -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/documentation/api_jszip/generate_node_stream.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "generateNodeStream(options[, onUpdate])" 3 | layout: default 4 | section: api 5 | --- 6 | 7 | __Description__ : Generates the complete zip file as a nodejs stream. 8 | 9 | __Arguments__ 10 | 11 | name | type | default | description 12 | --------------------|----------|---------|------------ 13 | options | object | | the options to generate the zip file, see [the options of `generateAsync()`]({{site.baseurl}}/documentation/api_jszip/generate_async.html) 14 | onUpdate | function | | The optional function called on each internal update with the metadata. 15 | 16 | The `type` parameter has here the default value of `nodebuffer`. 17 | Only `nodebuffer` is currently supported. 18 | 19 | __Metadata__ : see [the metadata of `generateAsync()`]({{site.baseurl}}/documentation/api_jszip/generate_async.html). 20 | 21 | __Returns__ : a [nodejs Streams3](https://github.com/nodejs/readable-stream). 22 | 23 | __Throws__ : Nothing. 24 | 25 | __Example__ 26 | 27 | ```js 28 | zip 29 | .generateNodeStream({streamFiles:true}) 30 | .pipe(fs.createWriteStream('out.zip')) 31 | .on('finish', function () { 32 | // JSZip generates a readable stream with a "end" event, 33 | // but is piped here in a writable stream which emits a "finish" event. 34 | console.log("out.zip written."); 35 | }); 36 | ``` 37 | -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/documentation/api_jszip/load_async_object.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "JSZip.loadAsync(data [, options])" 3 | layout: default 4 | section: api 5 | --- 6 | 7 | This is a shortcut for 8 | 9 | ```js 10 | var zip = new JSZip(); 11 | zip.loadAsync(data, options); 12 | ``` 13 | 14 | Please see the documentation of [loadAsync]({{site.baseurl}}/documentation/api_jszip/load_async.html). 15 | 16 | 17 | __Examples__ 18 | 19 | ```js 20 | dataAsPromise 21 | .then(JSZip.loadAsync) 22 | .then(function(zip) {...}) 23 | ``` 24 | -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/documentation/api_jszip/remove.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "remove(name)" 3 | layout: default 4 | section: api 5 | --- 6 | 7 | __Description__ : Delete a file or folder (recursively). 8 | 9 | __Arguments__ 10 | 11 | name | type | description 12 | -----|--------|------------ 13 | name | string | the name of the file/folder to delete. 14 | 15 | __Returns__ : The current JSZip object. 16 | 17 | __Throws__ : Nothing. 18 | 19 | 23 | 24 | __Example__ 25 | 26 | ```js 27 | var zip = new JSZip(); 28 | zip.file("Hello.txt", "Hello World\n"); 29 | zip.file("temp.txt", "nothing").remove("temp.txt"); 30 | // result : Hello.txt 31 | 32 | zip.folder("css").file("style.css", "body {background: #FF0000}"); 33 | zip.remove("css"); 34 | //result : empty zip 35 | ``` 36 | 37 | 38 | -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/documentation/api_jszip/support.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "JSZip.support" 3 | layout: default 4 | section: api 5 | --- 6 | 7 | If the browser supports them, JSZip can take advantage of some "new" features : 8 | ArrayBuffer, Blob, Uint8Array. To know if JSZip can use them, you can check the 9 | JSZip.support object. It contains the following boolean properties : 10 | 11 | * `arraybuffer` : true if JSZip can read and generate ArrayBuffer, false otherwise. 12 | * `uint8array` : true if JSZip can read and generate Uint8Array, false otherwise. 13 | * `blob` : true if JSZip can generate Blob, false otherwise. 14 | * `nodebuffer` : true if JSZip can read and generate nodejs Buffer, false otherwise. 15 | * `nodestream` : true if JSZip can read and generate nodejs stream, false otherwise. 16 | 17 | 18 | -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/documentation/api_streamhelper.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "StreamHelper API" 3 | layout: default 4 | section: api 5 | --- 6 | 7 | A `StreamHelper` can be viewed as a pausable stream with some helper methods. 8 | It is not a full featured stream like in nodejs (and can't directly used as one) 9 | but the exposed methods should be enough to write the glue code with other async 10 | libraries : `on('data', function)`, `on('end', function)` and `on('error', function)`. 11 | 12 | It starts paused, be sure to `resume()` it when ready. 13 | 14 | If you are looking for an asynchronous helper without writing glue code, take a 15 | look at `accumulate(function)`. 16 | -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/documentation/api_streamhelper/accumulate.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "accumulate([updateCallback])" 3 | layout: default 4 | section: api 5 | --- 6 | 7 | __Description__ : Read the whole stream and call a callback with the complete content. 8 | 9 | __Arguments__ 10 | 11 | name | type | description 12 | ----------------|----------|------------ 13 | updateCallback | function | the function called every time the stream updates. This function is optional. 14 | 15 | 16 | The update callback function takes 1 parameter : the metadata (see the [`on` method]({{site.baseurl}}/documentation/api_streamhelper/on.html)). 17 | 18 | __Returns__ : A [Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise) 19 | of the full content. 20 | 21 | __Throws__ : Nothing. 22 | 23 | __Example__ 24 | 25 | ```js 26 | zip 27 | .generateInternalStream({type:"uint8array"}) 28 | .accumulate(function updateCallback(metadata) { 29 | // metadata contains for example currentFile and percent, see the generateInternalStream doc. 30 | }).then(function (data) { 31 | // data contains here the complete zip file as a uint8array (the type asked in generateInternalStream) 32 | }); 33 | ``` 34 | -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/documentation/api_streamhelper/on.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "on(event, callback)" 3 | layout: default 4 | section: api 5 | --- 6 | 7 | __Description__ : Register a listener on an event. 8 | 9 | __Arguments__ 10 | 11 | name | type | description 12 | ----------|----------|------------ 13 | event | string | the name of the event. Only 3 events are supported : `data`, `end` and `error`. 14 | callback | function | the function called when the event occurs. See below for the arguments. 15 | 16 | 17 | A `data` callback takes 2 parameters : 18 | 19 | - the current chunk of data (in a format specified by the method which 20 | generated this StreamHelper) 21 | - the metadata (see each method to know what's inside) 22 | 23 | A `end` callback does not take any parameter. 24 | 25 | A `error` callback takes an `Error` as parameter. 26 | 27 | The callbacks are executed in with the current `StreamHelper` as `this`. 28 | 29 | __Returns__ : The current StreamHelper object, for chaining. 30 | 31 | __Throws__ : An exception if the event is unkown. 32 | 33 | __Example__ 34 | 35 | ```js 36 | zip 37 | .generateInternalStream({type:"uint8array"}) 38 | .on('data', function (data, metadata) { 39 | // data is a Uint8Array because that's the type asked in generateInternalStream 40 | // metadata contains for example currentFile and percent, see the generateInternalStream doc. 41 | }) 42 | .on('error', function (e) { 43 | // e is the error 44 | }) 45 | .on('end', function () { 46 | // no parameter 47 | }) 48 | .resume(); 49 | ``` 50 | -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/documentation/api_streamhelper/pause.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "pause()" 3 | layout: default 4 | section: api 5 | --- 6 | 7 | __Description__ : Pause the stream if the stream is running. Once paused, the 8 | stream stops sending `data` events. 9 | 10 | __Arguments__ : None. 11 | 12 | __Returns__ : The current StreamHelper object, for chaining. 13 | 14 | __Throws__ : Nothing. 15 | 16 | __Example__ 17 | 18 | ```js 19 | zip 20 | .generateInternalStream({type:"uint8array"}) 21 | .on('data', function(chunk) { 22 | 23 | // if we push the chunk to an other service which is overloaded, we can 24 | // pause the stream as backpressure. 25 | this.pause(); 26 | 27 | }).resume(); // start the stream the first time 28 | ``` 29 | 30 | -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/documentation/api_streamhelper/resume.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "resume()" 3 | layout: default 4 | section: api 5 | --- 6 | 7 | __Description__ : Resume the stream if the stream is paused. Once resumed, the 8 | stream starts sending `data` events again. 9 | 10 | __Arguments__ : None. 11 | 12 | __Returns__ : The current StreamHelper object, for chaining. 13 | 14 | __Throws__ : Nothing. 15 | 16 | __Example__ 17 | 18 | ```js 19 | zip 20 | .generateInternalStream({type:"uint8array"}) 21 | .on('data', function() {...}) 22 | .resume(); 23 | ``` 24 | -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/documentation/api_zipobject.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "ZipObject API" 3 | layout: default 4 | section: api 5 | --- 6 | 7 | This represents an entry in the zip file. If the entry comes from an existing 8 | archive previously [loaded]({{site.baseurl}}/documentation/api_jszip/load_async.html), the content 9 | will be automatically decompressed/converted first. 10 | 11 | ### Attributes 12 | 13 | attribute name | type | description 14 | ----------------------------|-------------|------------- 15 | `name` | string | the absolute path of the file 16 | `dir` | boolean | true if this is a directory 17 | `date` | date | the last modification date 18 | `comment` | string | the comment for this file 19 | `unixPermissions` | 16 bits number | The UNIX permissions of the file, if any. 20 | `dosPermissions` | 6 bits number | The DOS permissions of the file, if any. 21 | `options` | object | the options of the file. The available options are : 22 | `options.compression` | compression | see [file(name, data [,options])]({{site.baseurl}}/documentation/api_jszip/file_data.html) 23 | 24 | -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/documentation/api_zipobject/async.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "async(type[, onUpdate])" 3 | layout: default 4 | section: api 5 | --- 6 | 7 | __Description__ : Return a [Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise) of the content in the asked type. 8 | 9 | __Arguments__ 10 | 11 | name | type | description 12 | ---------|----------|------------ 13 | type | String | the type of the result : `string` (or `text`, its alias), `binarystring`, `base64`, `array`, `uint8array`, `arraybuffer`, `nodebuffer`. 14 | onUpdate | Function | an optional function called on each internal update with the metadata. 15 | 16 | __Metadata__ : the metadata are : 17 | 18 | name | type | description 19 | ------------|--------|------------ 20 | percent | number | the percent of completion (a double between 0 and 100) 21 | 22 | __Returns__ : A [Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise) of the content. 23 | 24 | __Throws__ : Nothing. 25 | 26 | __Example__ 27 | 28 | ```js 29 | zip 30 | .file("my_text.txt") 31 | .async("string") 32 | .then(function success(content) { 33 | // use the content 34 | }, function error(e) { 35 | // handle the error 36 | }); 37 | ``` 38 | 39 | ```js 40 | zip 41 | .file("my_text.txt") 42 | .async("string", function (meta) { 43 | console.log("Generating the content, we are at " + meta.percent.toFixed(2) + " %"); 44 | }) 45 | .then(...); 46 | ``` 47 | 48 | 49 | -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/documentation/api_zipobject/internal_stream.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "internalStream(type)" 3 | layout: default 4 | section: api 5 | --- 6 | 7 | __Description__ : Return a [StreamHelper]({{site.baseurl}}/documentation/api_streamhelper.html) of the content in the asked type. 8 | 9 | __Arguments__ 10 | 11 | name | type | description 12 | ---------|----------|------------ 13 | type | String | the type of the result : `string`, `binarystring`, `uint8array`, `arraybuffer`, `nodebuffer`. 14 | 15 | 16 | __Returns__ : a [StreamHelper]({{site.baseurl}}/documentation/api_streamhelper.html) of the content in the asked type. 17 | 18 | __Throws__ : Nothing. 19 | 20 | __Example__ 21 | 22 | ```js 23 | zip 24 | .file("my_text.txt") 25 | .internalStream("string") 26 | .on("data", function (data) {...}) 27 | .on("error", function (e) {...}) 28 | .on("end", function () {...}); 29 | ``` 30 | 31 | -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/documentation/api_zipobject/node_stream.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "nodeStream(type[, onUpdate])" 3 | layout: default 4 | section: api 5 | --- 6 | 7 | __Description__ : Return a [nodejs Streams3](https://github.com/nodejs/readable-stream) 8 | of the content in the asked type. 9 | 10 | __Arguments__ 11 | 12 | name | type | default | description 13 | ---------|----------|--------------|------------ 14 | type | String | `nodebuffer` | only `nodebuffer` is currently supported. 15 | onUpdate | Function | | an optional function called on each internal update with the metadata. 16 | 17 | __Metadata__ : see [the metadata of `async()`]({{site.baseurl}}/documentation/api_zipobject/async.html). 18 | 19 | __Returns__ : a [nodejs Streams3](https://github.com/nodejs/readable-stream). 20 | 21 | __Throws__ : Nothing. 22 | 23 | __Example__ 24 | 25 | ```js 26 | zip 27 | .file("my_text.txt") 28 | .nodeStream() 29 | .pipe(fs.createWriteStream('/tmp/my_text.txt')) 30 | .on('finish', function () { 31 | // JSZip generates a readable stream with a "end" event, 32 | // but is piped here in a writable stream which emits a "finish" event. 33 | console.log("text file written."); 34 | }); 35 | ``` 36 | -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/documentation/contributing.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Contributing 3 | layout: default 4 | section: main 5 | --- 6 | 7 | 8 | ### Download the sources 9 | 10 | You should create a [Github](https://github.com/) account and 11 | [fork the repository](https://help.github.com/articles/fork-a-repo) (you will 12 | need one to create the pull request). 13 | 14 | If you just want the get the source code, you can use git and do 15 | `git clone https://github.com/Stuk/jszip.git` to get the sources. You can also 16 | download the latest sources [here](https://github.com/Stuk/jszip/archive/master.zip). 17 | 18 | ### Building the project 19 | 20 | #### Code 21 | 22 | The dependencies are handled by npm, the first step is to run 23 | `npm install` to get the dependencies. 24 | JSZip uses Grunt to handle the build, [see here to install its CLI](http://gruntjs.com/getting-started). 25 | 26 | Here are the interesting build commands : 27 | 28 | * `grunt` will generate the final js file in dist/ and the minified version. 29 | * `npm run test-node` will run the tests in nodejs. 30 | * `npm run test-browser` will the tests in some browsers using SauceLabs, see 31 | below. 32 | * `npm run test` will run the tests in nodejs and in the browser. 33 | * `npm run lint` will use jshint the check the source code. 34 | 35 | #### Documentation 36 | 37 | The documentation uses jekyll on gh-pages. To render the documentation, you 38 | need to [install jekyll](http://jekyllrb.com/docs/installation/) and then run 39 | `jekyll serve --baseurl ''`. 40 | 41 | ### Testing the project 42 | 43 | To test JSZip in nodejs, use `npm run test-node`. 44 | 45 | To test JSZip in a browser, you can open the file `test/index.html` in the 46 | browser you want to test. Don't forget to update the dist/ files with `grunt`. 47 | 48 | You can also test JSZip in a lot of browsers at once with 49 | [SauceLabs](https://saucelabs.com/). You will need a SauceLabs account and two 50 | variables into your environment. On linux, just use 51 | 52 | ```bash 53 | export SAUCE_USERNAME=your-saucelabs-username 54 | export SAUCE_ACCESS_KEY=your-saucelabs-access-key 55 | ``` 56 | 57 | before running the `npm run test-browser` command. 58 | 59 | ### Merging the changes 60 | 61 | If you have tested bug fixes or new features, you can open a 62 | [pull request](https://help.github.com/articles/using-pull-requests) on Github. 63 | -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/documentation/css/main.css: -------------------------------------------------------------------------------- 1 | ul.nav ul { 2 | list-style:none; 3 | margin: 0; 4 | padding: 0 0 0 25px; 5 | } 6 | 7 | #downloader_application form { 8 | margin-bottom: 10px; 9 | } 10 | 11 | #downloader_application ul { 12 | list-style-type: none; 13 | } 14 | 15 | .browser_support th { 16 | border-bottom-width: 3px !important; 17 | } 18 | 19 | .support_ie {border-bottom-color: #0275BA !important;} 20 | .support_ff {border-bottom-color: #DF7215 !important;} 21 | .support_sf {border-bottom-color: #43B3E9 !important;} 22 | .support_cr {border-bottom-color: #39B642 !important;} 23 | .support_op {border-bottom-color: #C42122 !important;} 24 | .support_nd {border-bottom-color: #8CC84B !important;} 25 | -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/documentation/css/pygments.css: -------------------------------------------------------------------------------- 1 | /* Generated with : 2 | * pygmentize -S default -f html > pygments.css 3 | */ 4 | .hll { background-color: #ffffcc } 5 | .c { color: #408080; font-style: italic } /* Comment */ 6 | .err { border: 1px solid #FF0000 } /* Error */ 7 | .k { color: #008000; font-weight: bold } /* Keyword */ 8 | .o { color: #666666 } /* Operator */ 9 | .cm { color: #408080; font-style: italic } /* Comment.Multiline */ 10 | .cp { color: #BC7A00 } /* Comment.Preproc */ 11 | .c1 { color: #408080; font-style: italic } /* Comment.Single */ 12 | .cs { color: #408080; font-style: italic } /* Comment.Special */ 13 | .gd { color: #A00000 } /* Generic.Deleted */ 14 | .ge { font-style: italic } /* Generic.Emph */ 15 | .gr { color: #FF0000 } /* Generic.Error */ 16 | .gh { color: #000080; font-weight: bold } /* Generic.Heading */ 17 | .gi { color: #00A000 } /* Generic.Inserted */ 18 | .go { color: #888888 } /* Generic.Output */ 19 | .gp { color: #000080; font-weight: bold } /* Generic.Prompt */ 20 | .gs { font-weight: bold } /* Generic.Strong */ 21 | .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ 22 | .gt { color: #0044DD } /* Generic.Traceback */ 23 | .kc { color: #008000; font-weight: bold } /* Keyword.Constant */ 24 | .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */ 25 | .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */ 26 | .kp { color: #008000 } /* Keyword.Pseudo */ 27 | .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */ 28 | .kt { color: #B00040 } /* Keyword.Type */ 29 | .m { color: #666666 } /* Literal.Number */ 30 | .s { color: #BA2121 } /* Literal.String */ 31 | .na { color: #7D9029 } /* Name.Attribute */ 32 | .nb { color: #008000 } /* Name.Builtin */ 33 | .nc { color: #0000FF; font-weight: bold } /* Name.Class */ 34 | .no { color: #880000 } /* Name.Constant */ 35 | .nd { color: #AA22FF } /* Name.Decorator */ 36 | .ni { color: #999999; font-weight: bold } /* Name.Entity */ 37 | .ne { color: #D2413A; font-weight: bold } /* Name.Exception */ 38 | .nf { color: #0000FF } /* Name.Function */ 39 | .nl { color: #A0A000 } /* Name.Label */ 40 | .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */ 41 | .nt { color: #008000; font-weight: bold } /* Name.Tag */ 42 | .nv { color: #19177C } /* Name.Variable */ 43 | .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */ 44 | .w { color: #bbbbbb } /* Text.Whitespace */ 45 | .mf { color: #666666 } /* Literal.Number.Float */ 46 | .mh { color: #666666 } /* Literal.Number.Hex */ 47 | .mi { color: #666666 } /* Literal.Number.Integer */ 48 | .mo { color: #666666 } /* Literal.Number.Oct */ 49 | .sb { color: #BA2121 } /* Literal.String.Backtick */ 50 | .sc { color: #BA2121 } /* Literal.String.Char */ 51 | .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */ 52 | .s2 { color: #BA2121 } /* Literal.String.Double */ 53 | .se { color: #BB6622; font-weight: bold } /* Literal.String.Escape */ 54 | .sh { color: #BA2121 } /* Literal.String.Heredoc */ 55 | .si { color: #BB6688; font-weight: bold } /* Literal.String.Interpol */ 56 | .sx { color: #008000 } /* Literal.String.Other */ 57 | .sr { color: #BB6688 } /* Literal.String.Regex */ 58 | .s1 { color: #BA2121 } /* Literal.String.Single */ 59 | .ss { color: #19177C } /* Literal.String.Symbol */ 60 | .bp { color: #008000 } /* Name.Builtin.Pseudo */ 61 | .vc { color: #19177C } /* Name.Variable.Class */ 62 | .vg { color: #19177C } /* Name.Variable.Global */ 63 | .vi { color: #19177C } /* Name.Variable.Instance */ 64 | .il { color: #666666 } /* Literal.Number.Integer.Long */ 65 | -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/documentation/examples/download-zip-file.html: -------------------------------------------------------------------------------- 1 | --- 2 | title: "Download the generated zip file" 3 | layout: default 4 | section: example 5 | --- 6 | 7 |

Tip : check the source of the page !

8 |

The FileSaver API

9 |
10 | Works on firefox, chrome , opera >= 15 and IE >= 10 (but NOT in compatibility view).
11 | 12 |
13 |

The data URL

14 |
15 | Does not work in IE, has restrictions on the length.
16 | 17 |
18 | 62 | -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/documentation/examples/downloader.html: -------------------------------------------------------------------------------- 1 | --- 2 | title: "Mini app : Downloader" 3 | layout: default 4 | section: example 5 | --- 6 | 7 |

Tip : check the source of the page !

8 | 9 |

10 | This mini application let you choose the files you want in a list, download 11 | them, zip them and give the result to the user. 12 |

13 |

14 | This demo requires a recent browser, see 15 | the howto. 16 |

17 | 18 | 19 | 20 |
21 |

Please select your files

22 |
23 |
    24 |
  • 25 | 29 |
  • 30 |
  • 31 | 35 |
  • 36 |
  • 37 | 41 |
  • 42 |
  • 43 | 47 |
  • 48 |
49 | 50 | 51 |
52 | 53 |
54 |
55 |
56 |
57 | 58 |

59 | 60 |
61 | 62 | 63 | -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/documentation/examples/downloader.js: -------------------------------------------------------------------------------- 1 | jQuery(function ($) { 2 | "use strict"; 3 | 4 | var Promise = window.Promise; 5 | if (!Promise) { 6 | Promise = JSZip.external.Promise; 7 | } 8 | 9 | /** 10 | * Reset the message. 11 | */ 12 | function resetMessage () { 13 | $("#result") 14 | .removeClass() 15 | .text(""); 16 | } 17 | /** 18 | * show a successful message. 19 | * @param {String} text the text to show. 20 | */ 21 | function showMessage(text) { 22 | resetMessage(); 23 | $("#result") 24 | .addClass("alert alert-success") 25 | .text(text); 26 | } 27 | /** 28 | * show an error message. 29 | * @param {String} text the text to show. 30 | */ 31 | function showError(text) { 32 | resetMessage(); 33 | $("#result") 34 | .addClass("alert alert-danger") 35 | .text(text); 36 | } 37 | /** 38 | * Update the progress bar. 39 | * @param {Integer} percent the current percent 40 | */ 41 | function updatePercent(percent) { 42 | $("#progress_bar").removeClass("hide") 43 | .find(".progress-bar") 44 | .attr("aria-valuenow", percent) 45 | .css({ 46 | width : percent + "%" 47 | }); 48 | } 49 | 50 | /** 51 | * Fetch the content and return the associated promise. 52 | * @param {String} url the url of the content to fetch. 53 | * @return {Promise} the promise containing the data. 54 | */ 55 | function urlToPromise(url) { 56 | return new Promise(function(resolve, reject) { 57 | JSZipUtils.getBinaryContent(url, function (err, data) { 58 | if(err) { 59 | reject(err); 60 | } else { 61 | resolve(data); 62 | } 63 | }); 64 | }); 65 | } 66 | 67 | if(!JSZip.support.blob) { 68 | showError("This demo works only with a recent browser !"); 69 | return; 70 | } 71 | 72 | var $form = $("#download_form").on("submit", function () { 73 | 74 | resetMessage(); 75 | 76 | var zip = new JSZip(); 77 | 78 | // find every checked item 79 | $(this).find(":checked").each(function () { 80 | var $this = $(this); 81 | var url = $this.data("url"); 82 | var filename = url.replace(/.*\//g, ""); 83 | zip.file(filename, urlToPromise(url), {binary:true}); 84 | }); 85 | 86 | // when everything has been downloaded, we can trigger the dl 87 | zip.generateAsync({type:"blob"}, function updateCallback(metadata) { 88 | var msg = "progression : " + metadata.percent.toFixed(2) + " %"; 89 | if(metadata.currentFile) { 90 | msg += ", current file = " + metadata.currentFile; 91 | } 92 | showMessage(msg); 93 | updatePercent(metadata.percent|0); 94 | }) 95 | .then(function callback(blob) { 96 | 97 | // see FileSaver.js 98 | saveAs(blob, "example.zip"); 99 | 100 | showMessage("done !"); 101 | }, function (e) { 102 | showError(e); 103 | }); 104 | 105 | return false; 106 | }); 107 | }); 108 | 109 | // vim: set shiftwidth=4 softtabstop=4: 110 | -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/documentation/examples/get-binary-files-ajax.html: -------------------------------------------------------------------------------- 1 | --- 2 | title: "Get a file with an ajax call" 3 | layout: default 4 | section: example 5 | --- 6 | 7 |

Tip : check the source of the page !

8 | 9 |

With JSZipUtils

10 |
11 | 12 |

With the Fetch API

13 |
14 | 15 | 82 | -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/documentation/examples/read-local-file-api.html: -------------------------------------------------------------------------------- 1 | --- 2 | title: "Reading a local file with the File API" 3 | layout: default 4 | section: example 5 | --- 6 | 7 |

Choose the local(s) zip file(s)

8 |

Note : your browser will process the zip file, don't choose a file too big !

9 |
10 | 11 | 14 | 15 | 19 | 20 | 73 | -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/documentation/faq.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "Frequently Asked Questions" 3 | layout: default 4 | section: main 5 | --- 6 | 7 | ### "Corrupted zip or bug : unexpected signature" 8 | 9 | If you are sure that the zip file is correct, that error often comes from a 10 | corrupted content. An ajax request, if not prepared correctly, will try to 11 | decode the binary content as a text and corrupt it. See 12 | [this page]({{site.baseurl}}/documentation/howto/read_zip.html). 13 | 14 | ### My browser crashes / becomes unresponsive / never finish the execution 15 | 16 | That happens if you try to handle to much data with the synchronous API. If 17 | possible, try the asynchronous API, see 18 | [this page]({{site.baseurl}}/documentation/limitations.html) for more informations. 19 | -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/lib/base64.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | var utils = require('./utils'); 3 | var support = require('./support'); 4 | // private property 5 | var _keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; 6 | 7 | 8 | // public method for encoding 9 | exports.encode = function(input) { 10 | var output = []; 11 | var chr1, chr2, chr3, enc1, enc2, enc3, enc4; 12 | var i = 0, len = input.length, remainingBytes = len; 13 | 14 | var isArray = utils.getTypeOf(input) !== "string"; 15 | while (i < input.length) { 16 | remainingBytes = len - i; 17 | 18 | if (!isArray) { 19 | chr1 = input.charCodeAt(i++); 20 | chr2 = i < len ? input.charCodeAt(i++) : 0; 21 | chr3 = i < len ? input.charCodeAt(i++) : 0; 22 | } else { 23 | chr1 = input[i++]; 24 | chr2 = i < len ? input[i++] : 0; 25 | chr3 = i < len ? input[i++] : 0; 26 | } 27 | 28 | enc1 = chr1 >> 2; 29 | enc2 = ((chr1 & 3) << 4) | (chr2 >> 4); 30 | enc3 = remainingBytes > 1 ? (((chr2 & 15) << 2) | (chr3 >> 6)) : 64; 31 | enc4 = remainingBytes > 2 ? (chr3 & 63) : 64; 32 | 33 | output.push(_keyStr.charAt(enc1) + _keyStr.charAt(enc2) + _keyStr.charAt(enc3) + _keyStr.charAt(enc4)); 34 | 35 | } 36 | 37 | return output.join(""); 38 | }; 39 | 40 | // public method for decoding 41 | exports.decode = function(input) { 42 | var chr1, chr2, chr3; 43 | var enc1, enc2, enc3, enc4; 44 | var i = 0, resultIndex = 0; 45 | 46 | input = input.replace(/[^A-Za-z0-9\+\/\=]/g, ""); 47 | 48 | var totalLength = input.length * 3 / 4; 49 | if(input.charAt(input.length - 1) === _keyStr.charAt(64)) { 50 | totalLength--; 51 | } 52 | if(input.charAt(input.length - 2) === _keyStr.charAt(64)) { 53 | totalLength--; 54 | } 55 | var output; 56 | if (support.uint8array) { 57 | output = new Uint8Array(totalLength); 58 | } else { 59 | output = new Array(totalLength); 60 | } 61 | 62 | while (i < input.length) { 63 | 64 | enc1 = _keyStr.indexOf(input.charAt(i++)); 65 | enc2 = _keyStr.indexOf(input.charAt(i++)); 66 | enc3 = _keyStr.indexOf(input.charAt(i++)); 67 | enc4 = _keyStr.indexOf(input.charAt(i++)); 68 | 69 | chr1 = (enc1 << 2) | (enc2 >> 4); 70 | chr2 = ((enc2 & 15) << 4) | (enc3 >> 2); 71 | chr3 = ((enc3 & 3) << 6) | enc4; 72 | 73 | output[resultIndex++] = chr1; 74 | 75 | if (enc3 !== 64) { 76 | output[resultIndex++] = chr2; 77 | } 78 | if (enc4 !== 64) { 79 | output[resultIndex++] = chr3; 80 | } 81 | 82 | } 83 | 84 | return output; 85 | }; 86 | -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/lib/compressedObject.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var external = require("./external"); 4 | var DataWorker = require('./stream/DataWorker'); 5 | var DataLengthProbe = require('./stream/DataLengthProbe'); 6 | var Crc32Probe = require('./stream/Crc32Probe'); 7 | var DataLengthProbe = require('./stream/DataLengthProbe'); 8 | 9 | /** 10 | * Represent a compressed object, with everything needed to decompress it. 11 | * @constructor 12 | * @param {number} compressedSize the size of the data compressed. 13 | * @param {number} uncompressedSize the size of the data after decompression. 14 | * @param {number} crc32 the crc32 of the decompressed file. 15 | * @param {object} compression the type of compression, see lib/compressions.js. 16 | * @param {String|ArrayBuffer|Uint8Array|Buffer} data the compressed data. 17 | */ 18 | function CompressedObject(compressedSize, uncompressedSize, crc32, compression, data) { 19 | this.compressedSize = compressedSize; 20 | this.uncompressedSize = uncompressedSize; 21 | this.crc32 = crc32; 22 | this.compression = compression; 23 | this.compressedContent = data; 24 | } 25 | 26 | CompressedObject.prototype = { 27 | /** 28 | * Create a worker to get the uncompressed content. 29 | * @return {GenericWorker} the worker. 30 | */ 31 | getContentWorker : function () { 32 | var worker = new DataWorker(external.Promise.resolve(this.compressedContent)) 33 | .pipe(this.compression.uncompressWorker()) 34 | .pipe(new DataLengthProbe("data_length")); 35 | 36 | var that = this; 37 | worker.on("end", function () { 38 | if(this.streamInfo['data_length'] !== that.uncompressedSize) { 39 | throw new Error("Bug : uncompressed data size mismatch"); 40 | } 41 | }); 42 | return worker; 43 | }, 44 | /** 45 | * Create a worker to get the compressed content. 46 | * @return {GenericWorker} the worker. 47 | */ 48 | getCompressedWorker : function () { 49 | return new DataWorker(external.Promise.resolve(this.compressedContent)) 50 | .withStreamInfo("compressedSize", this.compressedSize) 51 | .withStreamInfo("uncompressedSize", this.uncompressedSize) 52 | .withStreamInfo("crc32", this.crc32) 53 | .withStreamInfo("compression", this.compression) 54 | ; 55 | } 56 | }; 57 | 58 | /** 59 | * Chain the given worker with other workers to compress the content with the 60 | * given compresion. 61 | * @param {GenericWorker} uncompressedWorker the worker to pipe. 62 | * @param {Object} compression the compression object. 63 | * @param {Object} compressionOptions the options to use when compressing. 64 | * @return {GenericWorker} the new worker compressing the content. 65 | */ 66 | CompressedObject.createWorkerFrom = function (uncompressedWorker, compression, compressionOptions) { 67 | return uncompressedWorker 68 | .pipe(new Crc32Probe()) 69 | .pipe(new DataLengthProbe("uncompressedSize")) 70 | .pipe(compression.compressWorker(compressionOptions)) 71 | .pipe(new DataLengthProbe("compressedSize")) 72 | .withStreamInfo("compression", compression); 73 | }; 74 | 75 | module.exports = CompressedObject; 76 | -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/lib/compressions.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var GenericWorker = require("./stream/GenericWorker"); 4 | 5 | exports.STORE = { 6 | magic: "\x00\x00", 7 | compressWorker : function (compressionOptions) { 8 | return new GenericWorker("STORE compression"); 9 | }, 10 | uncompressWorker : function () { 11 | return new GenericWorker("STORE decompression"); 12 | } 13 | }; 14 | exports.DEFLATE = require('./flate'); 15 | -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/lib/crc32.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var utils = require('./utils'); 4 | 5 | /** 6 | * The following functions come from pako, from pako/lib/zlib/crc32.js 7 | * released under the MIT license, see pako https://github.com/nodeca/pako/ 8 | */ 9 | 10 | // Use ordinary array, since untyped makes no boost here 11 | function makeTable() { 12 | var c, table = []; 13 | 14 | for(var n =0; n < 256; n++){ 15 | c = n; 16 | for(var k =0; k < 8; k++){ 17 | c = ((c&1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1)); 18 | } 19 | table[n] = c; 20 | } 21 | 22 | return table; 23 | } 24 | 25 | // Create table on load. Just 255 signed longs. Not a problem. 26 | var crcTable = makeTable(); 27 | 28 | 29 | function crc32(crc, buf, len, pos) { 30 | var t = crcTable, end = pos + len; 31 | 32 | crc = crc ^ (-1); 33 | 34 | for (var i = pos; i < end; i++ ) { 35 | crc = (crc >>> 8) ^ t[(crc ^ buf[i]) & 0xFF]; 36 | } 37 | 38 | return (crc ^ (-1)); // >>> 0; 39 | } 40 | 41 | // That's all for the pako functions. 42 | 43 | /** 44 | * Compute the crc32 of a string. 45 | * This is almost the same as the function crc32, but for strings. Using the 46 | * same function for the two use cases leads to horrible performances. 47 | * @param {Number} crc the starting value of the crc. 48 | * @param {String} str the string to use. 49 | * @param {Number} len the length of the string. 50 | * @param {Number} pos the starting position for the crc32 computation. 51 | * @return {Number} the computed crc32. 52 | */ 53 | function crc32str(crc, str, len, pos) { 54 | var t = crcTable, end = pos + len; 55 | 56 | crc = crc ^ (-1); 57 | 58 | for (var i = pos; i < end; i++ ) { 59 | crc = (crc >>> 8) ^ t[(crc ^ str.charCodeAt(i)) & 0xFF]; 60 | } 61 | 62 | return (crc ^ (-1)); // >>> 0; 63 | } 64 | 65 | module.exports = function crc32wrapper(input, crc) { 66 | if (typeof input === "undefined" || !input.length) { 67 | return 0; 68 | } 69 | 70 | var isArray = utils.getTypeOf(input) !== "string"; 71 | 72 | if(isArray) { 73 | return crc32(crc|0, input, input.length, 0); 74 | } else { 75 | return crc32str(crc|0, input, input.length, 0); 76 | } 77 | }; 78 | // vim: set shiftwidth=4 softtabstop=4: 79 | -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/lib/defaults.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | exports.base64 = false; 3 | exports.binary = false; 4 | exports.dir = false; 5 | exports.createFolders = true; 6 | exports.date = null; 7 | exports.compression = null; 8 | exports.compressionOptions = null; 9 | exports.comment = null; 10 | exports.unixPermissions = null; 11 | exports.dosPermissions = null; 12 | -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/lib/external.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var ES6Promise = require("es6-promise").Promise; 4 | 5 | /** 6 | * Let the user use/change some implementations. 7 | */ 8 | module.exports = { 9 | Promise: ES6Promise 10 | }; 11 | -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/lib/flate.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | var USE_TYPEDARRAY = (typeof Uint8Array !== 'undefined') && (typeof Uint16Array !== 'undefined') && (typeof Uint32Array !== 'undefined'); 3 | 4 | var pako = require("pako"); 5 | var utils = require("./utils"); 6 | var GenericWorker = require("./stream/GenericWorker"); 7 | 8 | var ARRAY_TYPE = USE_TYPEDARRAY ? "uint8array" : "array"; 9 | 10 | exports.magic = "\x08\x00"; 11 | 12 | /** 13 | * Create a worker that uses pako to inflate/deflate. 14 | * @constructor 15 | * @param {String} action the name of the pako function to call : either "Deflate" or "Inflate". 16 | * @param {Object} options the options to use when (de)compressing. 17 | */ 18 | function FlateWorker(action, options) { 19 | GenericWorker.call(this, "FlateWorker/" + action); 20 | 21 | this._pako = new pako[action]({ 22 | raw:true, 23 | level : options.level || -1 // default compression 24 | }); 25 | // the `meta` object from the last chunk received 26 | // this allow this worker to pass around metadata 27 | this.meta = {}; 28 | 29 | var self = this; 30 | this._pako.onData = function(data) { 31 | self.push({ 32 | data : data, 33 | meta : self.meta 34 | }); 35 | }; 36 | } 37 | 38 | utils.inherits(FlateWorker, GenericWorker); 39 | 40 | /** 41 | * @see GenericWorker.processChunk 42 | */ 43 | FlateWorker.prototype.processChunk = function (chunk) { 44 | this.meta = chunk.meta; 45 | this._pako.push(utils.transformTo(ARRAY_TYPE, chunk.data), false); 46 | }; 47 | 48 | /** 49 | * @see GenericWorker.flush 50 | */ 51 | FlateWorker.prototype.flush = function () { 52 | GenericWorker.prototype.flush.call(this); 53 | this._pako.push([], true); 54 | }; 55 | /** 56 | * @see GenericWorker.cleanUp 57 | */ 58 | FlateWorker.prototype.cleanUp = function () { 59 | GenericWorker.prototype.cleanUp.call(this); 60 | this._pako = null; 61 | }; 62 | 63 | exports.compressWorker = function (compressionOptions) { 64 | return new FlateWorker("Deflate", compressionOptions); 65 | }; 66 | exports.uncompressWorker = function () { 67 | return new FlateWorker("Inflate", {}); 68 | }; 69 | -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/lib/generate/index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var compressions = require('../compressions'); 4 | var ZipFileWorker = require('./ZipFileWorker'); 5 | 6 | /** 7 | * Find the compression to use. 8 | * @param {String} fileCompression the compression defined at the file level, if any. 9 | * @param {String} zipCompression the compression defined at the load() level. 10 | * @return {Object} the compression object to use. 11 | */ 12 | var getCompression = function (fileCompression, zipCompression) { 13 | 14 | var compressionName = fileCompression || zipCompression; 15 | var compression = compressions[compressionName]; 16 | if (!compression) { 17 | throw new Error(compressionName + " is not a valid compression method !"); 18 | } 19 | return compression; 20 | }; 21 | 22 | /** 23 | * Create a worker to generate a zip file. 24 | * @param {JSZip} zip the JSZip instance at the right root level. 25 | * @param {Object} options to generate the zip file. 26 | * @param {String} comment the comment to use. 27 | */ 28 | exports.generateWorker = function (zip, options, comment) { 29 | 30 | var zipFileWorker = new ZipFileWorker(options.streamFiles, comment, options.platform, options.encodeFileName); 31 | var entriesCount = 0; 32 | try { 33 | 34 | zip.forEach(function (relativePath, file) { 35 | entriesCount++; 36 | var compression = getCompression(file.options.compression, options.compression); 37 | var compressionOptions = file.options.compressionOptions || options.compressionOptions || {}; 38 | var dir = file.dir, date = file.date; 39 | 40 | file._compressWorker(compression, compressionOptions) 41 | .withStreamInfo("file", { 42 | name : relativePath, 43 | dir : dir, 44 | date : date, 45 | comment : file.comment || "", 46 | unixPermissions : file.unixPermissions, 47 | dosPermissions : file.dosPermissions 48 | }) 49 | .pipe(zipFileWorker); 50 | }); 51 | zipFileWorker.entriesCount = entriesCount; 52 | } catch (e) { 53 | zipFileWorker.error(e); 54 | } 55 | 56 | return zipFileWorker; 57 | }; 58 | -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/lib/index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | /** 4 | * Representation a of zip file in js 5 | * @constructor 6 | */ 7 | function JSZip() { 8 | // if this constructor is used without `new`, it adds `new` before itself: 9 | if(!(this instanceof JSZip)) { 10 | return new JSZip(); 11 | } 12 | 13 | if(arguments.length) { 14 | throw new Error("The constructor with parameters has been removed in JSZip 3.0, please check the upgrade guide."); 15 | } 16 | 17 | // object containing the files : 18 | // { 19 | // "folder/" : {...}, 20 | // "folder/data.txt" : {...} 21 | // } 22 | this.files = {}; 23 | 24 | this.comment = null; 25 | 26 | // Where we are in the hierarchy 27 | this.root = ""; 28 | this.clone = function() { 29 | var newObj = new JSZip(); 30 | for (var i in this) { 31 | if (typeof this[i] !== "function") { 32 | newObj[i] = this[i]; 33 | } 34 | } 35 | return newObj; 36 | }; 37 | } 38 | JSZip.prototype = require('./object'); 39 | JSZip.prototype.loadAsync = require('./load'); 40 | JSZip.support = require('./support'); 41 | JSZip.defaults = require('./defaults'); 42 | 43 | JSZip.loadAsync = function (content, options) { 44 | return new JSZip().loadAsync(content, options); 45 | }; 46 | 47 | JSZip.external = require("./external"); 48 | module.exports = JSZip; 49 | -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/lib/license_header.js: -------------------------------------------------------------------------------- 1 | /*! 2 | 3 | JSZip - A Javascript class for generating and reading zip files 4 | 5 | 6 | (c) 2009-2016 Stuart Knightley 7 | Dual licenced under the MIT license or GPLv3. See https://raw.github.com/Stuk/jszip/master/LICENSE.markdown. 8 | 9 | JSZip uses the library pako released under the MIT license : 10 | https://github.com/nodeca/pako/blob/master/LICENSE 11 | */ 12 | -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/lib/load.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | var utils = require('./utils'); 3 | var external = require("./external"); 4 | var utf8 = require('./utf8'); 5 | var utils = require('./utils'); 6 | var ZipEntries = require('./zipEntries'); 7 | var Crc32Probe = require('./stream/Crc32Probe'); 8 | var nodejsUtils = require("./nodejsUtils"); 9 | 10 | /** 11 | * Check the CRC32 of an entry. 12 | * @param {ZipEntry} zipEntry the zip entry to check. 13 | * @return {Promise} the result. 14 | */ 15 | function checkEntryCRC32(zipEntry) { 16 | return new external.Promise(function (resolve, reject) { 17 | var worker = zipEntry.decompressed.getContentWorker().pipe(new Crc32Probe()); 18 | worker.on("error", function (e) { 19 | reject(e); 20 | }) 21 | .on("end", function () { 22 | if (worker.streamInfo.crc32 !== zipEntry.decompressed.crc32) { 23 | reject(new Error("Corrupted zip : CRC32 mismatch")); 24 | } else { 25 | resolve(); 26 | } 27 | }) 28 | .resume(); 29 | }); 30 | } 31 | 32 | module.exports = function(data, options) { 33 | var zip = this; 34 | options = utils.extend(options || {}, { 35 | base64: false, 36 | checkCRC32: false, 37 | optimizedBinaryString: false, 38 | createFolders: false, 39 | decodeFileName: utf8.utf8decode 40 | }); 41 | 42 | if (nodejsUtils.isNode && nodejsUtils.isStream(data)) { 43 | return external.Promise.reject(new Error("JSZip can't accept a stream when loading a zip file.")); 44 | } 45 | 46 | return utils.prepareContent("the loaded zip file", data, true, options.optimizedBinaryString, options.base64) 47 | .then(function(data) { 48 | var zipEntries = new ZipEntries(options); 49 | zipEntries.load(data); 50 | return zipEntries; 51 | }).then(function checkCRC32(zipEntries) { 52 | var promises = [external.Promise.resolve(zipEntries)]; 53 | var files = zipEntries.files; 54 | if (options.checkCRC32) { 55 | for (var i = 0; i < files.length; i++) { 56 | promises.push(checkEntryCRC32(files[i])); 57 | } 58 | } 59 | return external.Promise.all(promises); 60 | }).then(function addFiles(results) { 61 | var zipEntries = results.shift(); 62 | var files = zipEntries.files; 63 | for (var i = 0; i < files.length; i++) { 64 | var input = files[i]; 65 | zip.file(input.fileNameStr, input.decompressed, { 66 | binary: true, 67 | optimizedBinaryString: true, 68 | date: input.date, 69 | dir: input.dir, 70 | comment : input.fileCommentStr.length ? input.fileCommentStr : null, 71 | unixPermissions : input.unixPermissions, 72 | dosPermissions : input.dosPermissions, 73 | createFolders: options.createFolders 74 | }); 75 | } 76 | if (zipEntries.zipComment.length) { 77 | zip.comment = zipEntries.zipComment; 78 | } 79 | 80 | return zip; 81 | }); 82 | }; 83 | -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/lib/nodejs/NodejsStreamInputAdapter.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | var utils = require('../utils'); 4 | var GenericWorker = require('../stream/GenericWorker'); 5 | 6 | /** 7 | * A worker that use a nodejs stream as source. 8 | * @constructor 9 | * @param {String} filename the name of the file entry for this stream. 10 | * @param {Readable} stream the nodejs stream. 11 | */ 12 | function NodejsStreamInputAdapter(filename, stream) { 13 | GenericWorker.call(this, "Nodejs stream input adapter for " + filename); 14 | this._upstreamEnded = false; 15 | this._bindStream(stream); 16 | } 17 | 18 | utils.inherits(NodejsStreamInputAdapter, GenericWorker); 19 | 20 | /** 21 | * Prepare the stream and bind the callbacks on it. 22 | * Do this ASAP on node 0.10 ! A lazy binding doesn't always work. 23 | * @param {Stream} stream the nodejs stream to use. 24 | */ 25 | NodejsStreamInputAdapter.prototype._bindStream = function (stream) { 26 | var self = this; 27 | this._stream = stream; 28 | stream.pause(); 29 | stream 30 | .on("data", function (chunk) { 31 | self.push({ 32 | data: chunk, 33 | meta : { 34 | percent : 0 35 | } 36 | }); 37 | }) 38 | .on("error", function (e) { 39 | if(self.isPaused) { 40 | this.generatedError = e; 41 | } else { 42 | self.error(e); 43 | } 44 | }) 45 | .on("end", function () { 46 | if(self.isPaused) { 47 | self._upstreamEnded = true; 48 | } else { 49 | self.end(); 50 | } 51 | }); 52 | }; 53 | NodejsStreamInputAdapter.prototype.pause = function () { 54 | if(!GenericWorker.prototype.pause.call(this)) { 55 | return false; 56 | } 57 | this._stream.pause(); 58 | return true; 59 | }; 60 | NodejsStreamInputAdapter.prototype.resume = function () { 61 | if(!GenericWorker.prototype.resume.call(this)) { 62 | return false; 63 | } 64 | 65 | if(this._upstreamEnded) { 66 | this.end(); 67 | } else { 68 | this._stream.resume(); 69 | } 70 | 71 | return true; 72 | }; 73 | 74 | module.exports = NodejsStreamInputAdapter; 75 | -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/lib/nodejs/NodejsStreamOutputAdapter.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var Readable = require('readable-stream').Readable; 4 | 5 | var util = require('util'); 6 | util.inherits(NodejsStreamOutputAdapter, Readable); 7 | 8 | /** 9 | * A nodejs stream using a worker as source. 10 | * @see the SourceWrapper in http://nodejs.org/api/stream.html 11 | * @constructor 12 | * @param {StreamHelper} helper the helper wrapping the worker 13 | * @param {Object} options the nodejs stream options 14 | * @param {Function} updateCb the update callback. 15 | */ 16 | function NodejsStreamOutputAdapter(helper, options, updateCb) { 17 | Readable.call(this, options); 18 | this._helper = helper; 19 | 20 | var self = this; 21 | helper.on("data", function (data, meta) { 22 | if (!self.push(data)) { 23 | self._helper.pause(); 24 | } 25 | if(updateCb) { 26 | updateCb(meta); 27 | } 28 | }) 29 | .on("error", function(e) { 30 | self.emit('error', e); 31 | }) 32 | .on("end", function () { 33 | self.push(null); 34 | }); 35 | } 36 | 37 | 38 | NodejsStreamOutputAdapter.prototype._read = function() { 39 | this._helper.resume(); 40 | }; 41 | 42 | module.exports = NodejsStreamOutputAdapter; 43 | -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/lib/nodejsUtils.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | module.exports = { 4 | /** 5 | * True if this is running in Nodejs, will be undefined in a browser. 6 | * In a browser, browserify won't include this file and the whole module 7 | * will be resolved an empty object. 8 | */ 9 | isNode : typeof Buffer !== "undefined", 10 | /** 11 | * Create a new nodejs Buffer. 12 | * @param {Object} data the data to pass to the constructor. 13 | * @param {String} encoding the encoding to use. 14 | * @return {Buffer} a new Buffer. 15 | */ 16 | newBuffer : function(data, encoding){ 17 | return new Buffer(data, encoding); 18 | }, 19 | /** 20 | * Find out if an object is a Buffer. 21 | * @param {Object} b the object to test. 22 | * @return {Boolean} true if the object is a Buffer, false otherwise. 23 | */ 24 | isBuffer : function(b){ 25 | return Buffer.isBuffer(b); 26 | }, 27 | 28 | isStream : function (obj) { 29 | return obj && 30 | typeof obj.on === "function" && 31 | typeof obj.pause === "function" && 32 | typeof obj.resume === "function"; 33 | } 34 | }; 35 | -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/lib/reader/ArrayReader.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | var DataReader = require('./DataReader'); 3 | var utils = require('../utils'); 4 | 5 | function ArrayReader(data) { 6 | DataReader.call(this, data); 7 | for(var i = 0; i < this.data.length; i++) { 8 | data[i] = data[i] & 0xFF; 9 | } 10 | } 11 | utils.inherits(ArrayReader, DataReader); 12 | /** 13 | * @see DataReader.byteAt 14 | */ 15 | ArrayReader.prototype.byteAt = function(i) { 16 | return this.data[this.zero + i]; 17 | }; 18 | /** 19 | * @see DataReader.lastIndexOfSignature 20 | */ 21 | ArrayReader.prototype.lastIndexOfSignature = function(sig) { 22 | var sig0 = sig.charCodeAt(0), 23 | sig1 = sig.charCodeAt(1), 24 | sig2 = sig.charCodeAt(2), 25 | sig3 = sig.charCodeAt(3); 26 | for (var i = this.length - 4; i >= 0; --i) { 27 | if (this.data[i] === sig0 && this.data[i + 1] === sig1 && this.data[i + 2] === sig2 && this.data[i + 3] === sig3) { 28 | return i - this.zero; 29 | } 30 | } 31 | 32 | return -1; 33 | }; 34 | /** 35 | * @see DataReader.readAndCheckSignature 36 | */ 37 | ArrayReader.prototype.readAndCheckSignature = function (sig) { 38 | var sig0 = sig.charCodeAt(0), 39 | sig1 = sig.charCodeAt(1), 40 | sig2 = sig.charCodeAt(2), 41 | sig3 = sig.charCodeAt(3), 42 | data = this.readData(4); 43 | return sig0 === data[0] && sig1 === data[1] && sig2 === data[2] && sig3 === data[3]; 44 | }; 45 | /** 46 | * @see DataReader.readData 47 | */ 48 | ArrayReader.prototype.readData = function(size) { 49 | this.checkOffset(size); 50 | if(size === 0) { 51 | return []; 52 | } 53 | var result = this.data.slice(this.zero + this.index, this.zero + this.index + size); 54 | this.index += size; 55 | return result; 56 | }; 57 | module.exports = ArrayReader; 58 | -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/lib/reader/NodeBufferReader.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | var Uint8ArrayReader = require('./Uint8ArrayReader'); 3 | var utils = require('../utils'); 4 | 5 | function NodeBufferReader(data) { 6 | Uint8ArrayReader.call(this, data); 7 | } 8 | utils.inherits(NodeBufferReader, Uint8ArrayReader); 9 | 10 | /** 11 | * @see DataReader.readData 12 | */ 13 | NodeBufferReader.prototype.readData = function(size) { 14 | this.checkOffset(size); 15 | var result = this.data.slice(this.zero + this.index, this.zero + this.index + size); 16 | this.index += size; 17 | return result; 18 | }; 19 | module.exports = NodeBufferReader; 20 | -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/lib/reader/StringReader.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | var DataReader = require('./DataReader'); 3 | var utils = require('../utils'); 4 | 5 | function StringReader(data) { 6 | DataReader.call(this, data); 7 | } 8 | utils.inherits(StringReader, DataReader); 9 | /** 10 | * @see DataReader.byteAt 11 | */ 12 | StringReader.prototype.byteAt = function(i) { 13 | return this.data.charCodeAt(this.zero + i); 14 | }; 15 | /** 16 | * @see DataReader.lastIndexOfSignature 17 | */ 18 | StringReader.prototype.lastIndexOfSignature = function(sig) { 19 | return this.data.lastIndexOf(sig) - this.zero; 20 | }; 21 | /** 22 | * @see DataReader.readAndCheckSignature 23 | */ 24 | StringReader.prototype.readAndCheckSignature = function (sig) { 25 | var data = this.readData(4); 26 | return sig === data; 27 | }; 28 | /** 29 | * @see DataReader.readData 30 | */ 31 | StringReader.prototype.readData = function(size) { 32 | this.checkOffset(size); 33 | // this will work because the constructor applied the "& 0xff" mask. 34 | var result = this.data.slice(this.zero + this.index, this.zero + this.index + size); 35 | this.index += size; 36 | return result; 37 | }; 38 | module.exports = StringReader; 39 | -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/lib/reader/Uint8ArrayReader.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | var ArrayReader = require('./ArrayReader'); 3 | var utils = require('../utils'); 4 | 5 | function Uint8ArrayReader(data) { 6 | ArrayReader.call(this, data); 7 | } 8 | utils.inherits(Uint8ArrayReader, ArrayReader); 9 | /** 10 | * @see DataReader.readData 11 | */ 12 | Uint8ArrayReader.prototype.readData = function(size) { 13 | this.checkOffset(size); 14 | if(size === 0) { 15 | // in IE10, when using subarray(idx, idx), we get the array [0x00] instead of []. 16 | return new Uint8Array(0); 17 | } 18 | var result = this.data.subarray(this.zero + this.index, this.zero + this.index + size); 19 | this.index += size; 20 | return result; 21 | }; 22 | module.exports = Uint8ArrayReader; 23 | -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/lib/reader/readerFor.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var utils = require('../utils'); 4 | var support = require('../support'); 5 | var ArrayReader = require('./ArrayReader'); 6 | var StringReader = require('./StringReader'); 7 | var NodeBufferReader = require('./NodeBufferReader'); 8 | var Uint8ArrayReader = require('./Uint8ArrayReader'); 9 | 10 | /** 11 | * Create a reader adapted to the data. 12 | * @param {String|ArrayBuffer|Uint8Array|Buffer} data the data to read. 13 | * @return {DataReader} the data reader. 14 | */ 15 | module.exports = function (data) { 16 | var type = utils.getTypeOf(data); 17 | utils.checkSupport(type); 18 | if (type === "string" && !support.uint8array) { 19 | return new StringReader(data); 20 | } 21 | if (type === "nodebuffer") { 22 | return new NodeBufferReader(data); 23 | } 24 | if (support.uint8array) { 25 | return new Uint8ArrayReader(utils.transformTo("uint8array", data)); 26 | } 27 | return new ArrayReader(utils.transformTo("array", data)); 28 | }; 29 | 30 | // vim: set shiftwidth=4 softtabstop=4: 31 | -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/lib/signature.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | exports.LOCAL_FILE_HEADER = "PK\x03\x04"; 3 | exports.CENTRAL_FILE_HEADER = "PK\x01\x02"; 4 | exports.CENTRAL_DIRECTORY_END = "PK\x05\x06"; 5 | exports.ZIP64_CENTRAL_DIRECTORY_LOCATOR = "PK\x06\x07"; 6 | exports.ZIP64_CENTRAL_DIRECTORY_END = "PK\x06\x06"; 7 | exports.DATA_DESCRIPTOR = "PK\x07\x08"; 8 | -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/lib/stream/ConvertWorker.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var GenericWorker = require('./GenericWorker'); 4 | var utils = require('../utils'); 5 | 6 | /** 7 | * A worker which convert chunks to a specified type. 8 | * @constructor 9 | * @param {String} destType the destination type. 10 | */ 11 | function ConvertWorker(destType) { 12 | GenericWorker.call(this, "ConvertWorker to " + destType); 13 | this.destType = destType; 14 | } 15 | utils.inherits(ConvertWorker, GenericWorker); 16 | 17 | /** 18 | * @see GenericWorker.processChunk 19 | */ 20 | ConvertWorker.prototype.processChunk = function (chunk) { 21 | this.push({ 22 | data : utils.transformTo(this.destType, chunk.data), 23 | meta : chunk.meta 24 | }); 25 | }; 26 | module.exports = ConvertWorker; 27 | -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/lib/stream/Crc32Probe.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var GenericWorker = require('./GenericWorker'); 4 | var crc32 = require('../crc32'); 5 | var utils = require('../utils'); 6 | 7 | /** 8 | * A worker which calculate the crc32 of the data flowing through. 9 | * @constructor 10 | */ 11 | function Crc32Probe() { 12 | GenericWorker.call(this, "Crc32Probe"); 13 | } 14 | utils.inherits(Crc32Probe, GenericWorker); 15 | 16 | /** 17 | * @see GenericWorker.processChunk 18 | */ 19 | Crc32Probe.prototype.processChunk = function (chunk) { 20 | this.streamInfo.crc32 = crc32(chunk.data, this.streamInfo.crc32 || 0); 21 | this.push(chunk); 22 | }; 23 | module.exports = Crc32Probe; 24 | -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/lib/stream/DataLengthProbe.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var utils = require('../utils'); 4 | var GenericWorker = require('./GenericWorker'); 5 | 6 | /** 7 | * A worker which calculate the total length of the data flowing through. 8 | * @constructor 9 | * @param {String} propName the name used to expose the length 10 | */ 11 | function DataLengthProbe(propName) { 12 | GenericWorker.call(this, "DataLengthProbe for " + propName); 13 | this.propName = propName; 14 | this.withStreamInfo(propName, 0); 15 | } 16 | utils.inherits(DataLengthProbe, GenericWorker); 17 | 18 | /** 19 | * @see GenericWorker.processChunk 20 | */ 21 | DataLengthProbe.prototype.processChunk = function (chunk) { 22 | if(chunk) { 23 | var length = this.streamInfo[this.propName] || 0; 24 | this.streamInfo[this.propName] = length + chunk.data.length; 25 | } 26 | GenericWorker.prototype.processChunk.call(this, chunk); 27 | }; 28 | module.exports = DataLengthProbe; 29 | 30 | -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/lib/stream/DataWorker.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var utils = require('../utils'); 4 | var GenericWorker = require('./GenericWorker'); 5 | 6 | // the size of the generated chunks 7 | // TODO expose this as a public variable 8 | var DEFAULT_BLOCK_SIZE = 16 * 1024; 9 | 10 | /** 11 | * A worker that reads a content and emits chunks. 12 | * @constructor 13 | * @param {Promise} dataP the promise of the data to split 14 | */ 15 | function DataWorker(dataP) { 16 | GenericWorker.call(this, "DataWorker"); 17 | var self = this; 18 | this.dataIsReady = false; 19 | this.index = 0; 20 | this.max = 0; 21 | this.data = null; 22 | this.type = ""; 23 | 24 | this._tickScheduled = false; 25 | 26 | dataP.then(function (data) { 27 | self.dataIsReady = true; 28 | self.data = data; 29 | self.max = data && data.length || 0; 30 | self.type = utils.getTypeOf(data); 31 | if(!self.isPaused) { 32 | self._tickAndRepeat(); 33 | } 34 | }, function (e) { 35 | self.error(e); 36 | }); 37 | } 38 | 39 | utils.inherits(DataWorker, GenericWorker); 40 | 41 | /** 42 | * @see GenericWorker.cleanUp 43 | */ 44 | DataWorker.prototype.cleanUp = function () { 45 | GenericWorker.prototype.cleanUp.call(this); 46 | this.data = null; 47 | }; 48 | 49 | /** 50 | * @see GenericWorker.resume 51 | */ 52 | DataWorker.prototype.resume = function () { 53 | if(!GenericWorker.prototype.resume.call(this)) { 54 | return false; 55 | } 56 | 57 | if (!this._tickScheduled && this.dataIsReady) { 58 | this._tickScheduled = true; 59 | utils.delay(this._tickAndRepeat, [], this); 60 | } 61 | return true; 62 | }; 63 | 64 | /** 65 | * Trigger a tick a schedule an other call to this function. 66 | */ 67 | DataWorker.prototype._tickAndRepeat = function() { 68 | this._tickScheduled = false; 69 | if(this.isPaused || this.isFinished) { 70 | return; 71 | } 72 | this._tick(); 73 | if(!this.isFinished) { 74 | utils.delay(this._tickAndRepeat, [], this); 75 | this._tickScheduled = true; 76 | } 77 | }; 78 | 79 | /** 80 | * Read and push a chunk. 81 | */ 82 | DataWorker.prototype._tick = function() { 83 | 84 | if(this.isPaused || this.isFinished) { 85 | return false; 86 | } 87 | 88 | var size = DEFAULT_BLOCK_SIZE; 89 | var data = null, nextIndex = Math.min(this.max, this.index + size); 90 | if (this.index >= this.max) { 91 | // EOF 92 | return this.end(); 93 | } else { 94 | switch(this.type) { 95 | case "string": 96 | data = this.data.substring(this.index, nextIndex); 97 | break; 98 | case "uint8array": 99 | data = this.data.subarray(this.index, nextIndex); 100 | break; 101 | case "array": 102 | case "nodebuffer": 103 | data = this.data.slice(this.index, nextIndex); 104 | break; 105 | } 106 | this.index = nextIndex; 107 | return this.push({ 108 | data : data, 109 | meta : { 110 | percent : this.max ? this.index / this.max * 100 : 0 111 | } 112 | }); 113 | } 114 | }; 115 | 116 | module.exports = DataWorker; 117 | -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/lib/support.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | exports.base64 = true; 4 | exports.array = true; 5 | exports.string = true; 6 | exports.arraybuffer = typeof ArrayBuffer !== "undefined" && typeof Uint8Array !== "undefined"; 7 | exports.nodebuffer = typeof Buffer !== "undefined"; 8 | // contains true if JSZip can read/generate Uint8Array, false otherwise. 9 | exports.uint8array = typeof Uint8Array !== "undefined"; 10 | 11 | if (typeof ArrayBuffer === "undefined") { 12 | exports.blob = false; 13 | } 14 | else { 15 | var buffer = new ArrayBuffer(0); 16 | try { 17 | exports.blob = new Blob([buffer], { 18 | type: "application/zip" 19 | }).size === 0; 20 | } 21 | catch (e) { 22 | try { 23 | var Builder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder || window.MSBlobBuilder; 24 | var builder = new Builder(); 25 | builder.append(buffer); 26 | exports.blob = builder.getBlob('application/zip').size === 0; 27 | } 28 | catch (e) { 29 | exports.blob = false; 30 | } 31 | } 32 | } 33 | 34 | exports.nodestream = !!require("./nodejs/NodejsStreamOutputAdapter").prototype; 35 | -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "jszip", 3 | "version": "3.0.0", 4 | "author": "Stuart Knightley ", 5 | "description": "Create, read and edit .zip files with Javascript http://stuartk.com/jszip", 6 | "scripts": { 7 | "test": "npm run test-node && npm run test-browser", 8 | "test-node": "qunit-cli -c test/helpers/test-utils.js test/helpers/node-test-utils.js test/asserts/*.js", 9 | "test-browser": "grunt build && grunt test", 10 | "lint": "grunt jshint" 11 | }, 12 | "contributors": [ 13 | { 14 | "name": "Franz Buchinger" 15 | }, 16 | { 17 | "name": "António Afonso" 18 | }, 19 | { 20 | "name": "David Duponchel" 21 | }, 22 | { 23 | "name": "yiminghe" 24 | } 25 | ], 26 | "main": "./lib/index", 27 | "repository": { 28 | "type": "git", 29 | "url": "https://github.com/Stuk/jszip.git" 30 | }, 31 | "keywords": [ 32 | "zip", 33 | "deflate", 34 | "inflate" 35 | ], 36 | "devDependencies": { 37 | "grunt": "~0.4.1", 38 | "grunt-cli": "~1.1.0", 39 | "grunt-saucelabs": "~8.6.2", 40 | "grunt-contrib-connect": "1.0.0", 41 | "jshint": "~2.9.1", 42 | "browserify": "~13.0.0", 43 | "grunt-browserify": "~5.0.0", 44 | "grunt-contrib-jshint": "~1.0.0", 45 | "grunt-contrib-uglify": "~1.0.0", 46 | "jszip-utils": "~0.0.2", 47 | "qunit-cli": "~0.2.0", 48 | "qunitjs": "~1.23.0", 49 | "tmp": "0.0.28" 50 | }, 51 | "dependencies": { 52 | "es6-promise": "~3.0.2", 53 | "pako": "~1.0.0", 54 | "readable-stream": "~2.0.6", 55 | "asap": "~2.0.3" 56 | }, 57 | "license": "(MIT OR GPL-3.0)" 58 | } 59 | -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/test/asserts/constructor.js: -------------------------------------------------------------------------------- 1 | /* jshint qunit: true */ 2 | /* global JSZip,JSZipTestUtils */ 3 | 'use strict'; 4 | 5 | QUnit.module("constructor"); 6 | 7 | test("JSZip exists", function(assert){ 8 | assert.ok(JSZip, "JSZip exists"); 9 | }); 10 | 11 | test("new JSZip()", function(assert){ 12 | var zip = new JSZip(); 13 | assert.ok(zip instanceof JSZip, "Constructor works"); 14 | }); 15 | 16 | test("JSZip()", function(assert){ 17 | var zip = JSZip(); // jshint ignore:line 18 | assert.ok(zip instanceof JSZip, "Constructor adds `new` before itself where necessary"); 19 | }); 20 | 21 | -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/test/asserts/deprecated.js: -------------------------------------------------------------------------------- 1 | /* jshint qunit: true */ 2 | /* global JSZip,JSZipTestUtils */ 3 | 'use strict'; 4 | 5 | QUnit.module("deprecated"); 6 | 7 | test("Removed load method throws an exception", function(assert) { 8 | var file = JSZipTestUtils.createZipAll().file("Hello.txt"); 9 | assert.throws( 10 | function() { 11 | new JSZip().load(""); 12 | }, 13 | /upgrade guide/, 14 | "load() throws an exception" 15 | ); 16 | }); 17 | test("Removed constructor with data throws an exception", function(assert) { 18 | var file = JSZipTestUtils.createZipAll().file("Hello.txt"); 19 | assert.throws( 20 | function() { 21 | var zip = new JSZip(""); 22 | }, 23 | /upgrade guide/, 24 | "new JSZip(data) throws an exception" 25 | ); 26 | }); 27 | test("Removed asText method throws an exception", function(assert) { 28 | var file = JSZipTestUtils.createZipAll().file("Hello.txt"); 29 | assert.throws( 30 | function() { 31 | file.asText(); 32 | }, 33 | /upgrade guide/, 34 | "file.asText() throws an exception" 35 | ); 36 | }); 37 | test("Removed generate method throws an exception", function(assert) { 38 | var file = JSZipTestUtils.createZipAll().file("Hello.txt"); 39 | assert.throws( 40 | function() { 41 | new JSZip().generate({type:"string"}); 42 | }, 43 | /upgrade guide/, 44 | "generate() throws an exception" 45 | ); 46 | }); 47 | -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/test/asserts/external.js: -------------------------------------------------------------------------------- 1 | /* jshint qunit: true */ 2 | /* global JSZip,JSZipTestUtils */ 3 | 'use strict'; 4 | 5 | QUnit.module("external"); 6 | 7 | function createPromiseProxy(OriginalPromise) { 8 | function MyShinyPromise () { 9 | OriginalPromise.apply(this, arguments); 10 | MyShinyPromise.calls++; 11 | } 12 | MyShinyPromise.calls = 0; 13 | MyShinyPromise.prototype = OriginalPromise.prototype; 14 | function proxyMethod(method) { 15 | if (typeof OriginalPromise[method] === "function") { 16 | MyShinyPromise[method] = function () { 17 | MyShinyPromise.calls++; 18 | return OriginalPromise[method].apply(OriginalPromise, arguments); 19 | }; 20 | } 21 | } 22 | MyShinyPromise.prototype.isACustomImplementation = true; 23 | for(var method in OriginalPromise) { 24 | if (!OriginalPromise.hasOwnProperty(method)) { 25 | continue; 26 | } 27 | proxyMethod(method); 28 | } 29 | return MyShinyPromise; 30 | } 31 | 32 | test("external.Promise can be replaced in .async()", function (assert) { 33 | var done = assert.async(); 34 | var OriginalPromise = JSZip.external.Promise; 35 | var MyShinyPromise = createPromiseProxy(OriginalPromise); 36 | 37 | JSZip.external.Promise = MyShinyPromise; 38 | 39 | var promise = JSZipTestUtils.createZipAll().file("Hello.txt").async("string").then(function (result) { 40 | ok(MyShinyPromise.calls > 0, "at least 1 call of the new Promise"); 41 | JSZip.external.Promise = OriginalPromise; 42 | done(); 43 | })['catch'](JSZipTestUtils.assertNoError); 44 | 45 | assert.ok(promise.isACustomImplementation, "the custom implementation is used"); 46 | }); 47 | 48 | test("external.Promise can be replaced in .generateAsync()", function (assert) { 49 | var done = assert.async(); 50 | var OriginalPromise = JSZip.external.Promise; 51 | var MyShinyPromise = createPromiseProxy(OriginalPromise); 52 | 53 | JSZip.external.Promise = MyShinyPromise; 54 | 55 | var promise = JSZipTestUtils.createZipAll().generateAsync({type:"string"}).then(function (result) { 56 | ok(MyShinyPromise.calls > 0, "at least 1 call of the new Promise"); 57 | JSZip.external.Promise = OriginalPromise; 58 | done(); 59 | })['catch'](JSZipTestUtils.assertNoError); 60 | 61 | assert.ok(promise.isACustomImplementation, "the custom implementation is used"); 62 | }); 63 | 64 | JSZipTestUtils.testZipFile("external.Promise can be replaced in .loadAsync()", "ref/all.zip", function (all) { 65 | stop(); 66 | var OriginalPromise = JSZip.external.Promise; 67 | var MyShinyPromise = createPromiseProxy(OriginalPromise); 68 | 69 | JSZip.external.Promise = MyShinyPromise; 70 | 71 | var promise = JSZip.loadAsync(all).then(function (result) { 72 | ok(MyShinyPromise.calls > 0, "at least 1 call of the new Promise"); 73 | JSZip.external.Promise = OriginalPromise; 74 | start(); 75 | })['catch'](JSZipTestUtils.assertNoError); 76 | 77 | ok(promise.isACustomImplementation, "the custom implementation is used"); 78 | }); 79 | -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/test/asserts/filter.js: -------------------------------------------------------------------------------- 1 | /* jshint qunit: true */ 2 | /* global JSZip,JSZipTestUtils */ 3 | 'use strict'; 4 | 5 | QUnit.module("filter"); 6 | 7 | test("Filtering a zip", function() { 8 | var zip = new JSZip(); 9 | zip.file("1.txt", "1\n"); 10 | zip.file("2.txt", "2\n"); 11 | zip.file("3.log", "3\n"); 12 | var result = zip.filter(function (relativeFilename, file){ 13 | return relativeFilename.indexOf(".txt") !== -1; 14 | }); 15 | equal(result.length, 2, "filter has filtered"); 16 | ok(result[0].name.indexOf(".txt") !== -1, "filter has filtered the good file"); 17 | ok(result[1].name.indexOf(".txt") !== -1, "filter has filtered the good file"); 18 | }); 19 | 20 | test("Filtering a zip from a relative path", function() { 21 | var zip = new JSZip(); 22 | zip.file("foo/1.txt", "1\n"); 23 | zip.file("foo/2.txt", "2\n"); 24 | zip.file("foo/3.log", "3\n"); 25 | zip.file("1.txt", "1\n"); 26 | zip.file("2.txt", "2\n"); 27 | zip.file("3.log", "3\n"); 28 | 29 | var count = 0; 30 | var result = zip.folder("foo").filter(function (relativeFilename, file) { 31 | count++; 32 | return relativeFilename.indexOf("3") !== -1; 33 | }); 34 | equal(count, 3, "the callback has been called the right number of times"); 35 | equal(result.length, 1, "filter has filtered"); 36 | equal(result[0].name, "foo/3.log", "filter has filtered the good file"); 37 | }); 38 | 39 | test("Filtering a zip : the full path is still accessible", function() { 40 | var zip = new JSZip(); 41 | zip.file("foo/1.txt", "1\n"); 42 | zip.file("foo/2.txt", "2\n"); 43 | zip.file("foo/3.log", "3\n"); 44 | zip.file("1.txt", "1\n"); 45 | zip.file("2.txt", "2\n"); 46 | zip.file("3.log", "3\n"); 47 | 48 | var result = zip.folder("foo").filter(function (relativeFilename, file) { 49 | return file.name.indexOf("3") !== -1; 50 | }); 51 | equal(result.length, 1, "the filter only match files/folders in the current folder"); 52 | equal(result[0].name, "foo/3.log", "filter has filtered the good file"); 53 | }); 54 | 55 | 56 | -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/test/asserts/foreach.js: -------------------------------------------------------------------------------- 1 | /* jshint qunit: true */ 2 | /* global JSZip,JSZipTestUtils */ 3 | 'use strict'; 4 | 5 | QUnit.module("forEach"); 6 | 7 | test("forEach works on /", function (assert) { 8 | var zip = JSZipTestUtils.createZipAll(); 9 | var count = 0; 10 | var calls = []; 11 | 12 | assert.equal(zip.root, ""); 13 | 14 | zip.forEach(function (path, elt) { 15 | assert.equal(path, elt.name, "the full path is given on / for " + elt.name); 16 | count++; 17 | calls.push(path); 18 | }); 19 | 20 | equal(count, 3, "the callback has been called the right number of times"); 21 | assert.deepEqual(calls, ["Hello.txt", "images/", "images/smile.gif"], "all paths have been called"); 22 | }); 23 | 24 | test("forEach works on a sub folder", function (assert) { 25 | var zip = new JSZip(); 26 | var sub = zip.folder("subfolder"); 27 | sub.file("Hello.txt", "Hello World\n"); 28 | sub.folder("images").file("smile.gif", "R0lGODdhBQAFAIACAAAAAP/eACwAAAAABQAFAAACCIwPkWerClIBADs=", {base64: true}); 29 | var count = 0; 30 | var calls = []; 31 | 32 | assert.ok(zip.file("subfolder/Hello.txt")); 33 | assert.equal(sub.root, "subfolder/"); 34 | 35 | sub.forEach(function (path, elt) { 36 | assert.equal(path, elt.name.substr("subfolder/".length), "the full path is given on subfolder/ for " + path); 37 | count++; 38 | calls.push(path); 39 | }); 40 | 41 | equal(count, 3, "the callback has been called the right number of times"); 42 | assert.deepEqual(calls, ["Hello.txt", "images/", "images/smile.gif"], "all paths have been called"); 43 | }); 44 | -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/test/helpers/browser-test-utils.js: -------------------------------------------------------------------------------- 1 | /* global JSZip,JSZipUtils,JSZipTestUtils */ 2 | 'use strict'; 3 | JSZipTestUtils.loadZipFile = function (name, callback) { 4 | JSZipUtils.getBinaryContent(name + "?_=" + ( new Date() ).getTime(), callback); 5 | }; 6 | -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/test/helpers/node-test-utils.js: -------------------------------------------------------------------------------- 1 | /* jshint qunit: true */ 2 | /* global JSZip,JSZipTestUtils */ 3 | 'use strict'; 4 | 5 | var fs = require("fs"); 6 | var path = require("path"); 7 | 8 | global.JSZip = require("../../lib/index"); 9 | 10 | global.JSZipTestUtils.loadZipFile = function(name, callback) { 11 | fs.readFile(path.join("test", name), "binary", callback); 12 | }; 13 | process.on('uncaughtException', function(err) { 14 | console.log('uncaughtException: ' + err, err.stack); 15 | }); 16 | 17 | 18 | 19 | // Deprecated 20 | // Extend assert methods to QUnit and Global scope through Backwards compatibility 21 | (function() { 22 | function Assert( testContext ) { 23 | this.test = testContext; 24 | } 25 | Assert.prototype = QUnit.assert; 26 | var i, 27 | assertions = QUnit.assert; 28 | 29 | function applyCurrent( current ) { 30 | return function() { 31 | var assert = new Assert( QUnit.config.current ); 32 | current.apply( assert, arguments ); 33 | }; 34 | } 35 | 36 | for ( i in assertions ) { 37 | if (!assertions.hasOwnProperty(i)) { 38 | continue; 39 | } 40 | QUnit[ i ] = applyCurrent( assertions[ i ] ); 41 | global[ i ] = QUnit[ i ]; 42 | } 43 | })(); 44 | -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/test/ref/all-stream.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GenderMagProject/GenderMagRecordersAssistant/abe500348a36b9adc9766d11bcf355f61418c2bc/Stuk-jszip-4cbaf0e/test/ref/all-stream.zip -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/test/ref/all.7zip.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GenderMagProject/GenderMagRecordersAssistant/abe500348a36b9adc9766d11bcf355f61418c2bc/Stuk-jszip-4cbaf0e/test/ref/all.7zip.zip -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/test/ref/all.windows.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GenderMagProject/GenderMagRecordersAssistant/abe500348a36b9adc9766d11bcf355f61418c2bc/Stuk-jszip-4cbaf0e/test/ref/all.windows.zip -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/test/ref/all.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GenderMagProject/GenderMagRecordersAssistant/abe500348a36b9adc9766d11bcf355f61418c2bc/Stuk-jszip-4cbaf0e/test/ref/all.zip -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/test/ref/all_appended_bytes.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GenderMagProject/GenderMagRecordersAssistant/abe500348a36b9adc9766d11bcf355f61418c2bc/Stuk-jszip-4cbaf0e/test/ref/all_appended_bytes.zip -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/test/ref/all_missing_bytes.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GenderMagProject/GenderMagRecordersAssistant/abe500348a36b9adc9766d11bcf355f61418c2bc/Stuk-jszip-4cbaf0e/test/ref/all_missing_bytes.zip -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/test/ref/all_prepended_bytes.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GenderMagProject/GenderMagRecordersAssistant/abe500348a36b9adc9766d11bcf355f61418c2bc/Stuk-jszip-4cbaf0e/test/ref/all_prepended_bytes.zip -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/test/ref/archive_comment.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GenderMagProject/GenderMagRecordersAssistant/abe500348a36b9adc9766d11bcf355f61418c2bc/Stuk-jszip-4cbaf0e/test/ref/archive_comment.zip -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/test/ref/backslash.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GenderMagProject/GenderMagRecordersAssistant/abe500348a36b9adc9766d11bcf355f61418c2bc/Stuk-jszip-4cbaf0e/test/ref/backslash.zip -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/test/ref/complex_files/AntarcticaTemps.ods: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GenderMagProject/GenderMagRecordersAssistant/abe500348a36b9adc9766d11bcf355f61418c2bc/Stuk-jszip-4cbaf0e/test/ref/complex_files/AntarcticaTemps.ods -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/test/ref/complex_files/AntarcticaTemps.xlsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GenderMagProject/GenderMagRecordersAssistant/abe500348a36b9adc9766d11bcf355f61418c2bc/Stuk-jszip-4cbaf0e/test/ref/complex_files/AntarcticaTemps.xlsx -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/test/ref/complex_files/Franz Kafka - The Metamorphosis.epub: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GenderMagProject/GenderMagRecordersAssistant/abe500348a36b9adc9766d11bcf355f61418c2bc/Stuk-jszip-4cbaf0e/test/ref/complex_files/Franz Kafka - The Metamorphosis.epub -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/test/ref/complex_files/Outlook2007_Calendar.xps: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GenderMagProject/GenderMagRecordersAssistant/abe500348a36b9adc9766d11bcf355f61418c2bc/Stuk-jszip-4cbaf0e/test/ref/complex_files/Outlook2007_Calendar.xps -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/test/ref/data_descriptor.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GenderMagProject/GenderMagRecordersAssistant/abe500348a36b9adc9766d11bcf355f61418c2bc/Stuk-jszip-4cbaf0e/test/ref/data_descriptor.zip -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/test/ref/deflate-stream.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GenderMagProject/GenderMagRecordersAssistant/abe500348a36b9adc9766d11bcf355f61418c2bc/Stuk-jszip-4cbaf0e/test/ref/deflate-stream.zip -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/test/ref/deflate.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GenderMagProject/GenderMagRecordersAssistant/abe500348a36b9adc9766d11bcf355f61418c2bc/Stuk-jszip-4cbaf0e/test/ref/deflate.zip -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/test/ref/empty.zip: -------------------------------------------------------------------------------- 1 | PK -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/test/ref/encrypted.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GenderMagProject/GenderMagRecordersAssistant/abe500348a36b9adc9766d11bcf355f61418c2bc/Stuk-jszip-4cbaf0e/test/ref/encrypted.zip -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/test/ref/extra_attributes.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GenderMagProject/GenderMagRecordersAssistant/abe500348a36b9adc9766d11bcf355f61418c2bc/Stuk-jszip-4cbaf0e/test/ref/extra_attributes.zip -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/test/ref/folder.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GenderMagProject/GenderMagRecordersAssistant/abe500348a36b9adc9766d11bcf355f61418c2bc/Stuk-jszip-4cbaf0e/test/ref/folder.zip -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/test/ref/image.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GenderMagProject/GenderMagRecordersAssistant/abe500348a36b9adc9766d11bcf355f61418c2bc/Stuk-jszip-4cbaf0e/test/ref/image.zip -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/test/ref/invalid/bad_decompressed_size.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GenderMagProject/GenderMagRecordersAssistant/abe500348a36b9adc9766d11bcf355f61418c2bc/Stuk-jszip-4cbaf0e/test/ref/invalid/bad_decompressed_size.zip -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/test/ref/invalid/bad_offset.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GenderMagProject/GenderMagRecordersAssistant/abe500348a36b9adc9766d11bcf355f61418c2bc/Stuk-jszip-4cbaf0e/test/ref/invalid/bad_offset.zip -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/test/ref/invalid/compression.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GenderMagProject/GenderMagRecordersAssistant/abe500348a36b9adc9766d11bcf355f61418c2bc/Stuk-jszip-4cbaf0e/test/ref/invalid/compression.zip -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/test/ref/invalid/crc32.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GenderMagProject/GenderMagRecordersAssistant/abe500348a36b9adc9766d11bcf355f61418c2bc/Stuk-jszip-4cbaf0e/test/ref/invalid/crc32.zip -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/test/ref/local_encoding_in_name.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GenderMagProject/GenderMagRecordersAssistant/abe500348a36b9adc9766d11bcf355f61418c2bc/Stuk-jszip-4cbaf0e/test/ref/local_encoding_in_name.zip -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/test/ref/nested.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GenderMagProject/GenderMagRecordersAssistant/abe500348a36b9adc9766d11bcf355f61418c2bc/Stuk-jszip-4cbaf0e/test/ref/nested.zip -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/test/ref/nested_data_descriptor.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GenderMagProject/GenderMagRecordersAssistant/abe500348a36b9adc9766d11bcf355f61418c2bc/Stuk-jszip-4cbaf0e/test/ref/nested_data_descriptor.zip -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/test/ref/nested_zip64.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GenderMagProject/GenderMagRecordersAssistant/abe500348a36b9adc9766d11bcf355f61418c2bc/Stuk-jszip-4cbaf0e/test/ref/nested_zip64.zip -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/test/ref/permissions/linux_7z.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GenderMagProject/GenderMagRecordersAssistant/abe500348a36b9adc9766d11bcf355f61418c2bc/Stuk-jszip-4cbaf0e/test/ref/permissions/linux_7z.zip -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/test/ref/permissions/linux_ark.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GenderMagProject/GenderMagRecordersAssistant/abe500348a36b9adc9766d11bcf355f61418c2bc/Stuk-jszip-4cbaf0e/test/ref/permissions/linux_ark.zip -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/test/ref/permissions/linux_file_roller-ubuntu.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GenderMagProject/GenderMagRecordersAssistant/abe500348a36b9adc9766d11bcf355f61418c2bc/Stuk-jszip-4cbaf0e/test/ref/permissions/linux_file_roller-ubuntu.zip -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/test/ref/permissions/linux_file_roller-xubuntu.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GenderMagProject/GenderMagRecordersAssistant/abe500348a36b9adc9766d11bcf355f61418c2bc/Stuk-jszip-4cbaf0e/test/ref/permissions/linux_file_roller-xubuntu.zip -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/test/ref/permissions/linux_zip.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GenderMagProject/GenderMagRecordersAssistant/abe500348a36b9adc9766d11bcf355f61418c2bc/Stuk-jszip-4cbaf0e/test/ref/permissions/linux_zip.zip -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/test/ref/permissions/mac_finder.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GenderMagProject/GenderMagRecordersAssistant/abe500348a36b9adc9766d11bcf355f61418c2bc/Stuk-jszip-4cbaf0e/test/ref/permissions/mac_finder.zip -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/test/ref/permissions/windows_7z.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GenderMagProject/GenderMagRecordersAssistant/abe500348a36b9adc9766d11bcf355f61418c2bc/Stuk-jszip-4cbaf0e/test/ref/permissions/windows_7z.zip -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/test/ref/permissions/windows_compressed_folders.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GenderMagProject/GenderMagRecordersAssistant/abe500348a36b9adc9766d11bcf355f61418c2bc/Stuk-jszip-4cbaf0e/test/ref/permissions/windows_compressed_folders.zip -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/test/ref/permissions/windows_izarc.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GenderMagProject/GenderMagRecordersAssistant/abe500348a36b9adc9766d11bcf355f61418c2bc/Stuk-jszip-4cbaf0e/test/ref/permissions/windows_izarc.zip -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/test/ref/permissions/windows_winrar.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GenderMagProject/GenderMagRecordersAssistant/abe500348a36b9adc9766d11bcf355f61418c2bc/Stuk-jszip-4cbaf0e/test/ref/permissions/windows_winrar.zip -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/test/ref/pile_of_poo.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GenderMagProject/GenderMagRecordersAssistant/abe500348a36b9adc9766d11bcf355f61418c2bc/Stuk-jszip-4cbaf0e/test/ref/pile_of_poo.zip -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/test/ref/slashes_and_izarc.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GenderMagProject/GenderMagRecordersAssistant/abe500348a36b9adc9766d11bcf355f61418c2bc/Stuk-jszip-4cbaf0e/test/ref/slashes_and_izarc.zip -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/test/ref/store-stream.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GenderMagProject/GenderMagRecordersAssistant/abe500348a36b9adc9766d11bcf355f61418c2bc/Stuk-jszip-4cbaf0e/test/ref/store-stream.zip -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/test/ref/store.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GenderMagProject/GenderMagRecordersAssistant/abe500348a36b9adc9766d11bcf355f61418c2bc/Stuk-jszip-4cbaf0e/test/ref/store.zip -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/test/ref/subfolder.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GenderMagProject/GenderMagRecordersAssistant/abe500348a36b9adc9766d11bcf355f61418c2bc/Stuk-jszip-4cbaf0e/test/ref/subfolder.zip -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/test/ref/text.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GenderMagProject/GenderMagRecordersAssistant/abe500348a36b9adc9766d11bcf355f61418c2bc/Stuk-jszip-4cbaf0e/test/ref/text.zip -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/test/ref/utf8.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GenderMagProject/GenderMagRecordersAssistant/abe500348a36b9adc9766d11bcf355f61418c2bc/Stuk-jszip-4cbaf0e/test/ref/utf8.zip -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/test/ref/utf8_in_name.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GenderMagProject/GenderMagRecordersAssistant/abe500348a36b9adc9766d11bcf355f61418c2bc/Stuk-jszip-4cbaf0e/test/ref/utf8_in_name.zip -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/test/ref/winrar_utf8_in_name.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GenderMagProject/GenderMagRecordersAssistant/abe500348a36b9adc9766d11bcf355f61418c2bc/Stuk-jszip-4cbaf0e/test/ref/winrar_utf8_in_name.zip -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/test/ref/zip64.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GenderMagProject/GenderMagRecordersAssistant/abe500348a36b9adc9766d11bcf355f61418c2bc/Stuk-jszip-4cbaf0e/test/ref/zip64.zip -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/test/ref/zip64_appended_bytes.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GenderMagProject/GenderMagRecordersAssistant/abe500348a36b9adc9766d11bcf355f61418c2bc/Stuk-jszip-4cbaf0e/test/ref/zip64_appended_bytes.zip -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/test/ref/zip64_missing_bytes.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GenderMagProject/GenderMagRecordersAssistant/abe500348a36b9adc9766d11bcf355f61418c2bc/Stuk-jszip-4cbaf0e/test/ref/zip64_missing_bytes.zip -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/test/ref/zip64_prepended_bytes.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GenderMagProject/GenderMagRecordersAssistant/abe500348a36b9adc9766d11bcf355f61418c2bc/Stuk-jszip-4cbaf0e/test/ref/zip64_prepended_bytes.zip -------------------------------------------------------------------------------- /Stuk-jszip-4cbaf0e/test/smile.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GenderMagProject/GenderMagRecordersAssistant/abe500348a36b9adc9766d11bcf355f61418c2bc/Stuk-jszip-4cbaf0e/test/smile.gif -------------------------------------------------------------------------------- /Updated_OutputFile.csv: -------------------------------------------------------------------------------- 1 | GenderMag Recorder's Assistant Results,,, 2 | Date:,April 15 2021,Time: 5:52:00 AM, 3 | Team,Persona,Scenario, 4 | Walkthrough_Puja,Abi,ftjfj, 5 | ,,, 6 | Subgoal 1,Test Subgoal,, 7 | Will the persona have formed this subgoal as a step to their overall goal?,,, 8 | Yes,TRUE,Why?, 9 | No,FALSE,Why?, 10 | Maybe,FALSE,Why?, 11 | ,,, 12 | Subgoal Facets:,,, 13 | Motivation,FALSE,, 14 | Information Processing,FALSE,, 15 | Computer Self Efficacy,FALSE,, 16 | Attitude Toward Risk,FALSE,, 17 | Tinkering,FALSE,, 18 | ,,, 19 | Action 1,hj,, 20 | Will the persona know what to do at this step?,,, 21 | Yes,TRUE,Why?, 22 | No,FALSE,Why?, 23 | Maybe,FALSE,Why?, 24 | ,,, 25 | PreAction Facets:,,, 26 | Motivation,FALSE,, 27 | Information Processing,FALSE,, 28 | Computer Self Efficacy,FALSE,, 29 | Attitude Toward Risk,FALSE,, 30 | Tinkering,FALSE,, 31 | ,,, 32 | "If the persona does the right thing, will they know that they did the right thing and is making progress toward their goal?",,, 33 | Yes,TRUE,Why?, 34 | No,FALSE,Why?, 35 | Maybe,FALSE,Why?, 36 | ,,, 37 | Post action facets:,,, 38 | Motivation,FALSE,, 39 | Information Processing,FALSE,, 40 | Computer Self Efficacy,FALSE,, 41 | Attitude Toward Risk,FALSE,, 42 | Tinkering,FALSE,, 43 | ,,, 44 | Action Image Name:,S1A1_hj,, 45 | -------------------------------------------------------------------------------- /features/persona.js: -------------------------------------------------------------------------------- 1 | /* 2 | * File Name: persona.js 3 | * Functions: loadPersona 4 | * Description: This file contains code to display persona info in the slider 5 | */ 6 | 7 | /* 8 | * Function: loadPersona 9 | * Description: This function loads the persona's image, description, and tooltips from their template 10 | * Params: personaName - the persona chosen by the user 11 | */ 12 | 13 | function loadPersona(personaName) { 14 | const facets = ["M", "IPS", "SE", "R", "T"]; 15 | const personas = { 16 | Abi: { 17 | template: "./templates/Abi/abiPersona.html", 18 | imageSrc: "images/abimulti.png", 19 | imageId: "AbiPhoto", 20 | imageAlt: "Abi Jones", 21 | toolTipPrefix: "abi" 22 | }, 23 | Tim: { 24 | template: "./templates/Tim/timPersona.html", 25 | imageSrc: "images/Timmulti.png", 26 | imageId: "TimPhoto", 27 | imageAlt: "Tim Hopkins", 28 | toolTipPrefix: "tim" 29 | }, 30 | Pat: { 31 | template: "./templates/pat/patPersona.html", 32 | imageSrc: "images/Patmulti.png", 33 | imageId: "patPhoto", 34 | imageAlt: "Pat Jones", 35 | toolTipPrefix: "pat" 36 | }, 37 | Custom: { 38 | template: "./templates/custom/custom.html" 39 | } 40 | }; 41 | 42 | const persona = personas[personaName]; 43 | if (!persona) { 44 | console.error("Unknown persona:", personaName); 45 | return; 46 | } 47 | 48 | appendTemplateToElement(sidebarBody().find("#personaInfo"), persona.template, function (error) { 49 | if (error) { 50 | console.error(`Error loading ${personaName} template:`, error); 51 | return; 52 | } 53 | 54 | if (persona.imageSrc) { 55 | const imgSrc = chrome.runtime.getURL(persona.imageSrc); 56 | const imgHTML = `${persona.imageAlt}`; 57 | sidebarBody().find("#picGoesHere").append(imgHTML); 58 | } 59 | 60 | if (persona.toolTipPrefix) { 61 | facets.forEach(facet => { 62 | const triggerClass = `${persona.toolTipPrefix}${facet}Trigger`; 63 | const toolTipId = `${persona.toolTipPrefix}${facet}ToolTip`; 64 | sidebarBody().find(`.${triggerClass}`).unbind("click").click(function () { 65 | addToolTip(toolTipId, personaName); 66 | }); 67 | }); 68 | } 69 | }); 70 | } 71 | 72 | -------------------------------------------------------------------------------- /font-awesome-4.6.1/HELP-US-OUT.txt: -------------------------------------------------------------------------------- 1 | I hope you love Font Awesome. If you've found it useful, please do me a favor and check out my latest project, 2 | Fort Awesome (https://fortawesome.com). It makes it easy to put the perfect icons on your website. Choose from our awesome, 3 | comprehensive icon sets or copy and paste your own. 4 | 5 | Please. Check it out. 6 | 7 | -Dave Gandy 8 | -------------------------------------------------------------------------------- /font-awesome-4.6.1/fonts/FontAwesome.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GenderMagProject/GenderMagRecordersAssistant/abe500348a36b9adc9766d11bcf355f61418c2bc/font-awesome-4.6.1/fonts/FontAwesome.otf -------------------------------------------------------------------------------- /font-awesome-4.6.1/fonts/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GenderMagProject/GenderMagRecordersAssistant/abe500348a36b9adc9766d11bcf355f61418c2bc/font-awesome-4.6.1/fonts/fontawesome-webfont.eot -------------------------------------------------------------------------------- /font-awesome-4.6.1/fonts/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GenderMagProject/GenderMagRecordersAssistant/abe500348a36b9adc9766d11bcf355f61418c2bc/font-awesome-4.6.1/fonts/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /font-awesome-4.6.1/fonts/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GenderMagProject/GenderMagRecordersAssistant/abe500348a36b9adc9766d11bcf355f61418c2bc/font-awesome-4.6.1/fonts/fontawesome-webfont.woff -------------------------------------------------------------------------------- /font-awesome-4.6.1/fonts/fontawesome-webfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GenderMagProject/GenderMagRecordersAssistant/abe500348a36b9adc9766d11bcf355f61418c2bc/font-awesome-4.6.1/fonts/fontawesome-webfont.woff2 -------------------------------------------------------------------------------- /font-awesome-4.6.1/less/animated.less: -------------------------------------------------------------------------------- 1 | // Animated Icons 2 | // -------------------------- 3 | 4 | .@{fa-css-prefix}-spin { 5 | -webkit-animation: fa-spin 2s infinite linear; 6 | animation: fa-spin 2s infinite linear; 7 | } 8 | 9 | .@{fa-css-prefix}-pulse { 10 | -webkit-animation: fa-spin 1s infinite steps(8); 11 | animation: fa-spin 1s infinite steps(8); 12 | } 13 | 14 | @-webkit-keyframes fa-spin { 15 | 0% { 16 | -webkit-transform: rotate(0deg); 17 | transform: rotate(0deg); 18 | } 19 | 100% { 20 | -webkit-transform: rotate(359deg); 21 | transform: rotate(359deg); 22 | } 23 | } 24 | 25 | @keyframes fa-spin { 26 | 0% { 27 | -webkit-transform: rotate(0deg); 28 | transform: rotate(0deg); 29 | } 30 | 100% { 31 | -webkit-transform: rotate(359deg); 32 | transform: rotate(359deg); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /font-awesome-4.6.1/less/bordered-pulled.less: -------------------------------------------------------------------------------- 1 | // Bordered & Pulled 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix}-border { 5 | padding: .2em .25em .15em; 6 | border: solid .08em @fa-border-color; 7 | border-radius: .1em; 8 | } 9 | 10 | .@{fa-css-prefix}-pull-left { float: left; } 11 | .@{fa-css-prefix}-pull-right { float: right; } 12 | 13 | .@{fa-css-prefix} { 14 | &.@{fa-css-prefix}-pull-left { margin-right: .3em; } 15 | &.@{fa-css-prefix}-pull-right { margin-left: .3em; } 16 | } 17 | 18 | /* Deprecated as of 4.4.0 */ 19 | .pull-right { float: right; } 20 | .pull-left { float: left; } 21 | 22 | .@{fa-css-prefix} { 23 | &.pull-left { margin-right: .3em; } 24 | &.pull-right { margin-left: .3em; } 25 | } 26 | -------------------------------------------------------------------------------- /font-awesome-4.6.1/less/core.less: -------------------------------------------------------------------------------- 1 | // Base Class Definition 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix} { 5 | display: inline-block; 6 | font: normal normal normal @fa-font-size-base/@fa-line-height-base FontAwesome; // shortening font declaration 7 | font-size: inherit; // can't have font-size inherit on line above, so need to override 8 | text-rendering: auto; // optimizelegibility throws things off #1094 9 | -webkit-font-smoothing: antialiased; 10 | -moz-osx-font-smoothing: grayscale; 11 | 12 | } 13 | -------------------------------------------------------------------------------- /font-awesome-4.6.1/less/fixed-width.less: -------------------------------------------------------------------------------- 1 | // Fixed Width Icons 2 | // ------------------------- 3 | .@{fa-css-prefix}-fw { 4 | width: (18em / 14); 5 | text-align: center; 6 | } 7 | -------------------------------------------------------------------------------- /font-awesome-4.6.1/less/font-awesome.less: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome 4.6.1 by @davegandy - http://fontawesome.io - @fontawesome 3 | * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) 4 | */ 5 | 6 | @import "variables.less"; 7 | @import "mixins.less"; 8 | @import "path.less"; 9 | @import "core.less"; 10 | @import "larger.less"; 11 | @import "fixed-width.less"; 12 | @import "list.less"; 13 | @import "bordered-pulled.less"; 14 | @import "animated.less"; 15 | @import "rotated-flipped.less"; 16 | @import "stacked.less"; 17 | @import "icons.less"; 18 | @import "screen-reader.less"; 19 | -------------------------------------------------------------------------------- /font-awesome-4.6.1/less/larger.less: -------------------------------------------------------------------------------- 1 | // Icon Sizes 2 | // ------------------------- 3 | 4 | /* makes the font 33% larger relative to the icon container */ 5 | .@{fa-css-prefix}-lg { 6 | font-size: (4em / 3); 7 | line-height: (3em / 4); 8 | vertical-align: -15%; 9 | } 10 | .@{fa-css-prefix}-2x { font-size: 2em; } 11 | .@{fa-css-prefix}-3x { font-size: 3em; } 12 | .@{fa-css-prefix}-4x { font-size: 4em; } 13 | .@{fa-css-prefix}-5x { font-size: 5em; } 14 | -------------------------------------------------------------------------------- /font-awesome-4.6.1/less/list.less: -------------------------------------------------------------------------------- 1 | // List Icons 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix}-ul { 5 | padding-left: 0; 6 | margin-left: @fa-li-width; 7 | list-style-type: none; 8 | > li { position: relative; } 9 | } 10 | .@{fa-css-prefix}-li { 11 | position: absolute; 12 | left: -@fa-li-width; 13 | width: @fa-li-width; 14 | top: (2em / 14); 15 | text-align: center; 16 | &.@{fa-css-prefix}-lg { 17 | left: (-@fa-li-width + (4em / 14)); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /font-awesome-4.6.1/less/mixins.less: -------------------------------------------------------------------------------- 1 | // Mixins 2 | // -------------------------- 3 | 4 | .fa-icon() { 5 | display: inline-block; 6 | font: normal normal normal @fa-font-size-base/@fa-line-height-base FontAwesome; // shortening font declaration 7 | font-size: inherit; // can't have font-size inherit on line above, so need to override 8 | text-rendering: auto; // optimizelegibility throws things off #1094 9 | -webkit-font-smoothing: antialiased; 10 | -moz-osx-font-smoothing: grayscale; 11 | 12 | } 13 | 14 | .fa-icon-rotate(@degrees, @rotation) { 15 | -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=@{rotation})"; 16 | -webkit-transform: rotate(@degrees); 17 | -ms-transform: rotate(@degrees); 18 | transform: rotate(@degrees); 19 | } 20 | 21 | .fa-icon-flip(@horiz, @vert, @rotation) { 22 | -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=@{rotation}, mirror=1)"; 23 | -webkit-transform: scale(@horiz, @vert); 24 | -ms-transform: scale(@horiz, @vert); 25 | transform: scale(@horiz, @vert); 26 | } 27 | 28 | 29 | // Only display content to screen readers. A la Bootstrap 4. 30 | // 31 | // See: http://a11yproject.com/posts/how-to-hide-content/ 32 | 33 | .sr-only() { 34 | position: absolute; 35 | width: 1px; 36 | height: 1px; 37 | padding: 0; 38 | margin: -1px; 39 | overflow: hidden; 40 | clip: rect(0,0,0,0); 41 | border: 0; 42 | } 43 | 44 | // Use in conjunction with .sr-only to only display content when it's focused. 45 | // 46 | // Useful for "Skip to main content" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1 47 | // 48 | // Credit: HTML5 Boilerplate 49 | 50 | .sr-only-focusable() { 51 | &:active, 52 | &:focus { 53 | position: static; 54 | width: auto; 55 | height: auto; 56 | margin: 0; 57 | overflow: visible; 58 | clip: auto; 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /font-awesome-4.6.1/less/path.less: -------------------------------------------------------------------------------- 1 | /* FONT PATH 2 | * -------------------------- */ 3 | 4 | @font-face { 5 | font-family: 'FontAwesome'; 6 | src: url('@{fa-font-path}/fontawesome-webfont.eot?v=@{fa-version}'); 7 | src: url('@{fa-font-path}/fontawesome-webfont.eot?#iefix&v=@{fa-version}') format('embedded-opentype'), 8 | url('@{fa-font-path}/fontawesome-webfont.woff2?v=@{fa-version}') format('woff2'), 9 | url('@{fa-font-path}/fontawesome-webfont.woff?v=@{fa-version}') format('woff'), 10 | url('@{fa-font-path}/fontawesome-webfont.ttf?v=@{fa-version}') format('truetype'), 11 | url('@{fa-font-path}/fontawesome-webfont.svg?v=@{fa-version}#fontawesomeregular') format('svg'); 12 | // src: url('@{fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts 13 | font-weight: normal; 14 | font-style: normal; 15 | } 16 | -------------------------------------------------------------------------------- /font-awesome-4.6.1/less/rotated-flipped.less: -------------------------------------------------------------------------------- 1 | // Rotated & Flipped Icons 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix}-rotate-90 { .fa-icon-rotate(90deg, 1); } 5 | .@{fa-css-prefix}-rotate-180 { .fa-icon-rotate(180deg, 2); } 6 | .@{fa-css-prefix}-rotate-270 { .fa-icon-rotate(270deg, 3); } 7 | 8 | .@{fa-css-prefix}-flip-horizontal { .fa-icon-flip(-1, 1, 0); } 9 | .@{fa-css-prefix}-flip-vertical { .fa-icon-flip(1, -1, 2); } 10 | 11 | // Hook for IE8-9 12 | // ------------------------- 13 | 14 | :root .@{fa-css-prefix}-rotate-90, 15 | :root .@{fa-css-prefix}-rotate-180, 16 | :root .@{fa-css-prefix}-rotate-270, 17 | :root .@{fa-css-prefix}-flip-horizontal, 18 | :root .@{fa-css-prefix}-flip-vertical { 19 | filter: none; 20 | } 21 | -------------------------------------------------------------------------------- /font-awesome-4.6.1/less/screen-reader.less: -------------------------------------------------------------------------------- 1 | // Screen Readers 2 | // ------------------------- 3 | 4 | .sr-only { .sr-only(); } 5 | .sr-only-focusable { .sr-only-focusable(); } 6 | -------------------------------------------------------------------------------- /font-awesome-4.6.1/less/stacked.less: -------------------------------------------------------------------------------- 1 | // Stacked Icons 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix}-stack { 5 | position: relative; 6 | display: inline-block; 7 | width: 2em; 8 | height: 2em; 9 | line-height: 2em; 10 | vertical-align: middle; 11 | } 12 | .@{fa-css-prefix}-stack-1x, .@{fa-css-prefix}-stack-2x { 13 | position: absolute; 14 | left: 0; 15 | width: 100%; 16 | text-align: center; 17 | } 18 | .@{fa-css-prefix}-stack-1x { line-height: inherit; } 19 | .@{fa-css-prefix}-stack-2x { font-size: 2em; } 20 | .@{fa-css-prefix}-inverse { color: @fa-inverse; } 21 | -------------------------------------------------------------------------------- /font-awesome-4.6.1/scss/_animated.scss: -------------------------------------------------------------------------------- 1 | // Spinning Icons 2 | // -------------------------- 3 | 4 | .#{$fa-css-prefix}-spin { 5 | -webkit-animation: fa-spin 2s infinite linear; 6 | animation: fa-spin 2s infinite linear; 7 | } 8 | 9 | .#{$fa-css-prefix}-pulse { 10 | -webkit-animation: fa-spin 1s infinite steps(8); 11 | animation: fa-spin 1s infinite steps(8); 12 | } 13 | 14 | @-webkit-keyframes fa-spin { 15 | 0% { 16 | -webkit-transform: rotate(0deg); 17 | transform: rotate(0deg); 18 | } 19 | 100% { 20 | -webkit-transform: rotate(359deg); 21 | transform: rotate(359deg); 22 | } 23 | } 24 | 25 | @keyframes fa-spin { 26 | 0% { 27 | -webkit-transform: rotate(0deg); 28 | transform: rotate(0deg); 29 | } 30 | 100% { 31 | -webkit-transform: rotate(359deg); 32 | transform: rotate(359deg); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /font-awesome-4.6.1/scss/_bordered-pulled.scss: -------------------------------------------------------------------------------- 1 | // Bordered & Pulled 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-border { 5 | padding: .2em .25em .15em; 6 | border: solid .08em $fa-border-color; 7 | border-radius: .1em; 8 | } 9 | 10 | .#{$fa-css-prefix}-pull-left { float: left; } 11 | .#{$fa-css-prefix}-pull-right { float: right; } 12 | 13 | .#{$fa-css-prefix} { 14 | &.#{$fa-css-prefix}-pull-left { margin-right: .3em; } 15 | &.#{$fa-css-prefix}-pull-right { margin-left: .3em; } 16 | } 17 | 18 | /* Deprecated as of 4.4.0 */ 19 | .pull-right { float: right; } 20 | .pull-left { float: left; } 21 | 22 | .#{$fa-css-prefix} { 23 | &.pull-left { margin-right: .3em; } 24 | &.pull-right { margin-left: .3em; } 25 | } 26 | -------------------------------------------------------------------------------- /font-awesome-4.6.1/scss/_core.scss: -------------------------------------------------------------------------------- 1 | // Base Class Definition 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix} { 5 | display: inline-block; 6 | font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration 7 | font-size: inherit; // can't have font-size inherit on line above, so need to override 8 | text-rendering: auto; // optimizelegibility throws things off #1094 9 | -webkit-font-smoothing: antialiased; 10 | -moz-osx-font-smoothing: grayscale; 11 | 12 | } 13 | -------------------------------------------------------------------------------- /font-awesome-4.6.1/scss/_fixed-width.scss: -------------------------------------------------------------------------------- 1 | // Fixed Width Icons 2 | // ------------------------- 3 | .#{$fa-css-prefix}-fw { 4 | width: (18em / 14); 5 | text-align: center; 6 | } 7 | -------------------------------------------------------------------------------- /font-awesome-4.6.1/scss/_larger.scss: -------------------------------------------------------------------------------- 1 | // Icon Sizes 2 | // ------------------------- 3 | 4 | /* makes the font 33% larger relative to the icon container */ 5 | .#{$fa-css-prefix}-lg { 6 | font-size: (4em / 3); 7 | line-height: (3em / 4); 8 | vertical-align: -15%; 9 | } 10 | .#{$fa-css-prefix}-2x { font-size: 2em; } 11 | .#{$fa-css-prefix}-3x { font-size: 3em; } 12 | .#{$fa-css-prefix}-4x { font-size: 4em; } 13 | .#{$fa-css-prefix}-5x { font-size: 5em; } 14 | -------------------------------------------------------------------------------- /font-awesome-4.6.1/scss/_list.scss: -------------------------------------------------------------------------------- 1 | // List Icons 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-ul { 5 | padding-left: 0; 6 | margin-left: $fa-li-width; 7 | list-style-type: none; 8 | > li { position: relative; } 9 | } 10 | .#{$fa-css-prefix}-li { 11 | position: absolute; 12 | left: -$fa-li-width; 13 | width: $fa-li-width; 14 | top: (2em / 14); 15 | text-align: center; 16 | &.#{$fa-css-prefix}-lg { 17 | left: -$fa-li-width + (4em / 14); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /font-awesome-4.6.1/scss/_mixins.scss: -------------------------------------------------------------------------------- 1 | // Mixins 2 | // -------------------------- 3 | 4 | @mixin fa-icon() { 5 | display: inline-block; 6 | font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration 7 | font-size: inherit; // can't have font-size inherit on line above, so need to override 8 | text-rendering: auto; // optimizelegibility throws things off #1094 9 | -webkit-font-smoothing: antialiased; 10 | -moz-osx-font-smoothing: grayscale; 11 | 12 | } 13 | 14 | @mixin fa-icon-rotate($degrees, $rotation) { 15 | -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation})"; 16 | -webkit-transform: rotate($degrees); 17 | -ms-transform: rotate($degrees); 18 | transform: rotate($degrees); 19 | } 20 | 21 | @mixin fa-icon-flip($horiz, $vert, $rotation) { 22 | -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation}, mirror=1)"; 23 | -webkit-transform: scale($horiz, $vert); 24 | -ms-transform: scale($horiz, $vert); 25 | transform: scale($horiz, $vert); 26 | } 27 | 28 | 29 | // Only display content to screen readers. A la Bootstrap 4. 30 | // 31 | // See: http://a11yproject.com/posts/how-to-hide-content/ 32 | 33 | @mixin sr-only { 34 | position: absolute; 35 | width: 1px; 36 | height: 1px; 37 | padding: 0; 38 | margin: -1px; 39 | overflow: hidden; 40 | clip: rect(0,0,0,0); 41 | border: 0; 42 | } 43 | 44 | // Use in conjunction with .sr-only to only display content when it's focused. 45 | // 46 | // Useful for "Skip to main content" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1 47 | // 48 | // Credit: HTML5 Boilerplate 49 | 50 | @mixin sr-only-focusable { 51 | &:active, 52 | &:focus { 53 | position: static; 54 | width: auto; 55 | height: auto; 56 | margin: 0; 57 | overflow: visible; 58 | clip: auto; 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /font-awesome-4.6.1/scss/_path.scss: -------------------------------------------------------------------------------- 1 | /* FONT PATH 2 | * -------------------------- */ 3 | 4 | @font-face { 5 | font-family: 'FontAwesome'; 6 | src: url('#{$fa-font-path}/fontawesome-webfont.eot?v=#{$fa-version}'); 7 | src: url('#{$fa-font-path}/fontawesome-webfont.eot?#iefix&v=#{$fa-version}') format('embedded-opentype'), 8 | url('#{$fa-font-path}/fontawesome-webfont.woff2?v=#{$fa-version}') format('woff2'), 9 | url('#{$fa-font-path}/fontawesome-webfont.woff?v=#{$fa-version}') format('woff'), 10 | url('#{$fa-font-path}/fontawesome-webfont.ttf?v=#{$fa-version}') format('truetype'), 11 | url('#{$fa-font-path}/fontawesome-webfont.svg?v=#{$fa-version}#fontawesomeregular') format('svg'); 12 | // src: url('#{$fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts 13 | font-weight: normal; 14 | font-style: normal; 15 | } 16 | -------------------------------------------------------------------------------- /font-awesome-4.6.1/scss/_rotated-flipped.scss: -------------------------------------------------------------------------------- 1 | // Rotated & Flipped Icons 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-rotate-90 { @include fa-icon-rotate(90deg, 1); } 5 | .#{$fa-css-prefix}-rotate-180 { @include fa-icon-rotate(180deg, 2); } 6 | .#{$fa-css-prefix}-rotate-270 { @include fa-icon-rotate(270deg, 3); } 7 | 8 | .#{$fa-css-prefix}-flip-horizontal { @include fa-icon-flip(-1, 1, 0); } 9 | .#{$fa-css-prefix}-flip-vertical { @include fa-icon-flip(1, -1, 2); } 10 | 11 | // Hook for IE8-9 12 | // ------------------------- 13 | 14 | :root .#{$fa-css-prefix}-rotate-90, 15 | :root .#{$fa-css-prefix}-rotate-180, 16 | :root .#{$fa-css-prefix}-rotate-270, 17 | :root .#{$fa-css-prefix}-flip-horizontal, 18 | :root .#{$fa-css-prefix}-flip-vertical { 19 | filter: none; 20 | } 21 | -------------------------------------------------------------------------------- /font-awesome-4.6.1/scss/_screen-reader.scss: -------------------------------------------------------------------------------- 1 | // Screen Readers 2 | // ------------------------- 3 | 4 | .sr-only { @include sr-only(); } 5 | .sr-only-focusable { @include sr-only-focusable(); } 6 | -------------------------------------------------------------------------------- /font-awesome-4.6.1/scss/_stacked.scss: -------------------------------------------------------------------------------- 1 | // Stacked Icons 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-stack { 5 | position: relative; 6 | display: inline-block; 7 | width: 2em; 8 | height: 2em; 9 | line-height: 2em; 10 | vertical-align: middle; 11 | } 12 | .#{$fa-css-prefix}-stack-1x, .#{$fa-css-prefix}-stack-2x { 13 | position: absolute; 14 | left: 0; 15 | width: 100%; 16 | text-align: center; 17 | } 18 | .#{$fa-css-prefix}-stack-1x { line-height: inherit; } 19 | .#{$fa-css-prefix}-stack-2x { font-size: 2em; } 20 | .#{$fa-css-prefix}-inverse { color: $fa-inverse; } 21 | -------------------------------------------------------------------------------- /font-awesome-4.6.1/scss/font-awesome.scss: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome 4.6.1 by @davegandy - http://fontawesome.io - @fontawesome 3 | * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) 4 | */ 5 | 6 | @import "variables"; 7 | @import "mixins"; 8 | @import "path"; 9 | @import "core"; 10 | @import "larger"; 11 | @import "fixed-width"; 12 | @import "list"; 13 | @import "bordered-pulled"; 14 | @import "animated"; 15 | @import "rotated-flipped"; 16 | @import "stacked"; 17 | @import "icons"; 18 | @import "screen-reader"; 19 | -------------------------------------------------------------------------------- /icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GenderMagProject/GenderMagRecordersAssistant/abe500348a36b9adc9766d11bcf355f61418c2bc/icon.png -------------------------------------------------------------------------------- /icon128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GenderMagProject/GenderMagRecordersAssistant/abe500348a36b9adc9766d11bcf355f61418c2bc/icon128.png -------------------------------------------------------------------------------- /icon32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GenderMagProject/GenderMagRecordersAssistant/abe500348a36b9adc9766d11bcf355f61418c2bc/icon32.png -------------------------------------------------------------------------------- /icon48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GenderMagProject/GenderMagRecordersAssistant/abe500348a36b9adc9766d11bcf355f61418c2bc/icon48.png -------------------------------------------------------------------------------- /images/Abi-lowres.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GenderMagProject/GenderMagRecordersAssistant/abe500348a36b9adc9766d11bcf355f61418c2bc/images/Abi-lowres.jpg -------------------------------------------------------------------------------- /images/Abi_square.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GenderMagProject/GenderMagRecordersAssistant/abe500348a36b9adc9766d11bcf355f61418c2bc/images/Abi_square.jpg -------------------------------------------------------------------------------- /images/Patmulti.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GenderMagProject/GenderMagRecordersAssistant/abe500348a36b9adc9766d11bcf355f61418c2bc/images/Patmulti.png -------------------------------------------------------------------------------- /images/Patricia-lowres.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GenderMagProject/GenderMagRecordersAssistant/abe500348a36b9adc9766d11bcf355f61418c2bc/images/Patricia-lowres.jpg -------------------------------------------------------------------------------- /images/Patricia_square.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GenderMagProject/GenderMagRecordersAssistant/abe500348a36b9adc9766d11bcf355f61418c2bc/images/Patricia_square.jpg -------------------------------------------------------------------------------- /images/Patrick-lowres.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GenderMagProject/GenderMagRecordersAssistant/abe500348a36b9adc9766d11bcf355f61418c2bc/images/Patrick-lowres.jpg -------------------------------------------------------------------------------- /images/Patrick_square.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GenderMagProject/GenderMagRecordersAssistant/abe500348a36b9adc9766d11bcf355f61418c2bc/images/Patrick_square.jpg -------------------------------------------------------------------------------- /images/Patricmulti.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GenderMagProject/GenderMagRecordersAssistant/abe500348a36b9adc9766d11bcf355f61418c2bc/images/Patricmulti.png -------------------------------------------------------------------------------- /images/Tim-lowres.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GenderMagProject/GenderMagRecordersAssistant/abe500348a36b9adc9766d11bcf355f61418c2bc/images/Tim-lowres.jpg -------------------------------------------------------------------------------- /images/Tim_square.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GenderMagProject/GenderMagRecordersAssistant/abe500348a36b9adc9766d11bcf355f61418c2bc/images/Tim_square.jpg -------------------------------------------------------------------------------- /images/Timmulti.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GenderMagProject/GenderMagRecordersAssistant/abe500348a36b9adc9766d11bcf355f61418c2bc/images/Timmulti.png -------------------------------------------------------------------------------- /images/abimulti.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GenderMagProject/GenderMagRecordersAssistant/abe500348a36b9adc9766d11bcf355f61418c2bc/images/abimulti.PNG -------------------------------------------------------------------------------- /images/arrow_collapsed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GenderMagProject/GenderMagRecordersAssistant/abe500348a36b9adc9766d11bcf355f61418c2bc/images/arrow_collapsed.png -------------------------------------------------------------------------------- /images/arrow_expanded.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GenderMagProject/GenderMagRecordersAssistant/abe500348a36b9adc9766d11bcf355f61418c2bc/images/arrow_expanded.png -------------------------------------------------------------------------------- /images/create_persona.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GenderMagProject/GenderMagRecordersAssistant/abe500348a36b9adc9766d11bcf355f61418c2bc/images/create_persona.png -------------------------------------------------------------------------------- /images/ico-chrome.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GenderMagProject/GenderMagRecordersAssistant/abe500348a36b9adc9766d11bcf355f61418c2bc/images/ico-chrome.png -------------------------------------------------------------------------------- /images/image1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GenderMagProject/GenderMagRecordersAssistant/abe500348a36b9adc9766d11bcf355f61418c2bc/images/image1.png -------------------------------------------------------------------------------- /images/image2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GenderMagProject/GenderMagRecordersAssistant/abe500348a36b9adc9766d11bcf355f61418c2bc/images/image2.jpg -------------------------------------------------------------------------------- /images/maroon_button.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GenderMagProject/GenderMagRecordersAssistant/abe500348a36b9adc9766d11bcf355f61418c2bc/images/maroon_button.png -------------------------------------------------------------------------------- /images/scenario.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GenderMagProject/GenderMagRecordersAssistant/abe500348a36b9adc9766d11bcf355f61418c2bc/images/scenario.png -------------------------------------------------------------------------------- /images/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GenderMagProject/GenderMagRecordersAssistant/abe500348a36b9adc9766d11bcf355f61418c2bc/images/screenshot.png -------------------------------------------------------------------------------- /jquery-ui-1.12.1/LICENSE.txt: -------------------------------------------------------------------------------- 1 | Copyright jQuery Foundation and other contributors, https://jquery.org/ 2 | 3 | This software consists of voluntary contributions made by many 4 | individuals. For exact contribution history, see the revision history 5 | available at https://github.com/jquery/jquery-ui 6 | 7 | The following license applies to all parts of this software except as 8 | documented below: 9 | 10 | ==== 11 | 12 | Permission is hereby granted, free of charge, to any person obtaining 13 | a copy of this software and associated documentation files (the 14 | "Software"), to deal in the Software without restriction, including 15 | without limitation the rights to use, copy, modify, merge, publish, 16 | distribute, sublicense, and/or sell copies of the Software, and to 17 | permit persons to whom the Software is furnished to do so, subject to 18 | the following conditions: 19 | 20 | The above copyright notice and this permission notice shall be 21 | included in all copies or substantial portions of the Software. 22 | 23 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 24 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 25 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 26 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 27 | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 28 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 29 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 30 | 31 | ==== 32 | 33 | Copyright and related rights for sample code are waived via CC0. Sample 34 | code is defined as all source code contained within the demos directory. 35 | 36 | CC0: http://creativecommons.org/publicdomain/zero/1.0/ 37 | 38 | ==== 39 | 40 | All files located in the node_modules and external directories are 41 | externally maintained libraries used by this software which have their 42 | own licenses; we recommend you read them, as their terms may differ from 43 | the terms above. 44 | -------------------------------------------------------------------------------- /jquery-ui-1.12.1/images/ui-icons_444444_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GenderMagProject/GenderMagRecordersAssistant/abe500348a36b9adc9766d11bcf355f61418c2bc/jquery-ui-1.12.1/images/ui-icons_444444_256x240.png -------------------------------------------------------------------------------- /jquery-ui-1.12.1/images/ui-icons_555555_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GenderMagProject/GenderMagRecordersAssistant/abe500348a36b9adc9766d11bcf355f61418c2bc/jquery-ui-1.12.1/images/ui-icons_555555_256x240.png -------------------------------------------------------------------------------- /jquery-ui-1.12.1/images/ui-icons_777620_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GenderMagProject/GenderMagRecordersAssistant/abe500348a36b9adc9766d11bcf355f61418c2bc/jquery-ui-1.12.1/images/ui-icons_777620_256x240.png -------------------------------------------------------------------------------- /jquery-ui-1.12.1/images/ui-icons_777777_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GenderMagProject/GenderMagRecordersAssistant/abe500348a36b9adc9766d11bcf355f61418c2bc/jquery-ui-1.12.1/images/ui-icons_777777_256x240.png -------------------------------------------------------------------------------- /jquery-ui-1.12.1/images/ui-icons_cc0000_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GenderMagProject/GenderMagRecordersAssistant/abe500348a36b9adc9766d11bcf355f61418c2bc/jquery-ui-1.12.1/images/ui-icons_cc0000_256x240.png -------------------------------------------------------------------------------- /jquery-ui-1.12.1/images/ui-icons_ffffff_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GenderMagProject/GenderMagRecordersAssistant/abe500348a36b9adc9766d11bcf355f61418c2bc/jquery-ui-1.12.1/images/ui-icons_ffffff_256x240.png -------------------------------------------------------------------------------- /jquery-ui-1.12.1/index.css: -------------------------------------------------------------------------------- 1 | body{ 2 | font-family: "Trebuchet MS", sans-serif; 3 | margin: 50px; 4 | } 5 | .demoHeaders { 6 | margin-top: 2em; 7 | } 8 | #dialog-link { 9 | padding: .4em 1em .4em 20px; 10 | text-decoration: none; 11 | position: relative; 12 | } 13 | #dialog-link span.ui-icon { 14 | margin: 0 5px 0 0; 15 | position: absolute; 16 | left: .2em; 17 | top: 50%; 18 | margin-top: -8px; 19 | } 20 | #icons { 21 | margin: 0; 22 | padding: 0; 23 | } 24 | #icons li { 25 | margin: 2px; 26 | position: relative; 27 | padding: 4px 0; 28 | cursor: pointer; 29 | float: left; 30 | list-style: none; 31 | } 32 | #icons span.ui-icon { 33 | float: left; 34 | margin: 0 4px; 35 | } 36 | .fakewindowcontain .ui-widget-overlay { 37 | position: absolute; 38 | } 39 | select { 40 | width: 200px; 41 | } -------------------------------------------------------------------------------- /jquery-ui-1.12.1/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "jquery-ui", 3 | "title": "jQuery UI", 4 | "description": "A curated set of user interface interactions, effects, widgets, and themes built on top of the jQuery JavaScript Library.", 5 | "version": "1.12.1", 6 | "homepage": "http://jqueryui.com", 7 | "author": { 8 | "name": "jQuery Foundation and other contributors", 9 | "url": "https://github.com/jquery/jquery-ui/blob/1.12.1/AUTHORS.txt" 10 | }, 11 | "main": "ui/widget.js", 12 | "maintainers": [ 13 | { 14 | "name": "Scott González", 15 | "email": "scott.gonzalez@gmail.com", 16 | "url": "http://scottgonzalez.com" 17 | }, 18 | { 19 | "name": "Jörn Zaefferer", 20 | "email": "joern.zaefferer@gmail.com", 21 | "url": "http://bassistance.de" 22 | }, 23 | { 24 | "name": "Mike Sherov", 25 | "email": "mike.sherov@gmail.com", 26 | "url": "http://mike.sherov.com" 27 | }, 28 | { 29 | "name": "TJ VanToll", 30 | "email": "tj.vantoll@gmail.com", 31 | "url": "http://tjvantoll.com" 32 | }, 33 | { 34 | "name": "Felix Nagel", 35 | "email": "info@felixnagel.com", 36 | "url": "http://www.felixnagel.com" 37 | }, 38 | { 39 | "name": "Alex Schmitz", 40 | "email": "arschmitz@gmail.com", 41 | "url": "https://github.com/arschmitz" 42 | } 43 | ], 44 | "repository": { 45 | "type": "git", 46 | "url": "git://github.com/jquery/jquery-ui.git" 47 | }, 48 | "bugs": "https://bugs.jqueryui.com/", 49 | "license": "MIT", 50 | "scripts": { 51 | "test": "grunt" 52 | }, 53 | "dependencies": {}, 54 | "devDependencies": { 55 | "commitplease": "2.3.0", 56 | "grunt": "0.4.5", 57 | "grunt-bowercopy": "1.2.4", 58 | "grunt-cli": "0.1.13", 59 | "grunt-compare-size": "0.4.0", 60 | "grunt-contrib-concat": "0.5.1", 61 | "grunt-contrib-csslint": "0.5.0", 62 | "grunt-contrib-jshint": "0.12.0", 63 | "grunt-contrib-qunit": "1.0.1", 64 | "grunt-contrib-requirejs": "0.4.4", 65 | "grunt-contrib-uglify": "0.11.1", 66 | "grunt-git-authors": "3.1.0", 67 | "grunt-html": "6.0.0", 68 | "grunt-jscs": "2.1.0", 69 | "load-grunt-tasks": "3.4.0", 70 | "rimraf": "2.5.1", 71 | "testswarm": "1.1.0" 72 | }, 73 | "keywords": [] 74 | } 75 | -------------------------------------------------------------------------------- /manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "GenderMag Recorder's Assistant", 3 | "manifest_version": 3, 4 | "description": "Walks you through GenderMag evaluations of the software or website you're creating, step-by-step, and produces a report at the end.", 5 | "version": "1.0.0", 6 | "icons": { 7 | "16": "icon.png", 8 | "48": "icon48.png", 9 | "128": "icon128.png" 10 | }, 11 | "background": { 12 | "service_worker": "core/background.js" 13 | }, 14 | "action": { 15 | "default_icon": "icon.png", 16 | "default_title": "GenderMag Tool" 17 | }, 18 | "content_scripts": [ 19 | { 20 | "matches": [""], 21 | "js": [ 22 | "jquery-ui-1.12.1/external/jquery/jquery.js", 23 | "/scripts/jcanvas.min.js", 24 | "jquery-ui-1.12.1/jquery-ui.min.js", 25 | "scripts/tooltip.js", 26 | "/core/utilities.js", 27 | "/core/setup.js", 28 | "/features/walkthroughHandlers.js", 29 | "scripts/overlayScreen.js", 30 | "/features/prewalkthrough.js", 31 | "scripts/script.js", 32 | "/features/persona.js", 33 | "/scripts/screenshot.js", 34 | "/core/stateManager.js", 35 | "/ui/uiController.js", 36 | "/scripts/action.js", 37 | "/scripts/output.js", 38 | "/Stuk-jszip-4cbaf0e/dist/jszip.js", 39 | "/Stuk-jszip-4cbaf0e/vendor/FileSaver.js" 40 | ], 41 | "css": ["jquery-ui-1.12.1/jquery-ui.css"], 42 | "run_at": "document_start" 43 | } 44 | ], 45 | "permissions": ["unlimitedStorage", "activeTab", "scripting"], 46 | "host_permissions": [""], 47 | "web_accessible_resources": [ 48 | { 49 | "resources": [ 50 | "/templates/*", 51 | "/images/*.jpg", 52 | "/images/*.png", 53 | "/styles/*.css", 54 | "styles/styles.css", 55 | "/jquery-ui-1.12.1/jquery-ui.css", 56 | "/font-awesome-4.6.1/*", 57 | "/Stuk-jszip-4cbaf0e/*" 58 | ], 59 | "matches": [""] 60 | } 61 | ] 62 | } 63 | -------------------------------------------------------------------------------- /privacy-policy.md: -------------------------------------------------------------------------------- 1 | ## PRIVACY POLICY 2 | 3 | This Privacy Policy describes how your information is collected, used, and shared when you use the GenderMag Recorder's Assistant tool. 4 | 5 | * How does the GenderMag Recorder’s Assistant collect data? 6 | The GenderMag Recorder’s Assistant asks questions during the Gendermag walkthrough on your prototype or website. 7 | 8 | * Where exactly does the GenderMag Recorder’s Assistant store data? 9 | The GenderMag Recorder’s Assistant stores data in Google Chrome Local storage on your machine, but only until you click "Quit GenderMag". 10 | 11 | * What data is in there? 12 | The GenderMag Recorder’s Assistant stores all the questions, answers and screenshots that you created during the GenderMag walkthrough. The GenderMag Recorder’s Assistant never asks for personal data. 13 | 14 | * How long does that data exist? 15 | At the end of the GenderMag walkthrough when you click on “Quit GenderMag”, the GenderMag Recorder’s Assistant stores a zip file into the downloads folder. The zip contains a CSV file (which is Excel usable) with the questions and answers and an image folder with all your screenshots. The tool then removes the local storage file from Google Chrome’s Local storage on your machine. 16 | 17 | ## CHANGES 18 | 19 | We may update this privacy policy from time to time in order to reflect, for example, changes to our practices or for other operational, legal or regulatory reasons. 20 | 21 | ## CONTACT US 22 | 23 | For more information about our privacy practices, if you have questions, or if you would like to make a complaint, please contact us by e-mail at gendermag.method@gmail.com 24 | -------------------------------------------------------------------------------- /profile_pic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GenderMagProject/GenderMagRecordersAssistant/abe500348a36b9adc9766d11bcf355f61418c2bc/profile_pic.png -------------------------------------------------------------------------------- /scripts/script.js: -------------------------------------------------------------------------------- 1 | /* This stuff needs to run when the extension starts */ 2 | // $(document).ready(function(){ 3 | // ; console.log("1"); 4 | // init(); 5 | // }) 6 | 7 | // document.addEventListener('DOMContentLoaded', function () { 8 | // console.log("1"); 9 | // init(); 10 | // }); 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /scripts/setup.js: -------------------------------------------------------------------------------- 1 | /* 2 | * File Name: setup.js 3 | * Functions: setup() 4 | * Description: Sets up the initial state of the GenderMag bar 5 | */ 6 | 7 | 8 | /* Function Name: setup 9 | * Description: Sets up the initial state of the GenderMag bar with a the passed-in template (which should 10 | * be "firstState.html" at this point. Adds onclicks to the two buttons. 11 | * Parameters: Takes 2 arguements: 12 | * id: the id of the element to which the template will be appended (e.g. '#GenderMargFrame') 13 | * file: the LOCAL path of the template to use (e.g., "/templates/firstState.html") 14 | */ 15 | // function setup(id, file) { 16 | // //Restore the state of the HTML if it exists, and otherwise draw the normal starting state 17 | // var hasStartedWalkthrough = statusIsTrue("startedGM"); 18 | // if (hasStartedWalkthrough) { 19 | // if (statusIsTrue("sliderIsOpen")) { 20 | // openSlider(); 21 | // } 22 | // else { 23 | // closeSlider(); 24 | // } 25 | // preWalkthrough("#GenderMagFrame", "./templates/popup.html"); 26 | // if (statusIsTrue('drewToolTip')) { 27 | // reloadToolTipState(); 28 | // } 29 | // } 30 | // else { 31 | // //Put the text and buttons on the screen 32 | // var el = $(id).contents().find('body'); 33 | // //appendTemplateToElement(el, file); 34 | // appendTemplateToElement(el, file, function (error) { 35 | // if (error) { 36 | // console.error("Error loading body:", error); 37 | // return; 38 | // } 39 | // console.log("Body appended in setup."); 40 | 41 | // // Add any additional logic here if needed after appending the template 42 | // }); 43 | // //Add the onclick to the "Start Walkthrough" button 44 | // $(id).contents().find('body').children('#startGenderMagButton').off('click').on('click', function () { 45 | // setStatusToTrue("startedGM"); 46 | // preWalkthrough("#GenderMagFrame", "./templates/popup.html"); 47 | // }); 48 | // } 49 | // } 50 | -------------------------------------------------------------------------------- /style_guidelines.md: -------------------------------------------------------------------------------- 1 | # GenderMag Recorders Assistant Style Guide 2 | 3 | ## Formatting : 4 | - Line length (column limit) 5 | - Column limit is 80 characters. Any line exceeding said limit must be wrapped. 6 | - Line wrapping 7 | - Lines preferably should be broken at a higher syntactic level. 8 | - The syntactic levels(from highest to lowest): assignment, division, function call, parameters, number constant. 9 | - Each continuation line must be indented at least +4 from the original line. 10 | - Semi colons 11 | - Semicolons are required immediately at the end of their respective lines. 12 | - Curly brackets/braces 13 | - Required by all control structures. The first statement of a non-empty block must begin on its own line. 14 | - Be concise, empty blocks can be closed immediately after opening. 15 | - No line break before opening brace 16 | - Line breaks after opening and closing brace, and before closing brace. 17 | 18 | ## Naming and Comments: 19 | - Naming 20 | - Method and package names are written in lowerCamelCase, private methods end with _ 21 | - Class, interface, record, typedef, and enum names are written in UpperCamelCase. 22 | - Constant names use all uppercase words separated by underscores. 23 | - Method names are typically verbs / verb phrases 24 | - Function header comments 25 | - Function name, description, and parameters need to be listed before each function. 26 | - File header comments 27 | - File name, functions, and descriptions need to be listed at the top of each file. 28 | - Comments in general 29 | - Block comments should be on the same level as the rest of the code 30 | - Subsequent lines must be aligned with * 31 | - Parameter name comments are preferred to be included with a “=” 32 | - File naming convention 33 | - All lowercase and can include underscores and dashes. 34 | - Name is an overly simplified version of the task the function performs 35 | 36 | ## Other general: 37 | - CSS alphabetical order 38 | - All statements in CSS files must be included in alphabetical order 39 | -------------------------------------------------------------------------------- /styles/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/GenderMagProject/GenderMagRecordersAssistant/abe500348a36b9adc9766d11bcf355f61418c2bc/styles/.DS_Store -------------------------------------------------------------------------------- /styles/index.css: -------------------------------------------------------------------------------- 1 | body{ 2 | font-family: "Trebuchet MS", sans-serif; 3 | margin: 50px; 4 | } 5 | #dialog-link { 6 | padding: .4em 1em .4em 20px; 7 | text-decoration: none; 8 | position: relative; 9 | } 10 | #dialog-link span.ui-icon { 11 | margin: 0 5px 0 0; 12 | position: absolute; 13 | left: .2em; 14 | top: 50%; 15 | margin-top: -8px; 16 | } 17 | #icons { 18 | margin: 0; 19 | padding: 0; 20 | } 21 | #icons li { 22 | margin: 2px; 23 | position: relative; 24 | padding: 4px 0; 25 | cursor: pointer; 26 | float: left; 27 | list-style: none; 28 | } 29 | #icons span.ui-icon { 30 | float: left; 31 | margin: 0 4px; 32 | } 33 | .demoHeaders { 34 | margin-top: 2em; 35 | } 36 | .fakewindowcontain .ui-widget-overlay { 37 | position: absolute; 38 | } 39 | select { 40 | width: 200px; 41 | } 42 | -------------------------------------------------------------------------------- /styles/overlayScreen.css: -------------------------------------------------------------------------------- 1 | #ayy{ 2 | background-color : white; 3 | border:3px solid #4A96AD; 4 | height:500px; 5 | left:100px; 6 | position:absolute; 7 | top:100px; 8 | width: 300px; 9 | } 10 | 11 | #imageAnnotation{ 12 | background-color : white; 13 | border:3px solid #4A96AD; 14 | height:500px; 15 | left:100px; 16 | position:absolute; 17 | top:150px; 18 | transition:width 300ms ease-in-out, height 300ms ease-in-out; 19 | width: 500px; 20 | z-index: 99999; 21 | -moz-transition:width 300ms ease-in-out, height 300ms ease-in-out; 22 | -o-transition:width 300ms ease-in-out, height 300ms ease-in-out; 23 | -webkit-transition:width 300ms ease-in-out, height 300ms ease-in-out; 24 | } 25 | /* uncomment for lulz 26 | 27 | #imageAnnotation:hover{transform: rotate(180deg);} 28 | */ 29 | -------------------------------------------------------------------------------- /styles/slider.css: -------------------------------------------------------------------------------- 1 | body { 2 | margin: 0px; 3 | } 4 | 5 | html { 6 | position: relative; 7 | } 8 | 9 | #GenderMagFrame.clicked { 10 | bottom: 0px; 11 | } 12 | 13 | #GenderMagFrame { 14 | background: #F0F0F0; 15 | border-color: #7D1935; 16 | border-radius: 0 0 5px 0; 17 | border-style: solid; 18 | border-width: 2px 0px 0px 0px; 19 | bottom: -250px; 20 | height: 250px; 21 | left: 0; 22 | position: fixed; 23 | text-align: left; 24 | transition-duration: 0.3s; 25 | width: 100%; 26 | z-index: 99999; 27 | -moz-border-radius: 0 0 5px 0; 28 | -moz-transition-duration: 0.3s; 29 | -o-transition-duration: 0.3s; 30 | -webkit-border-radius: 0 0 5px 0; 31 | -webkit-transition-duration: 0.3s; 32 | } 33 | 34 | #slideout { 35 | background: #7D1935; 36 | bottom: 0px; 37 | border-width:0px; 38 | height:20px; 39 | left: 50%; 40 | padding: 0px; 41 | position: fixed; 42 | text-align: center; 43 | transform: translate(-50%, -0%); 44 | transition-duration: 0.3s; 45 | width: 135px; 46 | z-index: 99999; 47 | -moz-transition-duration: 0.3s; 48 | -o-transition-duration: 0.3s; 49 | -webkit-transition-duration: 0.3s; 50 | } 51 | 52 | #slideout.clicked { 53 | bottom: 250px; 54 | } 55 | -------------------------------------------------------------------------------- /styles/sliderbody.css: -------------------------------------------------------------------------------- 1 | body { 2 | color:white; 3 | background-color: #7D1935; 4 | margin: 0px; 5 | padding: 0px; 6 | text-align: center; 7 | 8 | } 9 | 10 | body:hover { 11 | cursor: pointer; 12 | } 13 | 14 | 15 | -------------------------------------------------------------------------------- /templates/Abi/abiIPSToolTip.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
Abi's Comprehensive Information Processing Style
4 |
5 | Abi's comprehensive information processing style means that 6 | they tend 7 | to gather information about a problem before 8 | they start 9 | to solve it. For instance, Abi might look up a tutorial. 10 | 11 | Abi leans towards a comprehensive information processing style 12 | when they 13 | need to gather information to problem-solve. 14 | That is, before following any option that seems promising, 15 | Abi first gather 16 | information comprehensively to try to form a complete understanding 17 | of the problem before trying to solve it.Thus, their 18 | style is “burst-y”; first Abi read 19 | a lot, then they 20 | act on it in a batch of activity. 21 | 22 | 23 |
24 | 25 | -------------------------------------------------------------------------------- /templates/Abi/abiMToolTip.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 | Abi's Motivation
7 |
8 | Abi prefers to use features and methods that 9 | they are familiar with. 10 | Abi is good with technologies that they 11 | have used before. 12 | 13 | Abi is proficient with the technologies 14 | they use. 15 | 16 | Abi learns new technologies when they 17 | need to, but 18 | they don’t spend their free time 19 | exploring technology or obscure functionality of programs and devices 20 | that they use. 21 | When Abi uses computers to problem-solve, they 22 | have 23 | little desire to learn new functions, or to search for 24 | information on them. Abi tries to use methods that they 25 | are already familiar and comfortable with to achieve 26 | their goals. 27 | 28 | 29 |
30 | 31 | -------------------------------------------------------------------------------- /templates/Abi/abiPersona.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 |
6 |
7 |
8 |
    9 |
  • Is motivated by the usefulness of technology (as opposed to the novelty).
  • 10 |
  • Has a comprehensive information processing style .
  • 11 |
  • Has low computer self-efficacy .
  • 12 |
  • Is risk-averse when it comes to software.
  • 13 |
  • Does not like to explore or tinker.
  • 14 |
15 |
16 |
17 | 18 | -------------------------------------------------------------------------------- /templates/Abi/abiRToolTip.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
Abi's Attitudes Towards Risk 4 |
6 |
7 | Abi's risk-aversion leads Abi to mainly 8 | use software features that they are 9 | familiar with and to avoid features that they 10 | have not used before. 11 | 12 | Abi is risk averse when they 13 | use computers to perform tasks. When 14 | confronted with new software features, Abi worries that they 15 | will spend time on them and not get any benefits from doing so. Abi 16 | tries to perform tasks "the safe” (ie, familiar) way, even if the less 17 | familiar features might promise a more direct solution. 18 | 19 | 20 |
21 | 22 | -------------------------------------------------------------------------------- /templates/Abi/abiSEToolTip.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
Abi's Computer Self-Efficacy 4 |
7 |
8 | Abi's low computer self efficacy means 9 | that they are 10 | not confident performing computing tasks that they 11 | are not familiar with. Abi might give 12 | up if they run 13 | into too many usability issues. 14 | 15 | Abi has low computer self-efficacy, meaning that they 16 | have low 17 | self-confidence in performing computing tasks other than 18 | the ones they are familiar with. This has a variety of impacts on 19 | how they use 20 | software. For example, Abi is not confident that they 21 | can learn to use new features and, as self-efficacy theory explains, 22 | they often give 23 | up if they run into challenges. Software with usability problems 24 | poses more challenges to her than it does to more confident users, 25 | and they often blame 26 | theirself for problems that 27 | they encounter. 28 | 29 | 30 |
31 | 32 | -------------------------------------------------------------------------------- /templates/Abi/abiTToolTip.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
Abi's Attitudes About Tinkering 4 |
5 |
6 | Abi doesn't like to tinker with software, 7 | which means that they might not find features 8 | that aren't apparent. Abi would rather follow step-by-step tutorials, 9 | and typically avoids troublesome features or commands. 10 | 11 | Abi doesn't particularly like tinkering with software 12 | (ie, just trying out new features or commands to see what they do) when 13 | they use 14 | software in their work tasks. Instead, 15 | they prefer 16 | following step-by-step tutorials and wizards. 17 | (However, when Abi does tinker, it has positive effects on 18 | their understanding of the software.) 19 | When software features/commands cause problems for Abi, they 20 | tend to blame 21 | theirself and, if 22 | they can, Abi then 23 | just avoids those troublesome features/commands. Abi then 24 | uses work-arounds that involve using only features/commands 25 | they are familiar with already. 26 | 27 | 28 |
29 | 30 | -------------------------------------------------------------------------------- /templates/Pat/patIPSToolTip.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
Pat's Information Processing Style 4 |
5 |
6 | Pat's comprehensive information processing style 7 | means that they tend 8 | to gather information about a problem before they 9 | start to solve it. For instance, Pat might look up a tutorial. 10 | 11 | Pat leans towards a comprehensive information processing style when 12 | they need to 13 | gather information to problem-solve. That is, before following some option 14 | that seems promising, Pat first gathers information comprehensively 15 | to try to form a complete understanding of the problem before trying to solve it. 16 | Thus, their style is "burst-y"; 17 | first they read 18 | a lot, then they act 19 | on it in a batch of activity. 20 | 21 |
22 | 23 | 24 | -------------------------------------------------------------------------------- /templates/Pat/patMToolTip.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
Pat's Motivation
4 |
5 | Pat learns new technologies when they 6 | need to, and they 7 | are good with technology that 8 | they have 9 | experience with. 10 | 11 | Pat is proficient with the technologies they 12 | use.Pat learns new technologies 13 | when they need 14 | to, but Pat doesn't spend their 15 | free time exploring technology or exploring obscure functionality 16 | of programs and devices that they use. Pat tends to use methods 17 | they are 18 | already familiar and comfortable with to achieve their goals. 19 | 20 | 21 |
22 | 23 | 24 | -------------------------------------------------------------------------------- /templates/Pat/patPersona.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 |
7 |
8 |
9 |
    10 |
  • Is motivated by the usefulness of technology.
  • 11 |
  • Has a comprehensive information processing style .
  • 12 |
  • Has medium computer self-efficacy .
  • 13 |
  • Is risk-averse when it comes to software.
  • 14 |
  • May purposefully explore or tinker, but prefers not to.
  • 15 |
16 |
17 |
18 | 19 | -------------------------------------------------------------------------------- /templates/Pat/patRToolTip.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
Pat's Attitudes About Risk 4 |
5 |
6 | Pat's risk-aversion leads Pat to mainly use 7 | software features that they are 8 | familiar with and to avoid features that they 9 | have not used before. 10 | 11 | Pat is risk averse when they 12 | use computers to perform tasks. When 13 | confronted with new software features, Pat worries that they 14 | will spend time on them and not get any benefits from doing so. 15 | they to 16 | perform tasks "the safe" (ie, familiar) way if possible, even if less 17 | familiar features might promise a more direct solution. 18 | 19 | 20 |
21 | 22 | 23 | -------------------------------------------------------------------------------- /templates/Pat/patSEToolTip.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
Pat's Computer Self-Efficacy 4 |
5 |
6 | Pat's medium computer self efficacy means 7 | that they will 8 | persist through some challenges when using software for a reasonable amount of time. 9 | 10 | Pat has medium computer self-efficacy, meaning 11 | that they have some 12 | self-confidence in performing computing tasks other than the ones they 13 | are familiar with. This has a variety of 14 | impacts on how they use 15 | software. For example, Pat will keep on trying to figure out how to achieve 16 | what they have 17 | set out to do for quite awhile; Pat doesn't give up right away when computers 18 | or technology present a challenge. 19 | 20 |
21 | 22 | 23 | -------------------------------------------------------------------------------- /templates/Pat/patTToolTip.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
Pat's Attitudes Towards 4 | Tinkering
5 |
6 | Pat will tinker and explore software features a bit, 7 | but if Pat doesn't think that they 8 | are getting closer to their 9 | goal, Pat will revert to familiar ways. 10 | 11 | When Pat sees a need to learn new technology, Pat does 12 | so by trying out new features or commands to see what they 13 | do and to understand how the software works. Pat does this purposefully; 14 | that is, they reflect 15 | on each bit of feedback they get 16 | along the way to understand how they might benefit 17 | from the feature. Eventually, if Pat doesn't think it will get them closer to what 18 | they want to achieve, 19 | they will revert back 20 | to ways that they already 21 | know will work. 22 | 23 |
24 | 25 | 26 | -------------------------------------------------------------------------------- /templates/Tim/timIPSToolTip.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 | Tim's Selective Information Processing Style 5 |
8 |
9 | Tim's selective information processing 10 | style means that they solve 11 | problems incrementally, delving into the first promising option and 12 | pursuing it, then backing out if it doesn't work. 13 | 14 | When Tim is exploring or searching for information to solve a 15 | problem with a computer program or gadget they 16 | use, Tim likes a selective information 17 | processing style or “depth first” approach. That is, Tim usually 18 | delves into the first promising option, 19 | pursue it, and if it doesn’t work out they 20 | back out and gather 21 | a bit more information until they 22 | see another 23 | option to try. Thus, their 24 | style is very incremental. 25 | 26 | 27 |
28 | 29 | -------------------------------------------------------------------------------- /templates/Tim/timMToolTip.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
Tim's Motivation
7 |
8 | Tim likes to learn all the available 9 | functionality of their devices, 10 | exploring even the most obscure features. 11 | 12 | Tim is proficient with the technologies they 13 | use. Tim likes learning all the available 14 | functionality on all of their devices 15 | and the computer systems they use, 16 | even when it may not be necessary help Tim achieve their 17 | tasks. Tim likes trying to figure out if there is more than one 18 | way of doing the same thing. Time sometimes finds theirself 19 | exploring functions of one of their 20 | gadgets for so long that they lose 21 | sight of what they wanted to do with it to begin with. 22 | 23 | 24 |
25 | 26 | -------------------------------------------------------------------------------- /templates/Tim/timPersona.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 |
7 |
8 |
9 |
    10 |
  • Is motivated by the novelty of technology (as opposed to the usefulness).
  • 11 |
  • Has a selective information processing style .
  • 12 |
  • Has high computer self-efficacy .
  • 13 |
  • Is risk-taking when it comes to software.
  • 14 |
  • Likes to explore and tinker.
  • 15 |
16 |
17 |
18 | 19 | 20 | -------------------------------------------------------------------------------- /templates/Tim/timRToolTip.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 | Tim's Attitudes Towards Risk 5 |
7 |
8 | Tim doesn't mind taking risks when it 9 | comes to using features they have not seen before. 10 | 11 | Tim doesn’t mind taking risks using features 12 | of technology that haven’t been proven to work. When 13 | Tim is presented with challenges because they 14 | have tried a new way that doesn’t work, 15 | it doesn’t change their attitudes toward technology. 16 | 17 | 18 |
19 | 20 | -------------------------------------------------------------------------------- /templates/Tim/timSEToolTip.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 | Tim's Computer Self-Efficacy
7 |
8 | Tim is very confident in their 9 | technological abilities, and they blame 10 | the software vendor if they run into problems with features. 11 | 12 | Tim is very confident in their 13 | abilities with technology, and thinks they 14 | are better than the average person at learning about new features. 15 | Tim doesn't give up easily when computers or technology present a 16 | challenge to them. Tim will spend hours 17 | reading the manual so they can configure 18 | something to do exactly what they want to do. 19 | If they can’t fix the problem, 20 | they blame it on the software vendor; 21 | it’s not their fault if 22 | they can’t get it to work. 23 | 24 | 25 |
26 | 27 | -------------------------------------------------------------------------------- /templates/Tim/timTToolTip.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 | Tim's Attitudes About Tinkering
7 |
8 | Tim builds their 9 | understanding of the software by exploring and tinkering with its features and menus. 10 | 11 | Whenever they use 12 | new technology, Tim tries to construct their own understanding 13 | of how the software works internally. Tim likes 14 | tinkering and exploring the menu items and functions 15 | of the software or device in order to build that understanding. 16 | Sometimes though, Tim plays with features too much, losing focus 17 | on what they set out to do originally. 18 | 19 | 20 |
21 | 22 | -------------------------------------------------------------------------------- /templates/actionAnswers.html: -------------------------------------------------------------------------------- 1 | 2 |
3 | Action :   4 |
5 |
6 | 7 | 8 | 9 | 10 | Will Abi know what to do at this step? 11 |
    12 |
  • You said:
    because...
  • 13 |
  • Facets used:
  • 14 |
15 |
16 | 17 | 18 | If Abi does the right thing, will they know that they did the right thing and that they are making progress toward her goal? 19 |
    20 |
  • You said:
    because...
  • 21 |
  • Facets used:
  • 22 |
23 |
24 |
-------------------------------------------------------------------------------- /templates/actionPrompt.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 |
5 | 6 |
7 |
8 | 9 |         10 | 11 |
12 | 13 | 19 |
20 | 21 | 22 | -------------------------------------------------------------------------------- /templates/background.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /templates/custom/custom.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 |
6 |
7 |
8 |
    9 |
  • Check Your customized persona printout for persona facets details.
  • 10 |
  • Create your Customized persona here.
  • 11 |
12 |
13 |
14 | 15 | 16 | -------------------------------------------------------------------------------- /templates/firstState.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | Welcome To GenderMag! 14 | 15 | 16 | 17 | 18 |

Welcome to the GenderMag Recorder's Assistant!

19 |

The GenderMag Method (short for “Gender Inclusiveness Magnifier”) is a method for finding gender-inclusiveness issues in software features. Using GenderMag, software developers and/or user experience (UX) teams can evaluate their software from a gender-inclusiveness perspective. Fixing issues that may disproportionately affect one gender over another can lead to better usability for everyone.

20 |

More information about GenderMag can be found on our website.

21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /templates/imageAnnotation.html: -------------------------------------------------------------------------------- 1 |
2 |
3 | 4 | Draw on the image below! We'll save your markup. 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 |
-------------------------------------------------------------------------------- /templates/output.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /templates/setupToolTip.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 | This is the GenderMag Recorder's Assistant. This should eventually explain more about it and the setup process 5 | 6 |
7 | 8 | 9 | -------------------------------------------------------------------------------- /templates/slider.html: -------------------------------------------------------------------------------- 1 | 4 | 5 | -------------------------------------------------------------------------------- /templates/sliderFinalWarning.html: -------------------------------------------------------------------------------- 1 |
2 |

WARNING! Selecting 'Quit GenderMag' below will clear all of your current session's data. Please ensure that you have downloaded the zip file which contains all your screen captures and a file with all of your answers if you wish to have a copy of your current session.

3 |

7 |
8 | 9 | 10 |
11 | --------------------------------------------------------------------------------