├── .eslintignore ├── .eslintrc.js ├── .github └── workflows │ ├── docs.yml │ └── lint_code.yml ├── .gitignore ├── .prettierignore ├── .travis.yml ├── CNAME ├── LICENSE ├── Makefile ├── README.md ├── main.py ├── miniconf.gif ├── package-lock.json ├── package.json ├── requirements-dev.txt ├── requirements.txt ├── scripts ├── GoogleScholar_generate_citation_graph.py ├── README.md ├── README_Schedule.md ├── SemanticScholarAuthKey.txt ├── SemanticScholar_generate_citation_graph.py ├── check_cited.py ├── check_latex_spelling.py ├── count_authors.py ├── eject_redundant_bibtex_fields.py ├── embeddings.py ├── export_bibtex.py ├── export_latex_table.py ├── format.py ├── generate_bibtex_json.py ├── parse_calendar.py ├── quickfix.py ├── reduce.py ├── run_api.py ├── sample_cal.ics ├── spreadsheet_check_error.py └── util.py ├── sitedata ├── SemanticScholarAuthKey.txt ├── citation_graph.json ├── config.yml ├── favicon.ico ├── papers.csv ├── papers_metadata.txt └── thumbnails │ └── no_thumbnail_available.png ├── static ├── css │ ├── 4UaZrEtFpBI4f1ZSIK9d4LjJ4lM3OwRmPg.ttf │ ├── Cuprum.css │ ├── Exo.css │ ├── Lato.css │ ├── S6u9w4BMUTPHh50XSwiPHA.ttf │ ├── S6uyw4BMUTPHjx4wWw.ttf │ ├── bulma-carousel.min.css │ ├── bulma-slider.min.css │ ├── bulma.css.map.txt │ ├── bulma.min.css │ ├── citation_graph.css │ ├── default.css │ ├── dg4k_pLmvrkcOkBNJutH.ttf │ ├── fa_solid.css │ ├── fontawesome.all.min.css │ ├── index.css │ ├── jquery.tag-editor.css │ ├── lazy_load.css │ ├── leaderboard.css │ ├── main.css │ ├── paper_vis.css │ ├── typeahead.css │ └── vis-timeline-graph2d.min.css ├── images │ ├── BVC_logo.png │ ├── Brown_logo.png │ ├── Brown_logo_text.png │ ├── MIT_logo.png │ ├── NeuralFields_Promo.mp4 │ ├── NeuralFieldsinVisualComputing.png │ ├── SRG_logo.png │ ├── alex.jpeg │ ├── anima.jpg │ ├── anima.png │ ├── browse.gif │ ├── browse.png │ ├── citation.gif │ ├── contributors │ │ ├── Alex_Yu.jpg │ │ ├── Federico_Tombari.jpg │ │ ├── James_Tompkin.jpg │ │ ├── Numair_Khan.jpg │ │ ├── Or_Litany.jpg │ │ ├── Shiqin_Yan.jpg │ │ ├── Shunsuke_Saito.png │ │ ├── Srinath_Sridhar.jpeg │ │ ├── Sunny_Li.jpg │ │ ├── Towaki_Takikawa.png │ │ ├── Vincent_Sitzmann.jpeg │ │ └── Yiheng_Xie.jpg │ ├── cvpr.png │ ├── ellen.png │ ├── james.jpeg │ ├── long_logo.png │ ├── long_logo_new.png │ ├── main_logo.png │ ├── main_logo_new.png │ ├── new.gif │ ├── or.jpg │ ├── our_paper_first_page.png │ ├── shunsuke.png │ ├── srinath.jpg │ ├── statistics.gif │ ├── steve.webm │ ├── teaser.jpg │ ├── teaser_cvpr22.jpg │ ├── teaser_cvpr22.pptx │ ├── timeline.gif │ ├── towaki.png │ ├── twitter_logo.png │ ├── vincent.jpeg │ ├── yiheng.jpeg │ └── zongyi.jpg ├── js │ ├── bulma-carousel.js │ ├── bulma-carousel.min.js │ ├── bulma-slider.js │ ├── bulma-slider.min.js │ ├── data │ │ ├── FileSaver.js │ │ ├── api.js │ │ └── persistor.js │ ├── fontawesome.all.min.js │ ├── index.js │ ├── libs_ext │ │ └── typeahead.bundle.js │ ├── modules │ │ ├── auth0protect.js │ │ ├── gdprCookies.js │ │ ├── icons.js │ │ ├── lazyLoad.js │ │ ├── pdfRender.js │ │ ├── typeaheadSetup.js │ │ └── urlParams.js │ ├── plotly │ │ └── plotly-2.4.2.min.js │ ├── tagEditor │ │ ├── jquery.caret.min.js │ │ └── jquery.tag-editor.min.js │ ├── views │ │ ├── index.js │ │ ├── paper_detail.js │ │ ├── paper_vis_citation_graph.js │ │ ├── paper_vis_statistics.js │ │ ├── paper_vis_timeline.js │ │ ├── papers.js │ │ ├── papers_vague.js │ │ └── view_utils.js │ └── vis │ │ ├── vis-network.min.js │ │ └── vis-timeline-graph2d.min.js ├── pdf │ └── 2021_NeuralFieldsReview.pdf └── webfonts │ ├── fa-solid-900.eot │ ├── fa-solid-900.svg │ ├── fa-solid-900.ttf │ ├── fa-solid-900.woff │ └── fa-solid-900.woff2 ├── temp └── .gitignore ├── templates ├── add_paper.html ├── base.html ├── components.html ├── cvpr22.html ├── eg22.html ├── faq.html ├── index.html ├── index_base.html ├── join_us.html ├── paper_detail.html ├── papers.html ├── papers_vague.html ├── papers_vis_citation_graph.html ├── papers_vis_statistics.html ├── papers_vis_timeline.html └── siggraph23.html ├── update.sh └── web-update.md /.eslintignore: -------------------------------------------------------------------------------- 1 | static/js/libs_ext/typeahead.bundle.js 2 | static/js/libs_ext/ical.js 3 | static/js/views/calendar.js 4 | static/js/views/paper_vis.js 5 | static/js/views/papers.js 6 | static/js/data/persistor.js 7 | static/js/legacy/schedule.js 8 | static/js/modules/lazy_load.js 9 | static/js/modules/little_helpers.js 10 | -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | env: { 3 | browser: true, 4 | es6: true, 5 | jquery: true, 6 | }, 7 | plugins: ["eslint-plugin-html"], 8 | extends: ["airbnb-base", "plugin:prettier/recommended"], 9 | globals: { 10 | Atomics: "readonly", 11 | SharedArrayBuffer: "readonly", 12 | }, 13 | parserOptions: { 14 | ecmaVersion: 2018, 15 | }, 16 | rules: { 17 | // disable rules from base configurations 18 | "camelcase": "off", 19 | "func-names": "off", 20 | "no-unused-vars": "off", 21 | "no-undef": "off", 22 | "no-param-reassign": "off", 23 | // "max-len": [1, {code: 120}] 24 | }, 25 | }; 26 | -------------------------------------------------------------------------------- /.github/workflows/docs.yml: -------------------------------------------------------------------------------- 1 | name: Deploys the docs to a remote server directly on checkin. 2 | 3 | 4 | on: 5 | push: 6 | branches: 7 | - master 8 | 9 | jobs: 10 | build: 11 | runs-on: ubuntu-latest 12 | strategy: 13 | matrix: 14 | python-version: [3.8] 15 | 16 | steps: 17 | - uses: actions/checkout@v2 18 | - name: Set up Python ${{ matrix.python-version }} 19 | uses: actions/setup-python@v2 20 | with: 21 | python-version: ${{ matrix.python-version }} 22 | - name: Install dependencies 23 | run: | 24 | python -m pip install --upgrade pip 25 | pip install -r requirements.txt 26 | - name: build docs 27 | run: | 28 | python main.py sitedata/ --build 29 | - name: Install SSH Client 30 | uses: webfactory/ssh-agent@v0.4.1 31 | with: 32 | ssh-private-key: ${{ secrets.DEPLOY_KEY }} 33 | - name: Deploy 34 | uses: "JamesIves/github-pages-deploy-action@3.7.1" 35 | with: 36 | REPOSITORY_NAME: mini-conf/mini-conf.github.io 37 | BRANCH: master # The branch the action should deploy to. 38 | SSH: true 39 | FOLDER: build/ # The folder the action should deploy. 40 | CLEAN: true 41 | -------------------------------------------------------------------------------- /.github/workflows/lint_code.yml: -------------------------------------------------------------------------------- 1 | name: Lint code 2 | 3 | on: 4 | push: 5 | branches: [ master ] 6 | pull_request: 7 | branches: [ master ] 8 | 9 | jobs: 10 | build: 11 | 12 | runs-on: ubuntu-latest 13 | 14 | steps: 15 | - uses: actions/checkout@v2 16 | - name: Set up Python 3.7 17 | uses: actions/setup-python@v2 18 | with: 19 | python-version: 3.7 20 | - name: Install Python dependencies 21 | run: | 22 | python -m pip install --upgrade pip 23 | pip install -r requirements.txt 24 | pip install -r requirements-dev.txt 25 | - name: Use Node.js 26 | uses: actions/setup-node@v1 27 | with: 28 | node-version: '12.x' 29 | - name: Install NPM dependencies 30 | run: npm ci 31 | - name: Format check 32 | run: make format-check 33 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | pip-wheel-metadata/ 24 | share/python-wheels/ 25 | *.egg-info/ 26 | .installed.cfg 27 | *.egg 28 | MANIFEST 29 | 30 | # PyInstaller 31 | # Usually these files are written by a python script from a template 32 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 33 | *.manifest 34 | *.spec 35 | 36 | # Installer logs 37 | pip-log.txt 38 | pip-delete-this-directory.txt 39 | 40 | # Unit test / coverage reports 41 | htmlcov/ 42 | .tox/ 43 | .nox/ 44 | .coverage 45 | .coverage.* 46 | .cache 47 | nosetests.xml 48 | coverage.xml 49 | *.cover 50 | *.py,cover 51 | .hypothesis/ 52 | .pytest_cache/ 53 | 54 | # Translations 55 | *.mo 56 | *.pot 57 | 58 | # Django stuff: 59 | *.log 60 | local_settings.py 61 | db.sqlite3 62 | db.sqlite3-journal 63 | 64 | # Flask stuff: 65 | instance/ 66 | .webassets-cache 67 | 68 | # Scrapy stuff: 69 | .scrapy 70 | 71 | # Sphinx documentation 72 | docs/_build/ 73 | 74 | # PyBuilder 75 | target/ 76 | 77 | # Jupyter Notebook 78 | .ipynb_checkpoints 79 | 80 | # IPython 81 | profile_default/ 82 | ipython_config.py 83 | 84 | # pyenv 85 | .python-version 86 | 87 | # pipenv 88 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 89 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 90 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 91 | # install all needed dependencies. 92 | #Pipfile.lock 93 | 94 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow 95 | __pypackages__/ 96 | 97 | # Celery stuff 98 | celerybeat-schedule 99 | celerybeat.pid 100 | 101 | # SageMath parsed files 102 | *.sage.py 103 | 104 | # Environments 105 | .env 106 | .venv 107 | env/ 108 | venv/ 109 | ENV/ 110 | env.bak/ 111 | venv.bak/ 112 | # @yxie20 venv 113 | nfreview/ 114 | 115 | # Spyder project settings 116 | .spyderproject 117 | .spyproject 118 | 119 | # Rope project settings 120 | .ropeproject 121 | 122 | # mkdocs documentation 123 | /site 124 | 125 | # mypy 126 | .mypy_cache/ 127 | .dmypy.json 128 | dmypy.json 129 | 130 | # Pyre type checker 131 | .pyre/ 132 | 133 | # IntelliJ 134 | .idea/ 135 | 136 | # node 137 | node_modules/ 138 | 139 | # MacOS 140 | .DS_Store 141 | 142 | # Auth keys 143 | scripts/SemanticScholarAuthKey 144 | neural-fields-AWS-key.pem 145 | 146 | # Alternative Data Stream files (includes colons that cause problems on Windows) 147 | **/*:Zone.Identifier 148 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | static/js/libs_ext/typeahead.bundle.js 2 | static/js/libs_ext/ical.js 3 | static/js/views/calendar.js 4 | static/js/views/paper_vis.js 5 | static/js/views/papers.js 6 | static/js/data/persistor.js 7 | static/js/legacy/schedule.js 8 | static/js/modules/lazy_load.js 9 | static/js/modules/little_helpers.js 10 | static/css/Exo.css 11 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: python 2 | python: 3 | - "3.7" 4 | cache: pip 5 | install: 6 | - pip install -r requirements.txt 7 | - pip install -r requirements-dev.txt 8 | script: 9 | - make format-check 10 | -------------------------------------------------------------------------------- /CNAME: -------------------------------------------------------------------------------- 1 | neuralfields.cs.brown.edu -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Mini-Conf 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 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | PYTHON_FILES = main.py scripts/ chat/ 2 | JS_FILES = $(shell find static/js -name "*.js") 3 | CSS_FILES = $(shell find static/css -name "*.css") 4 | .PHONY: format-python format-web format run freeze format-check 5 | TEMP_DEPLOY_BRANCH = "temp-gh-pages" 6 | 7 | all: format-check 8 | 9 | format-python: 10 | isort -rc $(PYTHON_FILES) --multi-line=3 --trailing-comma --force-grid-wrap=0 --use-parentheses --line-width=88 11 | black -t py37 $(PYTHON_FILES) 12 | 13 | format-web: 14 | npx prettier $(JS_FILES) $(CSS_FILES) --write 15 | npx eslint $(JS_FILES) --fix 16 | 17 | format: format-python format-web 18 | 19 | run: 20 | export FLASK_DEBUG=True; export FLASK_DEVELOPMENT=True; python3 main.py sitedata/ 21 | 22 | freeze: 23 | python3 main.py sitedata/ --build 24 | 25 | # check code format 26 | format-check: 27 | (isort -rc $(PYTHON_FILES) --check-only --multi-line=3 --trailing-comma --force-grid-wrap=0 --use-parentheses --line-width=88) && (black -t py37 --check $(PYTHON_FILES)) || (echo "run \"make format\" to format the code"; exit 1) 28 | pylint -j0 $(PYTHON_FILES) 29 | mypy --show-error-codes $(PYTHON_FILES) 30 | npx prettier $(JS_FILES) $(CSS_FILES) --check 31 | npx eslint $(JS_FILES) 32 | @echo "format-check passed" 33 | 34 | deploy: 35 | git checkout main 36 | python3 main.py sitedata/ --build 37 | -git branch -D gh-pages 38 | -git branch -D $(TEMP_DEPLOY_BRANCH) 39 | git checkout -b $(TEMP_DEPLOY_BRANCH) 40 | git add -f build 41 | git commit -am "Deploy on gh-pages" 42 | git subtree split --prefix build -b gh-pages 43 | git push --force "https://${GH_TOKEN}@${GH_REF}.git" gh-pages 44 | # git push --force origin gh-pages 45 | # @yxie20: added CNAME here 46 | git checkout gh-pages 47 | touch CNAME 48 | echo "neuralfields.cs.brown.edu" >> CNAME 49 | git add CNAME 50 | git commit -m "Auto-add CNAME" 51 | git push --set-upstream origin gh-pages 52 | # END @yxie20 53 | git checkout @{-1} 54 | # -git branch -D $(TEMP_DEPLOY_BRANCH) 55 | git checkout main 56 | @echo "Deployed to gh-pages 🚀" 57 | 58 | deploy-2: 59 | git checkout main 60 | python3 main.py sitedata/ --build 61 | -git branch -D gh-pages 62 | -git branch -D $(TEMP_DEPLOY_BRANCH) 63 | git checkout -b $(TEMP_DEPLOY_BRANCH) 64 | git add -f build 65 | git commit -am "Deploy on gh-pages" 66 | git subtree split --prefix build -b gh-pages 67 | git push --force origin gh-pages 68 | # git push --force origin gh-pages 69 | # @yxie20: added CNAME here 70 | git checkout gh-pages 71 | touch CNAME 72 | echo "neuralfields.cs.brown.edu" >> CNAME 73 | git add CNAME 74 | git commit -m "Auto-add CNAME" 75 | git push --set-upstream origin gh-pages 76 | # END @yxie20 77 | git checkout @{-1} 78 | # -git branch -D $(TEMP_DEPLOY_BRANCH) 79 | git checkout main 80 | @echo "Deployed to gh-pages 🚀" 81 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## Neural Fields in Visual Computing—Complementary Webpage 2 | 3 | This is based on the amazing MiniConf project from [Hendrik Strobelt](http://twitter.com/hen_str) and [Sasha Rush](http://twitter.com/srush_nlp)—thank you! 4 | 5 | 6 | ### Citation 7 | If you find our project helpful, please cite our review paper: 8 | ``` 9 | @article{10.1111:cgf.14505, 10 | journal = {Computer Graphics Forum}, 11 | title = {Neural Fields in Visual Computing and Beyond}, 12 | author = {Xie, Yiheng and Takikawa, Towaki and Saito, Shunsuke and Litany, Or and Yan, Shiqin and Khan, Numair and Tombari, Federico and Tompkin, James and Sitzmann, Vincent and Sridhar, Srinath}, 13 | year = {2022}, 14 | publisher = {The Eurographics Association and John Wiley & Sons Ltd.}, 15 | ISSN = {1467-8659}, 16 | DOI = {10.1111/cgf.14505} 17 | } 18 | ``` 19 | 20 | ## Adding a paper—How To 21 | See our website instructions 22 | 23 | ## Website Team—Get Started on Development 24 | 25 |
26 | > pip install -r requirements.txt
27 | > make run
28 | 
29 | 30 | When you are ready to deploy run `make freeze` to get a static version of the site in the `build` folder. 31 | 32 | ### Deploying to Github 33 | 34 | - Define two command-line variables `GH_TOKEN` and `GH_REF`. `GH_TOKEN` is your Github personal access token, and will look like `username:token`. `GH_REF` is the location of this repo, e.g., ```$> export GH_REF=github.com/brownvc/neural-fields-review```. 35 | - *DO NOT* add `GH_TOKEN` to the Makefile—this is your personal access token and should be kept private. Hence, declare a temporary command line variable using `export`. 36 | - Commit any changes. Any uncommited changes will be OVERWRITTEN! 37 | - Execute `make deploy`. 38 | - That's it. The page is now [live here](https://brownvc.github.io/neural-fields-review/). 39 | 40 | ### Tour 41 | 42 | The repo contains: 43 | 44 | 1) *Datastore* `sitedata/` 45 | 46 | Collection of CSV files representing the papers, speakers, workshops, and other important information for the conference. 47 | 48 | 2) *Routing* `main.py` 49 | 50 | One file flask-server handles simple data preprocessing and site navigation. 51 | 52 | 3) *Templates* `templates/` 53 | 54 | Contains all the pages for the site. See `base.html` for the master page and `components.html` for core components. 55 | 56 | 4) *Frontend* `static/` 57 | 58 | Contains frontend components like the default css, images, and javascript libs. 59 | 60 | 5) *Scripts* `scripts/` 61 | 62 | Contains additional preprocessing to add visualizations, recommendations, schedules to the conference. 63 | 64 | 6) For importing calendars as schedule see [scripts/README_Schedule.md](https://github.com/brownvc/neural-fields-review/tree/main/scripts/README_Schedule.md) 65 | 66 | ### Extensions 67 | 68 | MiniConf is designed to be a completely static solution. However it is designed to integrate well with dynamic third-party solutions. We directly support the following providers: 69 | 70 | * Rocket.Chat: The `chat/` directory contains descriptions for setting up a hosted Rocket.Chat instance and for embedding chat rooms on individual paper pages. You can either buy a hosted setting from Rocket.chat or we include instructions for running your own scalable instance through sloppy.io. 71 | 72 | * Auth0 : The code can integrate through Auth0.com to provide both page login (through javascript gating) and OAuth SSO with Rocket Chat. The documentation on Auth0 is very easy to follow, you simply need to create an Application for both the MiniConf site and the Rocket.Chat server. You then enter in the Client keys to the appropriate configs. 73 | 74 | * SlidesLive: It is easy to embedded any video provider -> YouTube, Vimeo, etc. However we have had great experience with SlidesLive and recommend them as a host. We include a slideslive example on the main page. 75 | 76 | * PDF.js: For conferences that use posters it is easy to include an embedded pdf on poster pages. An example is given. 77 | 78 | ### Semantic Scholar API 79 | 80 | Contact: Joe Gorney, Manager - Strategic Partnerships, Semantic Scholar, ph.206.548.5606 | joeg@allenai.org 81 | See project email account `neuralfields@cs.brown.edu` for more detail. 82 | 83 | ### Google Analytics API 84 | 85 | ### Keyword Statisics, Citation Graphs 86 | * Keyword Statistics: The keywords are generated by a JS script (paper_vis_statistics.js line 13-58) running on the front end every time this page is loaded. So yes they will change correspondingly when papers' data is updated. 87 | 88 | * Citation Graphs: Data for drawing citation graphs is generated by running script scripts/SemanticScholar_generate_citation_graph.py while deploying. I don't think our semantic scholar authentication token will expire. -------------------------------------------------------------------------------- /miniconf.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brownvc/neural-fields-review/5f30abcee9451cea8193339a78e1dbdaa0687b2e/miniconf.gif -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "mini-conf", 3 | "version": "1.0.0", 4 | "description": "mini-conf for virtual conference", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "repository": { 10 | "type": "git", 11 | "url": "git+https://github.com/Mini-Conf/Min-Conf.git" 12 | }, 13 | "author": "", 14 | "license": "MIT", 15 | "bugs": { 16 | "url": "https://github.com/Mini-Conf/Mini-Conf/issues" 17 | }, 18 | "homepage": "https://github.com/Mini-Conf/Mini-Conf#readme", 19 | "devDependencies": { 20 | "eslint": "^6.8.0", 21 | "eslint-config-airbnb": "^18.1.0", 22 | "eslint-config-prettier": "^6.11.0", 23 | "eslint-plugin-html": "^6.0.2", 24 | "eslint-plugin-import": "^2.20.2", 25 | "eslint-plugin-jsx-a11y": "^6.2.3", 26 | "eslint-plugin-prettier": "^3.1.3", 27 | "eslint-plugin-react": "^7.20.0", 28 | "eslint-plugin-react-hooks": "^2.5.0", 29 | "prettier": "^2.3.2" 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /requirements-dev.txt: -------------------------------------------------------------------------------- 1 | black==19.10b0 2 | pylint==2.4.4 3 | mypy==0.761 4 | -r scripts/requirements.txt 5 | -r chat/requirements.txt 6 | isort<5 7 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | flask 2 | frozen-flask 3 | Flask-Markdown 4 | tqdm 5 | PyYAML 6 | 7 | # For Yiheng's scripts 8 | arxiv2bib 9 | feedparser 10 | openpyxl 11 | xlsxwriter 12 | unidecode 13 | scholarly 14 | -------------------------------------------------------------------------------- /scripts/GoogleScholar_generate_citation_graph.py: -------------------------------------------------------------------------------- 1 | # This script works, but google doesn't like robot... So it cannot work well without proxy 2 | from scholarly import scholarly 3 | import csv 4 | import json 5 | import time 6 | 7 | 8 | def get_names_of_papers_citing_this(paper_name): 9 | search_query = scholarly.search_pubs(paper_name) 10 | print("Sending request to google...") 11 | pub = scholarly.fill(next(search_query)) 12 | print("Heard back from google!") 13 | try: 14 | return [citation['bib']['title'] for citation in scholarly.citedby(pub)] 15 | except: 16 | return [] 17 | 18 | 19 | papers_file_path = "../sitedata/papers.csv" 20 | title2id = dict() 21 | titles = set() 22 | graph = dict() 23 | 24 | with open(papers_file_path) as csv_file: 25 | line = 0 26 | csv_reader = csv.reader(csv_file, delimiter=',') 27 | for row in csv_reader: 28 | if line != 0: 29 | title, id = row[1], row[29] 30 | titles.add(title.strip()) 31 | title2id[title] = id 32 | graph[id] = { 33 | "in_edge": [], 34 | "out_edge": [] 35 | } 36 | line += 1 37 | 38 | num_citations = 0 39 | for i, title in enumerate(titles): 40 | print( 41 | f"Checking paper {i} / {len(titles)}, found {num_citations} citation relations") 42 | cur_id = title2id[title] 43 | papers_citing_this = get_names_of_papers_citing_this(title) 44 | for paper_citing_this in papers_citing_this: 45 | paper_citing_this = paper_citing_this.strip() 46 | if paper_citing_this in titles: 47 | id_of_paper_citing_this = title2id[paper_citing_this] 48 | graph[id_of_paper_citing_this]["out_edge"].append(cur_id) 49 | graph[cur_id]["in_edge"].append(id_of_paper_citing_this) 50 | num_citations += 1 51 | if (i+1) % 5 == 0: 52 | print("Sleep for 3 secs to pretend I'm not a robot...") 53 | time.sleep(3) 54 | print("I'm awake!") 55 | 56 | print(f"Found ${num_citations} citation relations.") 57 | 58 | our_file_path = "../sitedata/citation_graph.json" 59 | with open(our_file_path, "w") as outfile: 60 | json.dump(graph, outfile) 61 | -------------------------------------------------------------------------------- /scripts/README.md: -------------------------------------------------------------------------------- 1 | ## Usage (For Yiheng) 2 | Step 1: Download the google form as .xlsx file 3 | 4 | Step 2: Run scripts 5 | ``` 6 | python scripts/run_api.py 7 | python scripts/spreadsheet_check_error.py 8 | mv temp/checked.csv sitedata/papers.csv 9 | ``` 10 | 11 | Step 4: Update the following columns when copying to google sheets 12 | - Date 13 | - Citation 14 | - Authors 15 | - Bibtex Name 16 | - Abstract (Maybe no) 17 | - Citation Count 18 | 19 | Step 5: generate sitedata/paper.csv 20 | - `python database2miniconf.py` 21 | 22 | Step 6: make deploy 23 | 24 | Step 7: Update `references.bib` in Overleaf 25 | 26 | 27 | ## Original miniconf README.md 28 | This directory contains extensions to help support the mini-conf library. 29 | 30 | These include: 31 | 32 | * `embeddings.py` : For turning abstracts into embeddings. Creates an `embeddings.torch` file. 33 | 34 | ```bash 35 | python embeddings.py ../sitedata/papers.csv 36 | ``` 37 | 38 | * `reduce.py` : For creating two-dimensional representations of the embeddings. 39 | 40 | ```bash 41 | python reduce.py ../sitedata/papers.csv embeddings.torch > ../sitedata/papers_projection.json 42 | ``` 43 | 44 | * `parse_calendar.py` : to convert a local or remote ICS file to JSON. -- more on importing calendars see [README_Schedule.md](README_Schedule.md) 45 | 46 | ```bash 47 | python parse_calendar.py --in sample_cal.ics 48 | ``` 49 | 50 | * Image-Extraction: https://github.com/Mini-Conf/image-extraction for pulling images from PDF files. 51 | -------------------------------------------------------------------------------- /scripts/README_Schedule.md: -------------------------------------------------------------------------------- 1 | ## Adding a schedule to MiniConf 2 | 3 | 1) Create a Calendar in you favorite calendar application. 4 | Be sure that you can export calendars as `.ics` files. 5 | 2) [optional] use the `location` field for links that you want to link out from 6 | the calendar view (e.g. filtered poster sessions). 7 | 3) [optional] use hashtags in front of events to classify them. 8 | 4) run the `parse_calendar.py` script: 9 | 10 | ```bash 11 | python parse_calendar.py --in sample_cal.ics 12 | ``` 13 | 14 | ### Example 15 | 16 | An entry like this in iCal or Google Cal: 17 | 18 | ``` 19 | title: #talk Homer Simpson 20 | location: http://abc.de 21 | start: 7:00pm ET 22 | ``` 23 | 24 | will appear in the schedule as box in color `#cccccc` (see `sitedate/config.yml`): 25 | 26 | ``` 27 | 7:00 Homer Simpson 28 | ``` 29 | and will link to `http://abc.de` on click. 30 | 31 | ### Pro Tip 32 | 33 | If you plan to add some infos automatically, you can create a script that 34 | modifies `sitedate/main_calendar.json` 35 | -------------------------------------------------------------------------------- /scripts/SemanticScholarAuthKey.txt: -------------------------------------------------------------------------------- 1 | qZWKkOKyzP5g9fgjyMmBt1MN2NTC6aT61UklAiyw 2 | -------------------------------------------------------------------------------- /scripts/SemanticScholar_generate_citation_graph.py: -------------------------------------------------------------------------------- 1 | import requests 2 | import csv 3 | import json 4 | import time 5 | import os 6 | 7 | 8 | papers_file_path = "./sitedata/papers.csv" 9 | out_file_path = "./sitedata/citation_graph.json" 10 | token_path = "./sitedata/SemanticScholarAuthKey.txt" 11 | SemanticScholar_token = None 12 | smoke_test = False 13 | 14 | title2id = dict() 15 | titles = set() 16 | graph = dict() 17 | paper_ids_already_processed = set() 18 | 19 | 20 | with open(token_path, "r") as token_file: 21 | SemanticScholar_token = token_file.read().strip() 22 | print("SemanticScholar auth token loaded: ", SemanticScholar_token) 23 | 24 | def get_paper_id(title): 25 | url = 'https://api.semanticscholar.org/graph/v1/paper/search?' 26 | params = dict( 27 | query=title 28 | ) 29 | resp = requests.get(url=url, params=params, headers={'x-api-key': SemanticScholar_token}) 30 | data = resp.json() 31 | try: 32 | if data["total"] > 0: 33 | return data["data"][0]["paperId"] 34 | except: 35 | print(data) 36 | pass 37 | 38 | 39 | def get_titles_of_papers_citing_this(title): 40 | paperID = get_paper_id(title) 41 | titles_citing_this = [] 42 | 43 | if paperID is not None: 44 | url = f'https://api.semanticscholar.org/graph/v1/paper/{paperID}/citations?fields=title' 45 | resp = requests.get(url=url, headers={'x-api-key': SemanticScholar_token}) 46 | data = resp.json() 47 | try: 48 | for citingPaper in data["data"]: 49 | titles_citing_this.append( 50 | citingPaper["citingPaper"]["title"].strip()) 51 | except: 52 | print(data) 53 | pass 54 | 55 | return titles_citing_this 56 | 57 | if os.path.exists(out_file_path): 58 | with open(out_file_path, "r") as infile: 59 | currrent_citation_graph = json.load(infile) 60 | graph = currrent_citation_graph 61 | paper_ids_already_processed = set(currrent_citation_graph.keys()) 62 | else: 63 | print("No json file found. Starting from scratch.") 64 | 65 | with open(papers_file_path) as csv_file: 66 | line = 0 67 | csv_reader = csv.reader(csv_file, delimiter=',') 68 | for row in csv_reader: 69 | if line != 0: 70 | title, id = row[3], row[28] 71 | titles.add(title.strip()) 72 | title2id[title] = id 73 | graph[id] = { 74 | "in_edge": set(), 75 | "out_edge": set() 76 | } 77 | line += 1 78 | 79 | num_citations = 0 80 | processed_papers = 0 81 | 82 | for i, title in enumerate(titles): 83 | if smoke_test and i == 5: 84 | break 85 | # if (processed_papers+1) % 90 == 0: 86 | # print("Sleep for 0.5 min to change IP address...") 87 | # num_minutes = 0 88 | # while num_minutes < 1: 89 | # time.sleep(30) 90 | # num_minutes += 1 91 | # print(f"Slept {num_minutes} minute(s), zzz...") 92 | 93 | # print("I'm awake!") 94 | 95 | if i % 10 == 0: 96 | print(f"Checking paper {i} / {len(titles)}, found {num_citations} citation relations") 97 | 98 | cur_id = title2id[title] 99 | 100 | if cur_id not in paper_ids_already_processed: 101 | papers_citing_this = get_titles_of_papers_citing_this(title) 102 | for paper_citing_this in papers_citing_this: 103 | paper_citing_this = paper_citing_this.strip() 104 | if paper_citing_this in titles: 105 | id_of_paper_citing_this = title2id[paper_citing_this] 106 | if cur_id != id_of_paper_citing_this: 107 | graph[id_of_paper_citing_this]["out_edge"].add(cur_id) 108 | graph[cur_id]["in_edge"].add(id_of_paper_citing_this) 109 | num_citations += 1 110 | processed_papers += 1 111 | 112 | 113 | print(f"Found {num_citations} citation relations.") 114 | 115 | for key in graph: 116 | graph[key]["in_edge"] = list(graph[key]["in_edge"]) 117 | graph[key]["out_edge"] = list(graph[key]["out_edge"]) 118 | 119 | with open(out_file_path, "w") as outfile: 120 | json.dump(graph, outfile) 121 | -------------------------------------------------------------------------------- /scripts/check_cited.py: -------------------------------------------------------------------------------- 1 | """ 2 | A rough check whether paper is cited in paper. Consider the result a lower bound. 3 | """ 4 | 5 | 6 | from util import * 7 | from tqdm import tqdm 8 | from unidecode import unidecode 9 | import re 10 | 11 | 12 | with open("temp/ref.txt", 'r') as file: 13 | latex_references_section = file.read() 14 | 15 | latex_references_section = latex_references_section.lower() 16 | latex_references_section = re.sub(r'[^A-Za-z0-9 ]+', '', latex_references_section) 17 | latex_references_section = latex_references_section.replace(" ","") 18 | # s = re.sub(r'[^A-Za-z0-9 ]+', '', unidecode("PIFu: Pixel-Aligned Implicit Function for High-Resolution Clothed Human Digitization".lower())) in latex_references_section 19 | # print(s) 20 | # exit(12) 21 | 22 | input_fname = "sitedata/papers" 23 | input_ext = ".csv" 24 | output_fname_cited = "temp/cited" 25 | output_fname_not = "temp/not_cited" 26 | output_ext = ".xlsx" 27 | 28 | # Load spreadsheet 29 | rows = read_spreadsheet(input_fname, input_ext) 30 | for r in rows: 31 | r[7] = r[16] 32 | 33 | rows_cited, rows_not = [rows[0][3:]], [rows[0][3:]] 34 | for r in tqdm(rows[1:]): 35 | if re.sub(r'[^A-Za-z0-9 ]+', '', unidecode(r[3]).lower()).strip(" .").replace(" ","") in latex_references_section: 36 | # if unidecode(r[3]).lower() in latex_references_section: 37 | rows_cited.append(r[3:]) 38 | else: 39 | rows_not.append(r[3:]) 40 | 41 | write_spreadsheet(rows_cited, output_fname_cited, output_ext) 42 | write_spreadsheet(rows_not, output_fname_not, output_ext) 43 | 44 | 45 | print("not_cited/cited/total: {}/{}/{}".format(len(rows_not)-1, len(rows_cited)-1, len(rows)-1)) 46 | -------------------------------------------------------------------------------- /scripts/check_latex_spelling.py: -------------------------------------------------------------------------------- 1 | import argparse, os 2 | # incorrect -> correct 3 | corrections = { 4 | "pointcloud" : "point cloud", 5 | "Pointcloud" : "Point cloud", 6 | "voxelgrid" : "voxel grid", 7 | "Voxelgrid" : "Voxel grid", 8 | "levelset" : "level set", 9 | "Levelset" : "Level set", 10 | "ray-trac" : "raytrac", # ray-trac(ed|ing|er) 11 | "Ray-trac" : "Raytrac", 12 | "hyper-network" : "hypernetwork", 13 | "Hyper-network" : "Hypernetwork", 14 | "data-set" : "dataset", 15 | "Data-set" : "Dataset", 16 | "data set" : "dataset", 17 | "Data set" : "Dataset", 18 | "edit-able" : "editable", 19 | "Edit-able" : "Editable", 20 | "tri-linear" : "trilinear", 21 | "Tri-linear" : "Trilinear", 22 | "hyper-parameter" : "hyperparameter", 23 | "Hyper-parameter" : "Hyperparameter", 24 | "parametriz" : "parameteriz", # parameteriz(ing|ed) 25 | "Parametriz" : "Parameteriz", 26 | "underparameteriz" : "under-parameteriz", 27 | "Underparameteriz" : "Under-parameteriz", 28 | "overparameteriz" : "over-parameteriz", 29 | "Overparameteriz" : "Over-parameteriz", 30 | "auto-encod" : "autoencod", # auto-encod(er|ing|ed) 31 | "Auto-encod" : "Autoencod", 32 | "finetun" : "fine-tun", # fine-tun(ing|es) 33 | "Finetun" : "Fine-tun", 34 | "pytorch" : "PyTorch", 35 | "Pytorch" : "PyTorch", 36 | "tensorflow" : "TensorFlow", 37 | "Tensorflow" : "TensorFlow", 38 | "feedforward" : "feed-forward", # Based on 1994 paper IEEE 39 | "Feedforward" : "Feed-forward", 40 | "up-sampling": "upsampling", 41 | "backpropagat": "back-propagat", # 1986 paper 42 | "Backpropagat": "Back-propagat", 43 | "realtime": "real-time", # verified 44 | } 45 | 46 | 47 | warning = ['--'] 48 | 49 | excluded_filenames = [ 50 | "macros.tex", 51 | "archived_tex", 52 | "fixed_tex", 53 | ] 54 | 55 | def fix(text): 56 | for incorrect, correct in corrections.items(): 57 | text = text.replace(incorrect, correct) 58 | return text 59 | 60 | def fix_one_file(input_fname, output): 61 | print("Fixing one file: {} --> {}".format(input_fname, output)) 62 | f = open(input_fname, mode='r') 63 | text = f.read() 64 | f.close() 65 | text = fix(text) 66 | if output: 67 | o = open(output, mode='w+', encoding="utf-8") 68 | else: 69 | o = open(input_fname, mode='w+', encoding="utf-8") 70 | o.write() 71 | o.close() 72 | 73 | 74 | def fix_by_item(text, user_approval=True): 75 | no_fix = True 76 | for incorrect, correct in corrections.items(): 77 | ind = 0 78 | find_ind = text[ind:].find(incorrect) 79 | lo = find_ind + ind 80 | hi = lo + len(incorrect) 81 | while find_ind >= 0: 82 | print(text[lo-30:lo] + "[" + text[lo:hi] + "]" + text[hi:hi+30:]) 83 | print(text[lo-30:lo] + "[" + correct + "]" + text[hi:hi+30:]) 84 | 85 | action = input('Enter your approval (enter/n/replacement):') 86 | if action == "": 87 | replacement = correct 88 | no_fix = False 89 | elif action == "n": 90 | replacement = incorrect 91 | else: 92 | replacement = action 93 | no_fix = False 94 | 95 | # Replace 96 | text = text[:lo] + replacement + text[hi:] 97 | hi = lo + len(replacement) 98 | # Find next 99 | ind = hi 100 | find_ind = text[ind:].find(incorrect) 101 | lo = find_ind + ind 102 | hi = lo + len(incorrect) 103 | return text, no_fix 104 | 105 | 106 | 107 | if __name__ == "__main__": 108 | """ 109 | Usage: 110 | python fix.py --output_dir fixed_tex --all --by_item --approval 111 | """ 112 | parser = argparse.ArgumentParser() 113 | parser.add_argument('--input', type=str) 114 | parser.add_argument('--output', type=str) 115 | parser.add_argument('--output_dir', type=str) 116 | parser.add_argument('--all', action="store_true", default=False) 117 | parser.add_argument('--by_item', action="store_true", default=False) 118 | parser.add_argument('--approval', action="store_true", default=False) 119 | args = parser.parse_args() 120 | 121 | if args.output_dir and (not os.path.exists(args.output_dir)): 122 | os.mkdir(args.output_dir) 123 | 124 | if args.all: 125 | listOfFiles = list() 126 | for (dirpath, dirnames, filenames) in os.walk("."): 127 | listOfFiles += [os.path.join(dirpath, file) for file in filenames] 128 | to_check = list() 129 | for input_fname in listOfFiles: 130 | add = True 131 | if (".tex" == input_fname[-4:]): 132 | for exclude in excluded_filenames: 133 | if exclude in input_fname: 134 | add = False 135 | if add: to_check.append(input_fname) 136 | print("Files to fix ({}): {}".format(len(to_check), "\n".join(to_check))) 137 | 138 | for input_fname in to_check: 139 | if args.output_dir: 140 | output = os.path.join(args.output_dir, os.path.basename(input_fname)) 141 | else: 142 | output = input_fname 143 | 144 | if args.by_item: 145 | print("===================================") 146 | print("Fixing file by item: ", input_fname) 147 | with open(input_fname, mode='r') as f: 148 | text = f.read() 149 | text, no_fix = fix_by_item(text, args.approval) 150 | if not no_fix: 151 | with open(output, mode='w+', encoding="utf-8") as f: 152 | f.write(text) 153 | else: 154 | fix_one_file(input_fname, output) 155 | else: 156 | if output_dir: 157 | output = os.path.join(output_dir, os.path.basename(input_fname)) 158 | fix_one_file(input_fname, output) 159 | -------------------------------------------------------------------------------- /scripts/count_authors.py: -------------------------------------------------------------------------------- 1 | import csv 2 | from util import csv_head_key 3 | 4 | csv_name = "Review Paper Import Portal Responses - Form Responses 1.csv" 5 | csv_name = "sitedata/papers.csv" 6 | 7 | authors = {} 8 | with open(csv_name, newline='', encoding="utf-8") as csvfile: 9 | reader = csv.reader(csvfile, delimiter=',', quotechar='"') 10 | cnt = 0 11 | 12 | for row in reader: 13 | for author in row[csv_head_key["Authors"]].split(", "): 14 | if author in authors: 15 | authors[author] += 1 16 | else: 17 | authors[author] = 1 18 | 19 | leaderboard = [] 20 | for k, v in sorted(authors.items(), key=lambda item: item[1], reverse=True) : 21 | leaderboard.append("{}, {}\n".format(k, v)) 22 | 23 | with open("temp/leaderboard.txt", "w+", encoding="utf-8") as f: 24 | f.writelines(leaderboard) 25 | -------------------------------------------------------------------------------- /scripts/eject_redundant_bibtex_fields.py: -------------------------------------------------------------------------------- 1 | import csv 2 | import util 3 | 4 | """ 5 | Eject unnecessary bibtex fileds from papers.csv 6 | """ 7 | 8 | papers_file_path = "../sitedata/papers.csv" 9 | out_file_path = "../sitedata/papers.csv" 10 | exclude_keys = [ 11 | "NOTE", 12 | "ID", 13 | "ENTRYTYPE", 14 | "EPRINT", 15 | "ARCHIVEPREFIX", 16 | "PRIMARYCLASS", 17 | "FILE", 18 | "ABSTRACT", 19 | # "URL", 20 | ] 21 | 22 | out_rows = [] 23 | 24 | with open(papers_file_path) as csv_file: 25 | line = 0 26 | csv_reader = csv.reader(csv_file, delimiter=',') 27 | csv_header = None 28 | for row in csv_reader: 29 | if line == 0: 30 | csv_header = row[:] 31 | out_rows.append(csv_header) 32 | else: 33 | cur_row = row[:] 34 | if len(row[8]) > 10: 35 | article_type, bibtex_key, dict = util.dict_from_string(row[8]) 36 | for k in exclude_keys: 37 | if k.lower() in dict: 38 | dict.pop(k.lower()) 39 | bibtex_dict = {bibtex_key: dict} 40 | bibtex_str = util.format_bibtex_str( 41 | bibtex_dict, article_type=article_type) 42 | cur_row[8] = bibtex_str 43 | out_rows.append(cur_row) 44 | line += 1 45 | 46 | with open(out_file_path, 'w') as outfile: 47 | csvwriter = csv.writer(outfile) 48 | csvwriter.writerows(out_rows) 49 | -------------------------------------------------------------------------------- /scripts/embeddings.py: -------------------------------------------------------------------------------- 1 | import argparse 2 | import csv 3 | 4 | import torch 5 | from sentence_transformers import SentenceTransformer 6 | 7 | 8 | def parse_arguments(): 9 | parser = argparse.ArgumentParser(description="MiniConf Portal Command Line") 10 | 11 | parser.add_argument("papers", default=False, help="papers file to parse") 12 | return parser.parse_args() 13 | 14 | 15 | if __name__ == "__main__": 16 | args = parse_arguments() 17 | 18 | model = SentenceTransformer("allenai-specter") 19 | 20 | with open(args.papers, "r") as f: 21 | papers = [row["title"] + "[SEP]" + row["abstract"] for row in csv.DictReader(f)] 22 | 23 | embeddings = model.encode(papers, convert_to_tensor=True) 24 | torch.save(embeddings, "embeddings.torch") 25 | -------------------------------------------------------------------------------- /scripts/export_latex_table.py: -------------------------------------------------------------------------------- 1 | """ 2 | Experimental script that converts csv into a latex formatted table. 3 | """ 4 | 5 | 6 | from util import * 7 | 8 | keywords = [ 9 | 'Speed (Training)', 10 | 'Speed (Rendering)', 11 | 'Sparse Reconstruction', 12 | 'Dynamic', 13 | 'Human (Body)', 14 | 'Human (Head)', 15 | 'Robotics', 16 | 'Image', 17 | 'Camera Parameter Estimation', 18 | 'Material/Lighting Estimation', 19 | 'Editable', 20 | 'Compression', 21 | 'Alternative Imaging', 22 | 'Science & Engineering', 23 | 'Fundamentals', 24 | 'Generative Models', 25 | 'Generalization', 26 | 'Global Conditioning', 27 | 'Local Conditioning', 28 | 'Image-based Rendering', 29 | 'Hypernetwork/Meta-learning', 30 | 'Hybrid Geometry Parameterization', 31 | 'Voxel Grid', 32 | 'Object-Centric', 33 | 'Sampling', 34 | 'Supervision by Gradient (PDE)', 35 | 'Coarse-to-Fine', 36 | 'Coordinate Re-mapping' 37 | ] 38 | 39 | input_fname = "sitedata/papers" 40 | input_ext = ".csv" 41 | output_fname = "temp/appendix_all_works.tex" 42 | rotate_90 = False 43 | replace_keywords = True 44 | 45 | # Load spreadsheet 46 | rows = read_spreadsheet(input_fname, input_ext) 47 | entries = 2 + len(keywords) 48 | 49 | # List of list. First list index corresponds to csv row 50 | payload = [] 51 | for r in rows[1:50]: 52 | title = [r[4]] if len(r[4])>1 else [r[26].split(", ")[0].split(" ")[-1] + " et al."] 53 | citation = [f"\cite{{{r[27]}}}"] 54 | checkmark = [] 55 | for k in keywords: 56 | if k.lower() in r[16].lower(): 57 | checkmark.append("\checkmark") 58 | else: 59 | checkmark.append(" ") 60 | line = title + citation + checkmark 61 | line = " & ".join(line) 62 | assert line.count("&") == (entries - 1) 63 | payload.append(line) 64 | print("cols, rows", len(keywords)+2, len(payload)+1) 65 | payload = "\\\\\n".join(payload) + "\\\\\n" 66 | 67 | # l_s = "l l " + " ".join(["l" for _ in range(len(keywords))]) 68 | l_s = "|p{2.2cm}|p{1.7cm}|" + "|".join(["p{0.04cm}" for _ in range(len(keywords))]) + "|" 69 | # l_s = "|" + "|".join(["p{1cm}" for _ in range(len(keywords))]) + "|" 70 | # l_s = "c c " + " ".join(["c" for _ in range(len(keywords))]) 71 | 72 | caption = "Tabulated keywords for all neural fields papers. " 73 | if replace_keywords: 74 | caption += "Keyword lookup: " 75 | caption += ", ".join(["{}: {}".format(i, keywords[i].replace("&", "\\&")) for i in range(len(keywords))]) 76 | caption += "." 77 | 78 | 79 | first_line = " & ".join([f"\\multicolumn{{1}}{{|c|}}{{\\textbf{{Title}}}}", f"\\multicolumn{{1}}{{|c|}}{{\\textbf{{Citation}}}}"]+[f"\\multicolumn{{1}}{{|c|}}{{{k}}}" for k in range(len(keywords))]) 80 | # \\label{{tab:appendix_all_works}} 81 | head = f""" 82 | \\newpage 83 | \\onecolumn 84 | \\begin{{longtable}}[c]{{{l_s}}} 85 | \\caption{{{caption}}}\\\\ 86 | 87 | \\hline 88 | {first_line} 89 | \\hline 90 | \\endfirsthead 91 | 92 | \\multicolumn{{{len(keywords)+2}}}{{c}}% 93 | {{{{{caption}}}}} \\\\ 94 | \\hline 95 | {first_line} 96 | \\endhead 97 | 98 | \\hline \\multicolumn{{{len(keywords)+2}}}{{|r|}}{{Continued on next page}} \\\\ \\hline 99 | \\endfoot 100 | """#.format(l_s) 101 | # \\toprule 102 | # \\centering 103 | # \\begin{{adjustbox}}{{max width=\\textwidth}} 104 | # \\begin{{tabular}}{{{l_s}}} 105 | # if replace_keywords: 106 | # titles = ["Title", "Citation"] + [str(_) for _ in range(len(keywords))] 107 | # else: 108 | # titles = ["Title", "Citation"] + keywords 109 | # 110 | # titles = " & ".join(titles) + "\\\\\n" 111 | # assert titles.count("&") == (entries - 1) 112 | 113 | # \\end{{tabular}} 114 | # \\end{{adjustbox}} 115 | # \\bottomrule 116 | tail = f""" 117 | \\vspace{{-0.25cm}} 118 | \\end{{longtable}} 119 | """ 120 | 121 | # header 122 | # final_str = head + header + payload + tail 123 | final_str = head + payload + tail 124 | print(final_str) 125 | if rotate_90: 126 | final_str = "\\begin{{adjustbox}}{{angle=90}}\n" + final_str + "\n\\end{{adjustbox}}" 127 | 128 | with open(output_fname, "w+", encoding="utf-8") as f: 129 | f.write(final_str) 130 | -------------------------------------------------------------------------------- /scripts/format.py: -------------------------------------------------------------------------------- 1 | import glob 2 | import os 3 | import sys 4 | 5 | for f in glob.glob(sys.argv[1]): 6 | outfile = f + ".html" 7 | out = open(outfile, "w") 8 | for l in open(f): 9 | if l.strip().startswith("{{") or l.strip().startswith("{%"): 10 | # pylint: disable=consider-using-enumerate 11 | for j in range(len(l)): 12 | if l[j] != " ": 13 | break 14 | 15 | print(" " * j + "", file=out) 16 | 17 | print(l, end="", file=out) 18 | out.close() 19 | os.system("npx prettier %s --write" % outfile) 20 | 21 | orig = open(f, "w") 22 | for l in open(outfile): 23 | # pylint: disable=no-else-continue 24 | if l.strip().startswith(""): 25 | continue 26 | else: 27 | print(l, end="", file=orig) 28 | 29 | orig.close() 30 | os.system("rm %s" % outfile) 31 | -------------------------------------------------------------------------------- /scripts/generate_bibtex_json.py: -------------------------------------------------------------------------------- 1 | import csv 2 | import util 3 | import json 4 | 5 | papers_file_path = "../sitedata/papers.csv" 6 | out_file_path = "../sitedata/paperID2bibtex.json" 7 | exclude_keys = [ 8 | "NOTE", 9 | "ID", 10 | "ENTRYTYPE", 11 | "EPRINT", 12 | "ARCHIVEPREFIX", 13 | "PRIMARYCLASS", 14 | "FILE", 15 | "ABSTRACT", 16 | # "URL", 17 | ] 18 | id2bibtex = dict() 19 | 20 | with open(papers_file_path) as csv_file: 21 | line = 0 22 | csv_reader = csv.reader(csv_file, delimiter=',') 23 | for row in csv_reader: 24 | if line != 0 and len(row[11]) > 10: 25 | article_type, bibtex_key, dict = util.dict_from_string(row[11]) 26 | for k in exclude_keys: 27 | if k.lower() in dict: 28 | dict.pop(k.lower()) 29 | bibtex_dict = {bibtex_key: dict} 30 | bibtex_str = util.format_bibtex_str(bibtex_dict, article_type=article_type) 31 | 32 | paperID = row[29] 33 | id2bibtex[paperID] = bibtex_str 34 | line += 1 35 | 36 | with open(out_file_path, "w", encoding="utf-8") as outfile: 37 | json.dump(id2bibtex, outfile, indent=2, separators=(',', ':')) 38 | -------------------------------------------------------------------------------- /scripts/parse_calendar.py: -------------------------------------------------------------------------------- 1 | import argparse 2 | import json 3 | 4 | import requests 5 | from ics.icalendar import Calendar 6 | 7 | # import ics 8 | 9 | 10 | def parse_arguments(): 11 | parser = argparse.ArgumentParser(description="MiniConf Calendar Command Line") 12 | 13 | parser.add_argument( 14 | "--ics", 15 | default="sample_cal.ics", 16 | type=str, 17 | help="ICS file to parse (local or via http)", 18 | ) 19 | 20 | parser.add_argument( 21 | "--out", default="../sitedata/main_calendar.json", help="ICS file to parse" 22 | ) 23 | 24 | return parser.parse_args() 25 | 26 | 27 | # pylint: disable=redefined-outer-name 28 | def convert(args): 29 | file_ics: str = args.ics 30 | if not file_ics.startswith("http"): 31 | with open(file_ics, "r") as f: 32 | c = Calendar(f.read()) 33 | else: 34 | c = Calendar(requests.get(file_ics).text) 35 | 36 | collector = [] 37 | for e in c.events: 38 | title = e.name 39 | tpe = "---" 40 | 41 | # check for starting hashtag 42 | parts = title.split(" ") 43 | if parts[0].startswith("#"): 44 | tpe = parts[0][1:] 45 | title = " ".join(parts[1:]) 46 | 47 | # // const 48 | # toreturn = { 49 | # // title, 50 | # // "location": "", 51 | # // id: '' + id, 52 | # // calendarId: title.startsWith("Poster") ? '1': '2', // + (id % 2 + 1), 53 | # // category: 'time', 54 | # // dueDateClass: '' 55 | # // 56 | # //}; 57 | 58 | json_event = { 59 | "title": title, 60 | "start": e.begin.for_json(), 61 | "end": e.end.for_json(), 62 | "location": e.location, 63 | "link": e.location, 64 | "category": "time", 65 | "calendarId": tpe, 66 | } 67 | collector.append(json_event) 68 | print(json_event) 69 | 70 | with (open(args.out, "w")) as f: 71 | json.dump(collector, f) 72 | 73 | # print(c.events) 74 | 75 | pass 76 | 77 | 78 | if __name__ == "__main__": 79 | args = parse_arguments() 80 | convert(args) 81 | -------------------------------------------------------------------------------- /scripts/quickfix.py: -------------------------------------------------------------------------------- 1 | import csv, xlsxwriter, openpyxl 2 | import feedparser, urllib, urllib.request 3 | from arxiv2bib import arxiv2bib 4 | from util import * 5 | import unidecode 6 | from tqdm import tqdm 7 | import copy 8 | 9 | # @profile 10 | input_fname = "sitedata/papers" 11 | input_ext = ".csv" 12 | output_fname = "sitedata/papers_" 13 | output_ext = ".csv" 14 | 15 | # Load spreadsheet 16 | rows = read_spreadsheet(input_fname, input_ext) 17 | 18 | for r in tqdm(range(1, len(rows))): 19 | row = rows[r] 20 | 21 | """Replace words""" 22 | # prev = copy.deepcopy(row[csv_head_key['Keywords']]) 23 | # row[csv_head_key['Keywords']] = row[csv_head_key['Keywords']] \ 24 | # .replace('Dynamic', 'Dynamic/Temporal') \ 25 | # .replace('Image', '2D Image Neural Fields') \ 26 | # .replace('Beyond Visual Computing, ', '') \ 27 | # .replace(', Beyond Visual Computing', '') \ 28 | # .replace('Coordinate Re-mapping, ', '') \ 29 | # .replace(', Coordinate Re-mapping', '') \ 30 | # .replace('Speed (Training)', 'Speed & Computational Efficiency') \ 31 | # .replace('Speed (Rendering)', 'Speed & Computational Efficiency') \ 32 | # .replace('Speed & Computational Efficiency, Speed & Computational Efficiency', 'Speed & Computational Efficiency') \ 33 | # .replace('2D Image Neural Fields-based Rendering', 'Image-Based Rendering') 34 | # 35 | # if (row[17] not in ["", "None"]) and ((not ('SIREN' in row[17])) and (not ('NeRF' in row[17]))): 36 | # print(row[17]) 37 | # row[csv_head_key['Keywords']] += ', Positional Encoding' 38 | # 39 | # if row[csv_head_key['Keywords']] != prev: 40 | # print(r) 41 | # print(prev) 42 | # print(row[csv_head_key['Keywords']]) 43 | 44 | """Reformat bibtex""" 45 | if len(row[csv_head_key['Bibtex']]) > 10: 46 | article_type, bibtex_key, dict = dict_from_string(row[csv_head_key['Bibtex']]) 47 | bibtex_dict = {bibtex_key : dict} 48 | bibtex_str = format_bibtex_str(bibtex_dict, cap_keys="lower", space=True, indent=" ", bracket="{}", 49 | article_type=article_type, last_name_first=False) 50 | row[csv_head_key['Bibtex']] = bibtex_str 51 | 52 | write_spreadsheet(rows, output_fname, output_ext) 53 | -------------------------------------------------------------------------------- /scripts/reduce.py: -------------------------------------------------------------------------------- 1 | import argparse 2 | import csv 3 | import json 4 | 5 | import sklearn.manifold 6 | import torch 7 | 8 | 9 | def parse_arguments(): 10 | parser = argparse.ArgumentParser(description="MiniConf Portal Command Line") 11 | parser.add_argument("papers", default=False, help="paper file") 12 | 13 | parser.add_argument("embeddings", default=False, help="embeddings file to shrink") 14 | 15 | return parser.parse_args() 16 | 17 | 18 | if __name__ == "__main__": 19 | args = parse_arguments() 20 | emb = torch.load(args.embeddings) 21 | out = sklearn.manifold.TSNE(n_components=2).fit_transform(emb.cpu().numpy()) 22 | d = [] 23 | with open(args.papers, "r") as f: 24 | abstracts = list(csv.DictReader(f)) 25 | for i, row in enumerate(abstracts): 26 | d.append({"id": row["UID"], "pos": out[i].tolist()}) 27 | print(json.dumps(d)) 28 | -------------------------------------------------------------------------------- /scripts/spreadsheet_check_error.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | import csv 3 | import collections 4 | import unicodedata 5 | from unidecode import unidecode 6 | import xlsxwriter 7 | import util 8 | from util import csv_head_key, KNOWN_FORMATS 9 | from tqdm import tqdm 10 | 11 | names = { 12 | "Michael Zollhöfer": "Michael Zollhöfer", 13 | "Aljaž Božič": "Aljaž Božič", 14 | "božiÄÂ_x008d_": "božič", 15 | "Matthias Nießner": "Matthias Nießner", 16 | "MiloÅ¡ HaÅ¡an": "Miloš Hašan", 17 | "Häni": "Häni", 18 | "häni": "häni", 19 | "Adam GoliÅ„ski": "Adam Goliński", 20 | "Michaël Gharbi": "Michaël Gharbi", 21 | "Dejan Azinović": "Dejan Azinović", 22 | "azinović": "azinović", 23 | "Johannes Ballé": "Johannes Ballé", 24 | "Pablo Gómez": "Pablo Gómez", 25 | "Thomas Müller": "Thomas Müller", 26 | "müller" 27 | "Novák": "Novák", 28 | "Mˆach´e": "Mâché", 29 | "−−": "−−", 30 | "−−": "−−", 31 | "müller": "müller", 32 | "Soňa Mokrá": "Soňa Mokrá" 33 | } 34 | non_ascii = ["Arandjelović", "PapierMâché", "Höfer", "Alenyà", "Cortés", "TöRF", "TöRF:", "Fernández", "László", "Goldlücke", 'Lähner', 'Trzciński', 'Vinícius', 'Hélio'] 35 | for k in names: 36 | non_ascii += names[k].split(" ") 37 | 38 | exclude_keys = ["NOTE", "ID", "ENTRYTYPE", "EPRINT", "ARCHIVEPREFIX", "PRIMARYCLASS", "FILE", "ABSTRACT", "VENUE"] 39 | replace_keys = {"PUB_YEAR": "YEAR"} 40 | """ 41 | Script begins 42 | """ 43 | # input_fname = "Review Paper Import Portal Responses" 44 | input_fname = "temp/output_responses" 45 | input_ext = ".csv" 46 | output_fname = "temp/checked" 47 | output_ext = ".csv" 48 | 49 | rows = util.read_spreadsheet(input_fname, input_ext) 50 | 51 | UIDs, pdf_links_all, wrong_pdf, missing_author, missing_nickname, missing_bibtex, missing_bibtex_name, missing_abstract, missing_UID = [], [], [], [], [], [], [], [], [] 52 | incorrect_spelling = {} 53 | 54 | with open("sitedata/papers_metadata.txt", "r") as f: 55 | num_rows_old = int(f.read()) 56 | # Iterate on each row 57 | start_row = 0 # This is for skipping already processed entries 58 | end_row = len(rows) - num_rows_old 59 | cnt = 0 60 | prev_pdf = "" 61 | for j in tqdm(range(len(rows))): 62 | row = rows[j] 63 | if cnt == 0: 64 | cnt += 1 65 | continue 66 | # Check for duplicate pdf link 67 | if prev_pdf == row[csv_head_key['PDF']]: 68 | # print("Wrong pdf link (same as row above) at row {}".format(cnt)) 69 | wrong_pdf.append(cnt) 70 | 71 | prev_pdf = row[csv_head_key['PDF']] 72 | 73 | # Check for missing authors 74 | if row[csv_head_key['Authors']] == "": 75 | missing_author.append(cnt) 76 | 77 | # Check for missing nickname 78 | if (0 < row[csv_head_key['Title']].find(":") < 18) and (row[csv_head_key['Nickname']] == ""): 79 | missing_nickname.append(cnt) 80 | 81 | # Check for missing bibtex citation 82 | bibtex_ = row[csv_head_key['Bibtex']] 83 | if len(bibtex_) < 10: 84 | missing_bibtex.append(cnt) 85 | elif start_row <= j <= end_row: 86 | comm = bibtex_.find(",") 87 | bibtex_ = bibtex_[:comm].replace(" ", "") + bibtex_[comm:] 88 | article_type, bibtex_key, dict = util.dict_from_string(bibtex_) 89 | bibtex_dict = {bibtex_key : dict} 90 | row[csv_head_key['Bibtex']] = util.format_bibtex_str( 91 | bibtex_dict, exclude_keys=exclude_keys, replace_keys=replace_keys, cap_keys="lower", space=True, 92 | indent=" ", bracket="{}", article_type=article_type, last_name_first=False) 93 | 94 | pdf_links_all.append(row[csv_head_key['PDF']]) 95 | 96 | # Correct Venue Name 97 | for k in KNOWN_FORMATS: 98 | if row[csv_head_key['Venue']].upper() == k.upper(): 99 | row[csv_head_key['Venue']] = k 100 | 101 | # Correct miss-spelling from unicode 102 | if start_row <= j <= end_row: 103 | for k in names: 104 | wrong_w = k.split(" ") 105 | correct_w = names[k].split(" ") 106 | assert len(wrong_w) == len(correct_w) 107 | for i in range(len(wrong_w)): 108 | # Title 109 | row[csv_head_key['Title']] = row[csv_head_key['Title']].replace(wrong_w[i], correct_w[i]) 110 | row[csv_head_key['Title']] = row[csv_head_key['Title']].replace(wrong_w[i][0].lower()+wrong_w[i][1:], correct_w[i][0].lower()+correct_w[i][1:]) 111 | # Nickname 112 | row[csv_head_key['Nickname']] = row[csv_head_key['Nickname']].replace(wrong_w[i], correct_w[i]) 113 | row[csv_head_key['Nickname']] = row[csv_head_key['Nickname']].replace(wrong_w[i][0].lower()+wrong_w[i][1:], correct_w[i][0].lower()+correct_w[i][1:]) 114 | # Bibtex 115 | row[csv_head_key['Bibtex']] = row[csv_head_key['Bibtex']].replace(wrong_w[i], correct_w[i]) 116 | row[csv_head_key['Bibtex']] = row[csv_head_key['Bibtex']].replace(wrong_w[i][0].lower()+wrong_w[i][1:], correct_w[i][0].lower()+correct_w[i][1:]) 117 | row[csv_head_key['Bibtex']] = unidecode(row[csv_head_key['Bibtex']]) 118 | # Authors 119 | row[csv_head_key['Authors']] = row[csv_head_key['Authors']].replace(wrong_w[i], correct_w[i]) 120 | row[csv_head_key['Authors']] = row[csv_head_key['Authors']].replace(wrong_w[i][0].lower()+wrong_w[i][1:], correct_w[i][0].lower()+correct_w[i][1:]) 121 | # Bibtex handle 122 | row[csv_head_key['Bibtex Name']] = row[csv_head_key['Bibtex Name']].replace(wrong_w[i], correct_w[i]) 123 | row[csv_head_key['Bibtex Name']] = row[csv_head_key['Bibtex Name']].replace(wrong_w[i][0].lower()+wrong_w[i][1:], correct_w[i][0].lower()+correct_w[i][1:]) 124 | row[csv_head_key['Bibtex Name']] = unidecode(row[csv_head_key['Bibtex Name']]) 125 | 126 | # # Posisble miss-spelling 127 | # if unicodedata.normalize('NFD', row[csv_head_key['Authors']]) != row[csv_head_key['Authors']]: 128 | # print(cnt, row[csv_head_key['Authors']]) 129 | 130 | # Chcek miss-spelling 131 | for word in row: 132 | if (type(word) is str) and (unicodedata.normalize('NFD', word) != word): 133 | for w in word.split(" "): 134 | w = w.replace("-", "").replace(",","") 135 | if (unicodedata.normalize('NFD', w) != w): 136 | if w not in (non_ascii): 137 | incorrect_spelling[cnt] = w 138 | break 139 | 140 | # Bibtex name 141 | if len(row[csv_head_key['Bibtex Name']]) < 5: 142 | missing_bibtex_name.append(cnt) 143 | 144 | # UID 145 | if (row[csv_head_key['UID']] is None) \ 146 | or (row[csv_head_key['UID']] == "") \ 147 | or len("%08d" %int(row[csv_head_key['UID']])) < 2: 148 | missing_UID.append(cnt) 149 | else: 150 | UIDs.append(row[csv_head_key['UID']]) 151 | 152 | # Abstract 153 | if len(row[csv_head_key['Abstract']]) < 20: 154 | missing_abstract.append(cnt) 155 | 156 | rows[j] = row 157 | cnt += 1 158 | 159 | util.write_spreadsheet(rows, output_fname, output_ext) 160 | with open("sitedata/papers_metadata.txt", "w+") as f: 161 | f.write(str(len(rows)-1)) 162 | 163 | 164 | print("# Check for duplicate entries") 165 | print([item for item, count in collections.Counter(pdf_links_all).items() if count > 1]) 166 | print("# Check for duplicate UID") 167 | print([item for item, count in collections.Counter(UIDs).items() if count > 1]) 168 | print("# Check for duplicate pdf link") 169 | print(wrong_pdf) 170 | print("# Check for missing authors") 171 | print(missing_author) 172 | print("# Check for missing nickname") 173 | print(missing_nickname) 174 | print("# Check for missing bibtex") 175 | print(missing_bibtex) 176 | print("# Check for miss-spelling") 177 | print(incorrect_spelling) 178 | print("# Check for missing bibtex name") 179 | print(missing_bibtex_name) 180 | print("# Check for missing abstract") 181 | print(missing_abstract) 182 | print("# Check for missing UID") 183 | print(missing_UID) 184 | -------------------------------------------------------------------------------- /sitedata/SemanticScholarAuthKey.txt: -------------------------------------------------------------------------------- 1 | qZWKkOKyzP5g9fgjyMmBt1MN2NTC6aT61UklAiyw 2 | -------------------------------------------------------------------------------- /sitedata/config.yml: -------------------------------------------------------------------------------- 1 | repo_name: neural-fields-review 2 | name: Neural Fields in Visual Computing 3 | tagline: Neural Fields in Visual Computing 4 | date: Sept 2021 5 | favicon: favicon.ico 6 | logo: 7 | main: static/images/main_logo.png 8 | long: static/images/long_logo.png 9 | page_title: 10 | prefix: "Neural Fields" 11 | separator: ": " 12 | background_image: static/images/main.jpg 13 | organization: Brown Visual Computing Group 14 | 15 | add_paper_form_link: https://forms.gle/JKMicvyaaekoes3w5 16 | update_paper_form_link: https://forms.gle/LwetzG6umEyZaRAS6 17 | -------------------------------------------------------------------------------- /sitedata/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brownvc/neural-fields-review/5f30abcee9451cea8193339a78e1dbdaa0687b2e/sitedata/favicon.ico -------------------------------------------------------------------------------- /sitedata/papers_metadata.txt: -------------------------------------------------------------------------------- 1 | 411 -------------------------------------------------------------------------------- /sitedata/thumbnails/no_thumbnail_available.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brownvc/neural-fields-review/5f30abcee9451cea8193339a78e1dbdaa0687b2e/sitedata/thumbnails/no_thumbnail_available.png -------------------------------------------------------------------------------- /static/css/4UaZrEtFpBI4f1ZSIK9d4LjJ4lM3OwRmPg.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brownvc/neural-fields-review/5f30abcee9451cea8193339a78e1dbdaa0687b2e/static/css/4UaZrEtFpBI4f1ZSIK9d4LjJ4lM3OwRmPg.ttf -------------------------------------------------------------------------------- /static/css/Cuprum.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: "Cuprum"; 3 | font-style: normal; 4 | font-weight: 400; 5 | src: local("Cuprum Regular"), local("Cuprum-Regular"), 6 | url(dg4k_pLmvrkcOkBNJutH.ttf) format("truetype"); 7 | } 8 | -------------------------------------------------------------------------------- /static/css/Exo.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: "Exo"; 3 | font-style: normal; 4 | font-weight: 400; 5 | src: url(4UaZrEtFpBI4f1ZSIK9d4LjJ4lM3OwRmPg.ttf) format("truetype"); 6 | } 7 | -------------------------------------------------------------------------------- /static/css/Lato.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: "Lato"; 3 | font-style: normal; 4 | font-weight: 400; 5 | font-display: swap; 6 | src: local("Lato Regular"), local("Lato-Regular"), 7 | url(S6uyw4BMUTPHjx4wWw.ttf) format("truetype"); 8 | } 9 | @font-face { 10 | font-family: "Lato"; 11 | font-style: normal; 12 | font-weight: 900; 13 | font-display: swap; 14 | src: local("Lato Black"), local("Lato-Black"), 15 | url(S6u9w4BMUTPHh50XSwiPHA.ttf) format("truetype"); 16 | } 17 | -------------------------------------------------------------------------------- /static/css/S6u9w4BMUTPHh50XSwiPHA.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brownvc/neural-fields-review/5f30abcee9451cea8193339a78e1dbdaa0687b2e/static/css/S6u9w4BMUTPHh50XSwiPHA.ttf -------------------------------------------------------------------------------- /static/css/S6uyw4BMUTPHjx4wWw.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brownvc/neural-fields-review/5f30abcee9451cea8193339a78e1dbdaa0687b2e/static/css/S6uyw4BMUTPHjx4wWw.ttf -------------------------------------------------------------------------------- /static/css/bulma-carousel.min.css: -------------------------------------------------------------------------------- 1 | @-webkit-keyframes spinAround{from{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes spinAround{from{-webkit-transform:rotate(0);transform:rotate(0)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.slider{position:relative;width:100%}.slider-container{display:flex;flex-wrap:nowrap;flex-direction:row;overflow:hidden;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);min-height:100%}.slider-container.is-vertical{flex-direction:column}.slider-container .slider-item{flex:none}.slider-container .slider-item .image.is-covered img{-o-object-fit:cover;object-fit:cover;-o-object-position:center center;object-position:center center;height:100%;width:100%}.slider-container .slider-item .video-container{height:0;padding-bottom:0;padding-top:56.25%;margin:0;position:relative}.slider-container .slider-item .video-container.is-1by1,.slider-container .slider-item .video-container.is-square{padding-top:100%}.slider-container .slider-item .video-container.is-4by3{padding-top:75%}.slider-container .slider-item .video-container.is-21by9{padding-top:42.857143%}.slider-container .slider-item .video-container embed,.slider-container .slider-item .video-container iframe,.slider-container .slider-item .video-container object{position:absolute;top:0;left:0;width:100%!important;height:100%!important}.slider-navigation-next,.slider-navigation-previous{display:flex;justify-content:center;align-items:center;position:absolute;width:42px;height:42px;background:#fff center center no-repeat;background-size:20px 20px;border:1px solid #fff;border-radius:25091983px;box-shadow:0 2px 5px #3232321a;top:50%;margin-top:-20px;left:0;cursor:pointer;transition:opacity .3s,-webkit-transform .3s;transition:transform .3s,opacity .3s;transition:transform .3s,opacity .3s,-webkit-transform .3s}.slider-navigation-next:hover,.slider-navigation-previous:hover{-webkit-transform:scale(1.2);transform:scale(1.2)}.slider-navigation-next.is-hidden,.slider-navigation-previous.is-hidden{display:none;opacity:0}.slider-navigation-next svg,.slider-navigation-previous svg{width:25%}.slider-navigation-next{left:auto;right:0;background:#fff center center no-repeat;background-size:20px 20px}.slider-pagination{display:none;justify-content:center;align-items:center;position:absolute;bottom:0;left:0;right:0;padding:.5rem 1rem;text-align:center}.slider-pagination .slider-page{background:#fff;width:10px;height:10px;border-radius:25091983px;display:inline-block;margin:0 3px;box-shadow:0 2px 5px #3232321a;transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s;cursor:pointer}.slider-pagination .slider-page.is-active,.slider-pagination .slider-page:hover{-webkit-transform:scale(1.4);transform:scale(1.4)}@media screen and (min-width:800px){.slider-pagination{display:flex}}.hero.has-carousel{position:relative}.hero.has-carousel+.hero-body,.hero.has-carousel+.hero-footer,.hero.has-carousel+.hero-head{z-index:10;overflow:hidden}.hero.has-carousel .hero-carousel{position:absolute;top:0;left:0;bottom:0;right:0;height:auto;border:none;margin:auto;padding:0;z-index:0}.hero.has-carousel .hero-carousel .slider{width:100%;max-width:100%;overflow:hidden;height:100%!important;max-height:100%;z-index:0}.hero.has-carousel .hero-carousel .slider .has-background{max-height:100%}.hero.has-carousel .hero-carousel .slider .has-background .is-background{-o-object-fit:cover;object-fit:cover;-o-object-position:center center;object-position:center center;height:100%;width:100%}.hero.has-carousel .hero-body{margin:0 3rem;z-index:10} -------------------------------------------------------------------------------- /static/css/citation_graph.css: -------------------------------------------------------------------------------- 1 | #loadingBar { 2 | position: absolute; 3 | top: 0px; 4 | left: 0px; 5 | width: 100%; 6 | height: 602px; 7 | background-color: rgba(200, 200, 200, 0.8); 8 | -webkit-transition: all 0.5s ease; 9 | -moz-transition: all 0.5s ease; 10 | -ms-transition: all 0.5s ease; 11 | -o-transition: all 0.5s ease; 12 | transition: all 0.5s ease; 13 | opacity: 1; 14 | } 15 | #wrapper { 16 | position: relative; 17 | width: 100%; 18 | height: 600px; 19 | } 20 | 21 | #text { 22 | position: absolute; 23 | left: 530px; 24 | width: 30px; 25 | height: 50px; 26 | margin: auto auto auto auto; 27 | font-size: 22px; 28 | color: #000000; 29 | } 30 | 31 | div.outerBorder { 32 | position: relative; 33 | top: 200px; 34 | width: 600px; 35 | height: 44px; 36 | margin: auto auto auto auto; 37 | border: 8px solid rgba(0, 0, 0, 0.1); 38 | background: rgb(252, 252, 252); /* Old browsers */ 39 | background: -moz-linear-gradient( 40 | top, 41 | rgba(252, 252, 252, 1) 0%, 42 | rgba(237, 237, 237, 1) 100% 43 | ); /* FF3.6+ */ 44 | background: -webkit-gradient( 45 | linear, 46 | left top, 47 | left bottom, 48 | color-stop(0%, rgba(252, 252, 252, 1)), 49 | color-stop(100%, rgba(237, 237, 237, 1)) 50 | ); /* Chrome,Safari4+ */ 51 | background: -webkit-linear-gradient( 52 | top, 53 | rgba(252, 252, 252, 1) 0%, 54 | rgba(237, 237, 237, 1) 100% 55 | ); /* Chrome10+,Safari5.1+ */ 56 | background: -o-linear-gradient( 57 | top, 58 | rgba(252, 252, 252, 1) 0%, 59 | rgba(237, 237, 237, 1) 100% 60 | ); /* Opera 11.10+ */ 61 | background: -ms-linear-gradient( 62 | top, 63 | rgba(252, 252, 252, 1) 0%, 64 | rgba(237, 237, 237, 1) 100% 65 | ); /* IE10+ */ 66 | background: linear-gradient( 67 | to bottom, 68 | rgba(252, 252, 252, 1) 0%, 69 | rgba(237, 237, 237, 1) 100% 70 | ); /* W3C */ 71 | filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#fcfcfc', endColorstr='#ededed',GradientType=0 ); /* IE6-9 */ 72 | border-radius: 72px; 73 | box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.2); 74 | } 75 | 76 | #border { 77 | position: absolute; 78 | top: 10px; 79 | left: 10px; 80 | width: 500px; 81 | height: 23px; 82 | margin: auto auto auto auto; 83 | box-shadow: 0px 0px 4px rgba(0, 0, 0, 0.2); 84 | border-radius: 10px; 85 | } 86 | 87 | #bar { 88 | position: absolute; 89 | top: 0px; 90 | left: 0px; 91 | width: 20px; 92 | height: 20px; 93 | margin: auto auto auto auto; 94 | border-radius: 11px; 95 | border: 2px solid rgba(30, 30, 30, 0.05); 96 | background: rgb(0, 173, 246); /* Old browsers */ 97 | box-shadow: 2px 0px 4px rgba(0, 0, 0, 0.4); 98 | } 99 | -------------------------------------------------------------------------------- /static/css/default.css: -------------------------------------------------------------------------------- 1 | * { 2 | font-family: "Trebuchet MS", Arial, Helvetica, sans-serif; 3 | } 4 | 5 | ul.program li { 6 | font-size: 17px; 7 | padding: 5px; 8 | } 9 | 10 | ul#pc li { 11 | font-size: 15px; 12 | padding: 2px; 13 | color: #666666; 14 | } 15 | 16 | body { 17 | margin: 30px 0; 18 | padding: 0; 19 | background: #EFEFEF; 20 | font-size: 12px; 21 | color: #6B6B6B; 22 | } 23 | 24 | h1, h2, h3, h4, h5, h6 { 25 | margin: 0; 26 | padding: 0; 27 | font-weight: normal; 28 | color: #000000; 29 | } 30 | 31 | h2 { 32 | border-bottom: 1px solid #F4F4F4; 33 | font-size: 26px; 34 | padding: 40px 0 0 0; 35 | } 36 | 37 | h3 { 38 | font-size: 16px; 39 | } 40 | 41 | p, ol, ul, blockquote { 42 | line-height: 24px; 43 | } 44 | 45 | a { 46 | color: #EC5600; 47 | } 48 | 49 | a:hover { 50 | text-decoration: none; 51 | } 52 | 53 | a.website_link { 54 | text-decoration: none; 55 | } 56 | 57 | img { 58 | border: none; 59 | } 60 | 61 | 62 | 63 | /* Posted */ 64 | 65 | .posted { 66 | height: 33px; 67 | margin: 0 0 30px 0; 68 | padding: 10px 15px 0 15px; 69 | background: url(images/img6.gif) repeat-x; 70 | border-bottom: 1px solid #F2F2F2; 71 | } 72 | 73 | .posted p { 74 | float: left; 75 | margin: 0; 76 | } 77 | 78 | .posted .comments { 79 | float: right; 80 | } 81 | 82 | .posted a { 83 | color: #717171; 84 | } 85 | 86 | /* Header */ 87 | 88 | #header { 89 | width: 917px; 90 | height: 200px; 91 | margin: 0 auto; 92 | } 93 | 94 | /* Logo */ 95 | 96 | #logo { 97 | width: 100%; 98 | float: left; 99 | padding: 0 0 0 0; 100 | background: #FFFFFF; 101 | } 102 | 103 | #logo * { 104 | text-decoration: none; 105 | } 106 | 107 | #logo h1 { 108 | padding: 10px 0 0 0px; 109 | font-size: 32px; 110 | } 111 | 112 | #logo h1 a { 113 | color: #000000; 114 | } 115 | 116 | #logo h1 span { 117 | font-weight: bold; 118 | } 119 | 120 | #logo h2 { 121 | padding: 6px 0px 0px 0px; 122 | font-size: 19px; 123 | border: none; 124 | } 125 | 126 | #logo h2 a { 127 | color: #807A7A; 128 | } 129 | 130 | /* Menu */ 131 | #menu { 132 | width: 100%; 133 | float: left; 134 | padding: 10px 0 10px 0px; 135 | background: #FFFFFF; 136 | 137 | border-bottom: 1px solid #F4F4F4; 138 | border-top: 1px solid #F4F4F4; 139 | } 140 | 141 | 142 | #menu ul { 143 | padding: 0px;; 144 | margin: 0; 145 | padding: 0; 146 | } 147 | 148 | #menu li { 149 | display: inline; 150 | } 151 | 152 | #menu a { 153 | padding: 0 15px 0 20px; 154 | border-left: 1px solid #DBDBDB; 155 | text-transform: lowercase; 156 | text-decoration: none; 157 | font-size: 20px; 158 | color: #fff; 159 | background-color: #EC5600; 160 | padding: 8px 48px; 161 | border-radius: 8px; 162 | } 163 | #menu a:hover{ 164 | background-color: #ff8742; 165 | } 166 | 167 | #menu .first a { 168 | border: none; 169 | } 170 | 171 | /* Splash */ 172 | 173 | #splash { 174 | width: 877px; 175 | margin: 0 auto; 176 | border-right: 20px solid #FFFFFF; 177 | border-left: 20px solid #FFFFFF; 178 | } 179 | 180 | /* Content */ 181 | #content { 182 | width: 847px; 183 | margin: 0 auto; 184 | padding: 0px 35px 0 35px; 185 | background: #FFFFFF; 186 | font-size: 14px; 187 | } 188 | 189 | #colOne { 190 | float: left; 191 | width: 620px; 192 | } 193 | 194 | #colTwo { 195 | float: right; 196 | width: 185px; 197 | padding: 5px 0 0 0; 198 | } 199 | 200 | /* Organizer */ 201 | #organizer img { 202 | width: 150px; 203 | /* height: 170px;*/ 204 | } 205 | 206 | /* Footer */ 207 | #footer { 208 | } 209 | 210 | #footer p { 211 | text-align: center; 212 | color: #777777; 213 | } 214 | 215 | #footer a { 216 | color: #5D5D5D; 217 | } 218 | 219 | 220 | 221 | div#tz_select { 222 | text-align: center; 223 | margin: 32px; 224 | } 225 | 226 | 227 | table.schedule { 228 | border-color: #999; 229 | border-style: none; 230 | text-align: center; 231 | border-width: 0 0 1px 1px; 232 | border-collapse: collapse; 233 | background-color: #FFF; 234 | margin: 0 auto; 235 | /* width: 100%; */ 236 | color: #000; 237 | } 238 | 239 | table#program td { 240 | padding: 10px; 241 | border-width: 2px; 242 | border-style: solid; 243 | border-color: #ffffff; 244 | } 245 | 246 | table#CVPR-program td{ 247 | padding: 10px; 248 | border-width: 2px; 249 | border-style: solid; 250 | border-color: #ffffff; 251 | } 252 | tr.cvpr_row:nth-child(odd) { 253 | background-color: #eeeded; 254 | } 255 | /* table#program td:nth-child(2) { 256 | text-align: center; 257 | width: 110px; 258 | } 259 | table#program td:nth-child(1) { 260 | text-align: center; 261 | width: 110px; 262 | } */ 263 | 264 | tr.row_type_A { 265 | background-color: #EEE; 266 | } 267 | tr.row_type_B { 268 | background-color: #FFF; 269 | } 270 | tr.block { 271 | background-color: #00649b; 272 | color: #fff; 273 | } 274 | tr.row_type_A td { 275 | padding: 10px 10px; 276 | } 277 | tr.row_type_B td { 278 | padding: 10px 10px; 279 | } 280 | td.paper_id { 281 | text-align: center; 282 | font-size: 16px; 283 | } 284 | 285 | span.author { 286 | font-size: 16px; 287 | color: #000; 288 | display: block; 289 | margin-bottom: 8px; 290 | } 291 | 292 | p.poster_title { 293 | font-size: 20px; 294 | text-align: center; 295 | color: #000; 296 | } 297 | 298 | span.hidden { 299 | display: none; 300 | } 301 | 302 | button { 303 | background-color: #004e79; 304 | margin: 0 auto; 305 | border: none; 306 | color: white; 307 | padding: 6px 42px; 308 | border-radius: 4px; 309 | text-align: center; 310 | text-decoration: none; 311 | display: inline-block; 312 | font-size: 14px; 313 | } 314 | 315 | button:hover { 316 | background-color: #00649b; 317 | } 318 | -------------------------------------------------------------------------------- /static/css/dg4k_pLmvrkcOkBNJutH.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brownvc/neural-fields-review/5f30abcee9451cea8193339a78e1dbdaa0687b2e/static/css/dg4k_pLmvrkcOkBNJutH.ttf -------------------------------------------------------------------------------- /static/css/fa_solid.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome Free 5.14.0 by @fontawesome - https://fontawesome.com 3 | * License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) 4 | */ 5 | @font-face { 6 | font-family: "Font Awesome 5 Free"; 7 | font-style: normal; 8 | font-weight: 900; 9 | font-display: block; 10 | src: url("../webfonts/fa-solid-900.eot"); 11 | src: url("../webfonts/fa-solid-900.eot?#iefix") format("embedded-opentype"), 12 | url("../webfonts/fa-solid-900.woff2") format("woff2"), 13 | url("../webfonts/fa-solid-900.woff") format("woff"), 14 | url("../webfonts/fa-solid-900.ttf") format("truetype"), 15 | url("../webfonts/fa-solid-900.svg#fontawesome") format("svg"); 16 | } 17 | 18 | .fa, 19 | .fas { 20 | font-family: "Font Awesome 5 Free"; 21 | font-weight: 900; 22 | } 23 | -------------------------------------------------------------------------------- /static/css/index.css: -------------------------------------------------------------------------------- 1 | body { 2 | font-family: 'Noto Sans', sans-serif; 3 | } 4 | 5 | 6 | .carousel-inner > .item >img{ 7 | min-height : 300px; 8 | max-height : 300px; 9 | width : 100%; 10 | } 11 | .carousel > .item >img{ 12 | min-height : 300px; 13 | max-height : 300px; 14 | width : 100%; 15 | } */ 16 | 17 | /* .container{ 18 | height:1000px; 19 | } */ 20 | 21 | /* .carousel-item { 22 | min-height: 10px; 23 | 24 | } 25 | .footer .icon-link { 26 | font-size: 25px; 27 | color: #000; 28 | } 29 | 30 | .link-block a { 31 | margin-top: 5px; 32 | margin-bottom: 5px; 33 | } 34 | 35 | .dnerf { 36 | font-variant: small-caps; 37 | } 38 | 39 | 40 | .teaser .hero-body { 41 | padding-top: 0; 42 | padding-bottom: 3rem; 43 | } 44 | 45 | .teaser { 46 | font-family: 'Google Sans', sans-serif; 47 | } 48 | 49 | 50 | .publication-title { 51 | } 52 | 53 | .publication-banner { 54 | max-height: parent; 55 | 56 | } 57 | 58 | .publication-banner video { 59 | position: relative; 60 | left: auto; 61 | top: auto; 62 | transform: none; 63 | object-fit: fit; 64 | } 65 | 66 | .publication-header .hero-body { 67 | } 68 | 69 | .publication-title { 70 | font-family: 'Google Sans', sans-serif; 71 | } 72 | 73 | .publication-authors { 74 | font-family: 'Google Sans', sans-serif; 75 | } 76 | 77 | .publication-venue { 78 | color: #555; 79 | width: fit-content; 80 | font-weight: bold; 81 | } 82 | 83 | .publication-awards { 84 | color: #ff3860; 85 | width: fit-content; 86 | font-weight: bolder; 87 | } 88 | 89 | .publication-authors { 90 | } 91 | 92 | .publication-authors a { 93 | color: hsl(204, 86%, 53%) !important; 94 | } 95 | 96 | .publication-authors a:hover { 97 | text-decoration: underline; 98 | } 99 | 100 | .author-block { 101 | display: inline-block; 102 | } 103 | 104 | .publication-banner img { 105 | } 106 | 107 | .publication-authors { 108 | /*color: #4286f4;*/ 109 | } 110 | 111 | .publication-video { 112 | position: relative; 113 | width: 100%; 114 | height: 0; 115 | padding-bottom: 56.25%; 116 | 117 | overflow: hidden; 118 | border-radius: 10px !important; 119 | } 120 | 121 | .publication-video iframe { 122 | position: absolute; 123 | top: 0; 124 | left: 0; 125 | width: 100%; 126 | height: 100%; 127 | } 128 | 129 | .publication-body img { 130 | } 131 | 132 | .results-carousel { 133 | overflow: hidden; 134 | } 135 | 136 | .results-carousel .item { 137 | margin: 5px; 138 | overflow: hidden; 139 | border: 1px solid #bbb; 140 | border-radius: 10px; 141 | padding: 0; 142 | font-size: 0; 143 | } 144 | 145 | .results-carousel video { 146 | margin: 0; 147 | } 148 | 149 | 150 | .interpolation-panel { 151 | background: #f5f5f5; 152 | border-radius: 10px; 153 | } 154 | 155 | .interpolation-panel .interpolation-image { 156 | width: 100%; 157 | border-radius: 5px; 158 | } 159 | 160 | .interpolation-video-column { 161 | } 162 | 163 | .interpolation-panel .slider { 164 | margin: 0 !important; 165 | } 166 | 167 | .interpolation-panel .slider { 168 | margin: 0 !important; 169 | } 170 | 171 | #interpolation-image-wrapper { 172 | width: 100%; 173 | } 174 | #interpolation-image-wrapper img { 175 | border-radius: 5px; 176 | } 177 | -------------------------------------------------------------------------------- /static/css/jquery.tag-editor.css: -------------------------------------------------------------------------------- 1 | /* surrounding tag container */ 2 | .tag-editor { 3 | list-style-type: none; padding: 0 5px 0 0; margin: 0; overflow: hidden; border: 1px solid #eee; cursor: text; 4 | font: normal 14px sans-serif; color: #555; background: #fff; line-height: 20px; 5 | } 6 | 7 | /* core styles usually need no change */ 8 | .tag-editor li { display: block; float: left; overflow: hidden; margin: 3px 0; } 9 | .tag-editor div { float: left; padding: 0 4px; } 10 | .tag-editor .placeholder { padding: 0 8px; color: #bbb; } 11 | .tag-editor .tag-editor-spacer { padding: 0; width: 8px; overflow: hidden; color: transparent; background: none; } 12 | .tag-editor input { 13 | vertical-align: inherit; border: 0; outline: none; padding: 0; margin: 0; cursor: text; 14 | font-family: inherit; font-weight: inherit; font-size: inherit; font-style: inherit; 15 | box-shadow: none; background: none; color: #444; 16 | } 17 | /* hide original input field or textarea visually to allow tab navigation */ 18 | .tag-editor-hidden-src { position: absolute !important; left: -99999px; } 19 | /* hide IE10 "clear field" X */ 20 | .tag-editor ::-ms-clear { display: none; } 21 | 22 | /* tag style */ 23 | .tag-editor .tag-editor-tag { 24 | padding-left: 5px; color: #46799b; background: #e0eaf1; white-space: nowrap; 25 | overflow: hidden; cursor: pointer; border-radius: 2px 0 0 2px; 26 | } 27 | 28 | /* delete icon */ 29 | .tag-editor .tag-editor-delete { background: #e0eaf1; cursor: pointer; border-radius: 0 2px 2px 0; padding-left: 3px; padding-right: 4px; } 30 | .tag-editor .tag-editor-delete i { line-height: 18px; display: inline-block; } 31 | .tag-editor .tag-editor-delete i:before { font-size: 16px; color: #8ba7ba; content: "×"; font-style: normal; } 32 | .tag-editor .tag-editor-delete:hover i:before { color: #d65454; } 33 | .tag-editor .tag-editor-tag.active+.tag-editor-delete, .tag-editor .tag-editor-tag.active+.tag-editor-delete i { visibility: hidden; cursor: text; } 34 | 35 | .tag-editor .tag-editor-tag.active { background: none !important; } 36 | 37 | /* jQuery UI autocomplete - code.jquery.com/ui/1.10.2/themes/smoothness/jquery-ui.css */ 38 | .ui-autocomplete { position: absolute; top: 0; left: 0; cursor: default; font-size: 14px; } 39 | .ui-front { z-index: 9999; } 40 | .ui-menu { list-style: none; padding: 1px; margin: 0; display: block; outline: none; } 41 | .ui-menu .ui-menu-item a { text-decoration: none; display: block; padding: 2px .4em; line-height: 1.4; min-height: 0; /* support: IE7 */ } 42 | .ui-widget-content { border: 1px solid #bbb; background: #fff; color: #555; } 43 | .ui-widget-content a { color: #46799b; } 44 | .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { background: #e0eaf1; } 45 | .ui-helper-hidden-accessible { display: none; } 46 | -------------------------------------------------------------------------------- /static/css/lazy_load.css: -------------------------------------------------------------------------------- 1 | .lazy-load-img { 2 | min-height: 100px; 3 | } 4 | -------------------------------------------------------------------------------- /static/css/leaderboard.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brownvc/neural-fields-review/5f30abcee9451cea8193339a78e1dbdaa0687b2e/static/css/leaderboard.css -------------------------------------------------------------------------------- /static/css/main.css: -------------------------------------------------------------------------------- 1 | body a { 2 | color: #2294e0; 3 | } 4 | 5 | body a:hover { 6 | color: #2294e0; 7 | text-decoration: none; 8 | } 9 | 10 | h2, 11 | h3 { 12 | font-family: 'Ubuntu', sans-serif !important; 13 | } 14 | 15 | label:text-muted, 16 | .nav-link { 17 | font-size: 18px; 18 | font-family: 'Ubuntu', sans-serif !important; 19 | } 20 | 21 | body { 22 | font-family: 'Ubuntu', sans-serif !important; 23 | /* background-color: rgba(236, 241, 246, 1); */ 24 | background-color: white; 25 | } 26 | 27 | .container { 28 | padding-left: 0 !important; 29 | padding-right: 0 !important; 30 | } 31 | 32 | .container a:hover { 33 | text-decoration: none; 34 | } 35 | 36 | .jumbotron { 37 | font-family: 'Ubuntu', sans-serif !important; 38 | background-color: rgba(236, 241, 246, 1); 39 | } 40 | 41 | .btn-group { 42 | background-color: white; 43 | } 44 | 45 | .btn { 46 | background-color: white; 47 | } 48 | 49 | .applyBtn { 50 | background-color: #007bff; 51 | } 52 | 53 | #main-nav { 54 | padding-top: 10px; 55 | padding-bottom: 10px; 56 | } 57 | 58 | .header { 59 | font: "Montserrat"; 60 | } 61 | 62 | .pp-card { 63 | font-family: 'Ubuntu', sans-serif !important; 64 | box-shadow: 0 0 14px 0 rgba(204, 204, 204, 1); 65 | margin-bottom: 1em; 66 | display: block; 67 | overflow: hidden; 68 | } 69 | 70 | .pp-card-header { 71 | border: 4px solid #eee; 72 | font-family: 'Ubuntu', sans-serif !important; 73 | max-height: 380px; 74 | padding-top: 10px; 75 | padding-left: 15px; 76 | padding-right: 15px; 77 | } 78 | 79 | .pp-mode-mini .pp-card-header { 80 | height: 145px; 81 | border: 1px solid #eee; 82 | } 83 | 84 | .pp-card-footer { 85 | position: absolute; 86 | width: 100%; 87 | bottom: 3px; 88 | } 89 | 90 | .pp-mode-mini .pp-card-header .card-title { 91 | font-size: 17px; 92 | } 93 | 94 | .cards_img { 95 | margin-top: 20px; 96 | border-radius: 2px; 97 | max-height: 130px; 98 | object-fit: scale-down; 99 | } 100 | 101 | body .nav-pills .nav-link.active { 102 | font-size: 18px; 103 | background-color: #4A372B; 104 | font-family: 'Ubuntu', sans-serif !important; 105 | color: white !important; 106 | /* color: white !important; 107 | background-color: #4E3629 ; */ 108 | } 109 | 110 | .nav-item { 111 | font-size: 18px; 112 | } 113 | 114 | .container { 115 | margin-top: 10px; 116 | } 117 | 118 | .card { 119 | font-family: 'Ubuntu', sans-serif !important; 120 | } 121 | 122 | .card-header { 123 | font-family: 'Ubuntu', sans-serif !important; 124 | } 125 | 126 | .card-header .card-title { 127 | font-family: 'Ubuntu', sans-serif !important; 128 | } 129 | 130 | .cards.myCard { 131 | display: flex; 132 | flex-flow: wrap; 133 | margin-left: 0; 134 | box-sizing: border-box; 135 | } 136 | 137 | .cards { 138 | margin-top: 10px; 139 | } 140 | 141 | .card-title { 142 | padding-top: 15px; 143 | font-size: 20px; 144 | margin-bottom: 0px; 145 | } 146 | 147 | .bibtex-text { 148 | padding-top: 8px; 149 | font-size: 6px; 150 | margin-bottom: 0px; 151 | font-size: 12px; 152 | } 153 | 154 | h2.card-title { 155 | padding-top: 15px; 156 | font-size: 30px; 157 | } 158 | 159 | h3.card-subtitle.text-muted { 160 | margin-top: 10px; 161 | font-size: 20px; 162 | } 163 | 164 | .card-subtitle.text-muted { 165 | text-align: center; 166 | font-size: 16px; 167 | } 168 | 169 | .card-date.text-muted { 170 | padding-top: 5px; 171 | text-align: center; 172 | font-size: 14px; 173 | margin-bottom: 0px; 174 | } 175 | 176 | .card-venue.text-muted { 177 | text-align: center; 178 | font-size: 14px; 179 | margin-bottom: 2px; 180 | } 181 | 182 | .card-keywords.text-muted { 183 | font-size: 14px; 184 | } 185 | 186 | .main-title { 187 | font-weight: 700; 188 | color: #2294e0; 189 | font-family: 'Ubuntu', sans-serif !important; 190 | } 191 | 192 | .myAccordion { 193 | box-shadow: 0 0 14px 0 rgba(0, 0, 0, 0.1); 194 | border-radius: 10px; 195 | margin-bottom: 18px; 196 | padding-left: 15px; 197 | padding-bottom: 10px; 198 | padding-right: 15px; 199 | padding-top: 10px; 200 | background-color: rgba(255, 255, 255, 1); 201 | } 202 | 203 | .sponsorLogo { 204 | width: 300px; 205 | display: block; 206 | margin-left: auto; 207 | margin-right: auto; 208 | margin-top: auto; 209 | margin-bottom: auto; 210 | } 211 | 212 | .slp iframe { 213 | background: #fff; 214 | margin: 5px; 215 | border: 1px solid rgba(0, 0, 0, 0.125); 216 | border-radius: 0.25rem; 217 | } 218 | 219 | .carousel-inner .carousel-item.active, 220 | .carousel-inner .carousel-item-next, 221 | .carousel-inner .carousel-item-prev { 222 | display: flex; 223 | } 224 | 225 | .carousel-control-prev-icon { 226 | filter: invert(1); 227 | transform: translateX(-200%); 228 | } 229 | 230 | div.anchor { 231 | display: block; 232 | position: relative; 233 | top: -250px; 234 | visibility: hidden; 235 | } 236 | 237 | .carousel-control-next-icon { 238 | filter: invert(1); 239 | transform: translateX(200%); 240 | } 241 | 242 | .border { 243 | background: #fff; 244 | padding: 10px; 245 | border: 4px solid #eee; 246 | box-shadow: rgb(204, 204, 204) 2px 2px 14px 0; 247 | } 248 | 249 | tr.fc-list-item { 250 | cursor: pointer; 251 | } 252 | 253 | .details { 254 | font-family: 'Ubuntu', sans-serif !important; 255 | } 256 | 257 | #abstractExample.collapse:not(.show) { 258 | display: block; 259 | 260 | /* height = lineheight * no of lines to display */ 261 | height: 4.5em; 262 | overflow: hidden; 263 | } 264 | 265 | #abstractExample.collapsing { 266 | height: 4.5em; 267 | } 268 | 269 | #absShow.collapsed::after { 270 | content: "+ Show More"; 271 | } 272 | 273 | #absShow:not(.collapsed)::after { 274 | content: "- Show Less"; 275 | } 276 | 277 | body .carousel-control-next, 278 | body .carousel-control-prev { 279 | width: 5%; 280 | } 281 | 282 | .download-all-bibtex-icon { 283 | color: #2294e0;; 284 | font-size: 18pt; 285 | font-weight: bold; 286 | cursor: pointer; 287 | transition-duration: 100ms; 288 | } 289 | 290 | .download-all-bibtex-icon:active { 291 | transform: translateY(4px); 292 | } 293 | 294 | .icon_video, 295 | .icon_cal { 296 | fill: #6c757d; 297 | } 298 | 299 | .icon_video:hover, 300 | .icon_cal:hover { 301 | fill: #000; 302 | } 303 | 304 | .checkbox-paper { 305 | color: #fcfcfc; 306 | font-size: 14pt; 307 | font-weight: bold; 308 | cursor: pointer; 309 | transition-duration: 100ms; 310 | } 311 | 312 | .checkbox-paper.selected { 313 | opacity: 1; 314 | color: #6c757d; 315 | } 316 | 317 | .copy-bibtex-icon { 318 | color: #ddd; 319 | font-size: 18pt; 320 | font-weight: bold; 321 | cursor: pointer; 322 | transition-duration: 100ms; 323 | } 324 | 325 | .copy-bibtex-icon:hover { 326 | color: #6c757d; 327 | font-size: 18pt; 328 | font-weight: bold; 329 | cursor: pointer; 330 | transition-duration: 100ms; 331 | } 332 | 333 | .copy-bibtex-icon:active { 334 | transform: translateY(4px); 335 | } 336 | 337 | 338 | .checkbox-bookmark { 339 | color: #ddd; 340 | font-size: 18pt; 341 | font-weight: bold; 342 | cursor: pointer; 343 | transition-duration: 100ms; 344 | } 345 | 346 | .card-header-icon { 347 | color: #4ea9e6; 348 | } 349 | 350 | .checkbox-bookmark.selected { 351 | opacity: 1; 352 | color: #bed972; 353 | } 354 | 355 | .vis-tooltip { 356 | background-color: white !important; 357 | } 358 | 359 | .vis-tooltip h5 { 360 | text-align: center; 361 | color: #2294e0; 362 | } 363 | 364 | .vis-tooltip h6 { 365 | text-align: center; 366 | } 367 | 368 | .vis-tooltip span { 369 | font-weight: bolder; 370 | } 371 | 372 | .vis-tooltip p { 373 | text-align: center; 374 | margin-bottom: 0; 375 | } 376 | 377 | .vis-item.paper-item { 378 | color: white; 379 | background-color: #bed972; 380 | border-color: #bed972; 381 | } 382 | 383 | .vis-item.paper-item a { 384 | color: black; 385 | } 386 | 387 | .vis-rolling-mode-btn { 388 | visibility: hidden !important; 389 | } 390 | 391 | .homepage-title-1 { 392 | font-size: 20px; 393 | font-weight: bolder; 394 | } 395 | 396 | .homepage-title-2 { 397 | font-size: 18px; 398 | font-weight: bold; 399 | } 400 | 401 | .homepage-text { 402 | font-size: 18px; 403 | } 404 | 405 | .homepage-image { 406 | display: block; 407 | margin-left: auto; 408 | margin-right: auto; 409 | width: 100%; 410 | border: 3px solid #555; 411 | border-radius: 3rem; 412 | margin-bottom: 20px; 413 | } 414 | 415 | .contributor-card { 416 | height: 340px; 417 | } 418 | 419 | .contributor-headshot { 420 | width: 80%; 421 | display: block; 422 | margin-left: auto; 423 | margin-right: auto; 424 | padding-top: 10px; 425 | padding-bottom: 10px; 426 | } 427 | 428 | .infopage-title-1 { 429 | font-size: 20px; 430 | font-weight: bolder; 431 | } 432 | 433 | .infopage-title-2 { 434 | font-size: 18px; 435 | font-weight: bold; 436 | } 437 | 438 | .infopage-title-3 { 439 | font-size: 18px; 440 | font-weight: bold; 441 | } 442 | 443 | .infopage-text { 444 | font-size: 18px; 445 | } 446 | 447 | .infopage-step-list-item { 448 | font-size: 18px; 449 | } 450 | 451 | .btn-success, 452 | .btn-success:hover, 453 | .btn-success:active, 454 | .btn-success:visited, 455 | .btn-success:focus { 456 | color: white; 457 | background-color: #4A372B; 458 | border-color: #4A372B; 459 | ; 460 | } 461 | 462 | .change::-webkit-input-placeholder { 463 | /* WebKit, Blink, Edge */ 464 | color: rgb(207, 207, 207); 465 | } 466 | .change:-moz-placeholder { 467 | /* Mozilla Firefox 4 to 18 */ 468 | color: rgb(207, 207, 207); 469 | opacity: 1; 470 | } 471 | .change::-moz-placeholder { 472 | /* Mozilla Firefox 19+ */ 473 | color: rgb(207, 207, 207); 474 | opacity: 1; 475 | } 476 | .change:-ms-input-placeholder { 477 | /* Internet Explorer 10-11 */ 478 | color: rgb(207, 207, 207); 479 | } 480 | -------------------------------------------------------------------------------- /static/css/paper_vis.css: -------------------------------------------------------------------------------- 1 | .dot { 2 | fill: rgb(43, 113, 255); 3 | fill-opacity: 0.5; 4 | transition-duration: 0.2s; 5 | } 6 | 7 | .dot:hover { 8 | fill-opacity: 1; 9 | } 10 | 11 | .dot.highlight { 12 | fill-opacity: 1; 13 | fill: rgb(255, 54, 72); 14 | } 15 | .dot.non-highlight { 16 | fill: rgba(128, 128, 128, 0.62); 17 | } 18 | 19 | .dot.rect_selected { 20 | /*fill: rgb(169, 208, 62);*/ 21 | stroke: #333; 22 | stroke-width: 1; 23 | stroke-opacity: 1; 24 | } 25 | 26 | .dot.highlight_sel { 27 | fill-opacity: 1; 28 | fill: rgb(255, 54, 72); 29 | } 30 | 31 | .dot.read { 32 | fill: gray; 33 | } 34 | .dot.bookmarked { 35 | fill: #bed972; 36 | fill-opacity: 1; 37 | } 38 | 39 | .tt-title { 40 | font-weight: bold; 41 | } 42 | 43 | .topWords { 44 | display: inline-block; 45 | padding: 2px 4px; 46 | margin: 2px; 47 | background: #666666; 48 | color: white; 49 | border-radius: 2px; 50 | } 51 | 52 | .p_title { 53 | font-weight: bold; 54 | } 55 | .p_authors { 56 | font-size: small; 57 | } 58 | .sel_paper { 59 | background: white; 60 | padding: 5px; 61 | margin: 5px 0; 62 | border-radius: 5px; 63 | cursor: pointer; 64 | } 65 | .sel_paper:hover { 66 | background: lightgray; 67 | } 68 | 69 | .results { 70 | width: 200px; 71 | } 72 | 73 | @media (max-width: 767.98px) { 74 | .results { 75 | width: 90%; 76 | } 77 | } 78 | -------------------------------------------------------------------------------- /static/css/typeahead.css: -------------------------------------------------------------------------------- 1 | .tt-query, 2 | .tt-hint { 3 | width: 100%; 4 | height: 38px; 5 | font-size: 24px; 6 | line-height: 30px; 7 | border: 2px solid #ccc; 8 | border-radius: 8px; 9 | outline: none; 10 | } 11 | 12 | .tt-query { 13 | box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); 14 | } 15 | 16 | .tt-hint { 17 | color: #999; 18 | } 19 | 20 | .tt-menu { 21 | width: 422px; 22 | padding: 8px 0; 23 | background-color: #fff; 24 | border: 1px solid #ccc; 25 | border: 1px solid rgba(0, 0, 0, 0.2); 26 | border-radius: 8px; 27 | box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); 28 | } 29 | 30 | .tt-menu { 31 | max-height: 150px; 32 | overflow-y: auto; 33 | } 34 | 35 | .tt-suggestion { 36 | padding: 3px 20px; 37 | font-size: 18px; 38 | line-height: 24px; 39 | } 40 | 41 | .tt-suggestion.tt-cursor { 42 | color: #fff; 43 | background-color: #0097cf; 44 | } 45 | 46 | .tt-suggestion p { 47 | margin: 0; 48 | } 49 | 50 | .tt-suggestion:hover { 51 | cursor: pointer; 52 | } 53 | 54 | .twitter-typeahead, 55 | .tt-hint, 56 | .tt-input, 57 | .tt-menu { 58 | width: 100%; 59 | } 60 | -------------------------------------------------------------------------------- /static/images/BVC_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brownvc/neural-fields-review/5f30abcee9451cea8193339a78e1dbdaa0687b2e/static/images/BVC_logo.png -------------------------------------------------------------------------------- /static/images/Brown_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brownvc/neural-fields-review/5f30abcee9451cea8193339a78e1dbdaa0687b2e/static/images/Brown_logo.png -------------------------------------------------------------------------------- /static/images/Brown_logo_text.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brownvc/neural-fields-review/5f30abcee9451cea8193339a78e1dbdaa0687b2e/static/images/Brown_logo_text.png -------------------------------------------------------------------------------- /static/images/MIT_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brownvc/neural-fields-review/5f30abcee9451cea8193339a78e1dbdaa0687b2e/static/images/MIT_logo.png -------------------------------------------------------------------------------- /static/images/NeuralFields_Promo.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brownvc/neural-fields-review/5f30abcee9451cea8193339a78e1dbdaa0687b2e/static/images/NeuralFields_Promo.mp4 -------------------------------------------------------------------------------- /static/images/NeuralFieldsinVisualComputing.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brownvc/neural-fields-review/5f30abcee9451cea8193339a78e1dbdaa0687b2e/static/images/NeuralFieldsinVisualComputing.png -------------------------------------------------------------------------------- /static/images/SRG_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brownvc/neural-fields-review/5f30abcee9451cea8193339a78e1dbdaa0687b2e/static/images/SRG_logo.png -------------------------------------------------------------------------------- /static/images/alex.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brownvc/neural-fields-review/5f30abcee9451cea8193339a78e1dbdaa0687b2e/static/images/alex.jpeg -------------------------------------------------------------------------------- /static/images/anima.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brownvc/neural-fields-review/5f30abcee9451cea8193339a78e1dbdaa0687b2e/static/images/anima.jpg -------------------------------------------------------------------------------- /static/images/anima.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brownvc/neural-fields-review/5f30abcee9451cea8193339a78e1dbdaa0687b2e/static/images/anima.png -------------------------------------------------------------------------------- /static/images/browse.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brownvc/neural-fields-review/5f30abcee9451cea8193339a78e1dbdaa0687b2e/static/images/browse.gif -------------------------------------------------------------------------------- /static/images/browse.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brownvc/neural-fields-review/5f30abcee9451cea8193339a78e1dbdaa0687b2e/static/images/browse.png -------------------------------------------------------------------------------- /static/images/citation.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brownvc/neural-fields-review/5f30abcee9451cea8193339a78e1dbdaa0687b2e/static/images/citation.gif -------------------------------------------------------------------------------- /static/images/contributors/Alex_Yu.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brownvc/neural-fields-review/5f30abcee9451cea8193339a78e1dbdaa0687b2e/static/images/contributors/Alex_Yu.jpg -------------------------------------------------------------------------------- /static/images/contributors/Federico_Tombari.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brownvc/neural-fields-review/5f30abcee9451cea8193339a78e1dbdaa0687b2e/static/images/contributors/Federico_Tombari.jpg -------------------------------------------------------------------------------- /static/images/contributors/James_Tompkin.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brownvc/neural-fields-review/5f30abcee9451cea8193339a78e1dbdaa0687b2e/static/images/contributors/James_Tompkin.jpg -------------------------------------------------------------------------------- /static/images/contributors/Numair_Khan.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brownvc/neural-fields-review/5f30abcee9451cea8193339a78e1dbdaa0687b2e/static/images/contributors/Numair_Khan.jpg -------------------------------------------------------------------------------- /static/images/contributors/Or_Litany.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brownvc/neural-fields-review/5f30abcee9451cea8193339a78e1dbdaa0687b2e/static/images/contributors/Or_Litany.jpg -------------------------------------------------------------------------------- /static/images/contributors/Shiqin_Yan.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brownvc/neural-fields-review/5f30abcee9451cea8193339a78e1dbdaa0687b2e/static/images/contributors/Shiqin_Yan.jpg -------------------------------------------------------------------------------- /static/images/contributors/Shunsuke_Saito.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brownvc/neural-fields-review/5f30abcee9451cea8193339a78e1dbdaa0687b2e/static/images/contributors/Shunsuke_Saito.png -------------------------------------------------------------------------------- /static/images/contributors/Srinath_Sridhar.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brownvc/neural-fields-review/5f30abcee9451cea8193339a78e1dbdaa0687b2e/static/images/contributors/Srinath_Sridhar.jpeg -------------------------------------------------------------------------------- /static/images/contributors/Sunny_Li.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brownvc/neural-fields-review/5f30abcee9451cea8193339a78e1dbdaa0687b2e/static/images/contributors/Sunny_Li.jpg -------------------------------------------------------------------------------- /static/images/contributors/Towaki_Takikawa.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brownvc/neural-fields-review/5f30abcee9451cea8193339a78e1dbdaa0687b2e/static/images/contributors/Towaki_Takikawa.png -------------------------------------------------------------------------------- /static/images/contributors/Vincent_Sitzmann.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brownvc/neural-fields-review/5f30abcee9451cea8193339a78e1dbdaa0687b2e/static/images/contributors/Vincent_Sitzmann.jpeg -------------------------------------------------------------------------------- /static/images/contributors/Yiheng_Xie.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brownvc/neural-fields-review/5f30abcee9451cea8193339a78e1dbdaa0687b2e/static/images/contributors/Yiheng_Xie.jpg -------------------------------------------------------------------------------- /static/images/cvpr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brownvc/neural-fields-review/5f30abcee9451cea8193339a78e1dbdaa0687b2e/static/images/cvpr.png -------------------------------------------------------------------------------- /static/images/ellen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brownvc/neural-fields-review/5f30abcee9451cea8193339a78e1dbdaa0687b2e/static/images/ellen.png -------------------------------------------------------------------------------- /static/images/james.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brownvc/neural-fields-review/5f30abcee9451cea8193339a78e1dbdaa0687b2e/static/images/james.jpeg -------------------------------------------------------------------------------- /static/images/long_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brownvc/neural-fields-review/5f30abcee9451cea8193339a78e1dbdaa0687b2e/static/images/long_logo.png -------------------------------------------------------------------------------- /static/images/long_logo_new.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brownvc/neural-fields-review/5f30abcee9451cea8193339a78e1dbdaa0687b2e/static/images/long_logo_new.png -------------------------------------------------------------------------------- /static/images/main_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brownvc/neural-fields-review/5f30abcee9451cea8193339a78e1dbdaa0687b2e/static/images/main_logo.png -------------------------------------------------------------------------------- /static/images/main_logo_new.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brownvc/neural-fields-review/5f30abcee9451cea8193339a78e1dbdaa0687b2e/static/images/main_logo_new.png -------------------------------------------------------------------------------- /static/images/new.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brownvc/neural-fields-review/5f30abcee9451cea8193339a78e1dbdaa0687b2e/static/images/new.gif -------------------------------------------------------------------------------- /static/images/or.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brownvc/neural-fields-review/5f30abcee9451cea8193339a78e1dbdaa0687b2e/static/images/or.jpg -------------------------------------------------------------------------------- /static/images/our_paper_first_page.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brownvc/neural-fields-review/5f30abcee9451cea8193339a78e1dbdaa0687b2e/static/images/our_paper_first_page.png -------------------------------------------------------------------------------- /static/images/shunsuke.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brownvc/neural-fields-review/5f30abcee9451cea8193339a78e1dbdaa0687b2e/static/images/shunsuke.png -------------------------------------------------------------------------------- /static/images/srinath.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brownvc/neural-fields-review/5f30abcee9451cea8193339a78e1dbdaa0687b2e/static/images/srinath.jpg -------------------------------------------------------------------------------- /static/images/statistics.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brownvc/neural-fields-review/5f30abcee9451cea8193339a78e1dbdaa0687b2e/static/images/statistics.gif -------------------------------------------------------------------------------- /static/images/steve.webm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brownvc/neural-fields-review/5f30abcee9451cea8193339a78e1dbdaa0687b2e/static/images/steve.webm -------------------------------------------------------------------------------- /static/images/teaser.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brownvc/neural-fields-review/5f30abcee9451cea8193339a78e1dbdaa0687b2e/static/images/teaser.jpg -------------------------------------------------------------------------------- /static/images/teaser_cvpr22.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brownvc/neural-fields-review/5f30abcee9451cea8193339a78e1dbdaa0687b2e/static/images/teaser_cvpr22.jpg -------------------------------------------------------------------------------- /static/images/teaser_cvpr22.pptx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brownvc/neural-fields-review/5f30abcee9451cea8193339a78e1dbdaa0687b2e/static/images/teaser_cvpr22.pptx -------------------------------------------------------------------------------- /static/images/timeline.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brownvc/neural-fields-review/5f30abcee9451cea8193339a78e1dbdaa0687b2e/static/images/timeline.gif -------------------------------------------------------------------------------- /static/images/towaki.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brownvc/neural-fields-review/5f30abcee9451cea8193339a78e1dbdaa0687b2e/static/images/towaki.png -------------------------------------------------------------------------------- /static/images/twitter_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brownvc/neural-fields-review/5f30abcee9451cea8193339a78e1dbdaa0687b2e/static/images/twitter_logo.png -------------------------------------------------------------------------------- /static/images/vincent.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brownvc/neural-fields-review/5f30abcee9451cea8193339a78e1dbdaa0687b2e/static/images/vincent.jpeg -------------------------------------------------------------------------------- /static/images/yiheng.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brownvc/neural-fields-review/5f30abcee9451cea8193339a78e1dbdaa0687b2e/static/images/yiheng.jpeg -------------------------------------------------------------------------------- /static/images/zongyi.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brownvc/neural-fields-review/5f30abcee9451cea8193339a78e1dbdaa0687b2e/static/images/zongyi.jpg -------------------------------------------------------------------------------- /static/js/bulma-slider.min.js: -------------------------------------------------------------------------------- 1 | !function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.bulmaSlider=e():t.bulmaSlider=e()}("undefined"!=typeof self?self:this,function(){return function(n){var r={};function i(t){if(r[t])return r[t].exports;var e=r[t]={i:t,l:!1,exports:{}};return n[t].call(e.exports,e,e.exports,i),e.l=!0,e.exports}return i.m=n,i.c=r,i.d=function(t,e,n){i.o(t,e)||Object.defineProperty(t,e,{configurable:!1,enumerable:!0,get:n})},i.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return i.d(e,"a",e),e},i.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},i.p="",i(i.s=0)}([function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),n.d(e,"isString",function(){return l});var r=n(1),i=Object.assign||function(t){for(var e=1;e=l.length&&(s=!0)):s=!0),s&&(t.once&&(u[e]=null),t.callback(r))});-1!==u.indexOf(null);)u.splice(u.indexOf(null),1)}}]),e}();e.a=i}]).default}); -------------------------------------------------------------------------------- /static/js/data/FileSaver.js: -------------------------------------------------------------------------------- 1 | /* 2 | * FileSaver.js 3 | * A saveAs() FileSaver implementation. 4 | * 5 | * By Eli Grey, http://eligrey.com 6 | * 7 | * License : https://github.com/eligrey/FileSaver.js/blob/master/LICENSE.md (MIT) 8 | * source : http://purl.eligrey.com/github/FileSaver.js 9 | */ 10 | 11 | // The one and only way of getting global scope in all environments 12 | // https://stackoverflow.com/q/3277182/1008999 13 | var _global = typeof window === 'object' && window.window === window 14 | ? window : typeof self === 'object' && self.self === self 15 | ? self : typeof global === 'object' && global.global === global 16 | ? global 17 | : this 18 | 19 | function bom (blob, opts) { 20 | if (typeof opts === 'undefined') opts = { autoBom: false } 21 | else if (typeof opts !== 'object') { 22 | console.warn('Deprecated: Expected third argument to be a object') 23 | opts = { autoBom: !opts } 24 | } 25 | 26 | // prepend BOM for UTF-8 XML and text/* types (including HTML) 27 | // note: your browser will automatically convert UTF-16 U+FEFF to EF BB BF 28 | if (opts.autoBom && /^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(blob.type)) { 29 | return new Blob([String.fromCharCode(0xFEFF), blob], { type: blob.type }) 30 | } 31 | return blob 32 | } 33 | 34 | function download (url, name, opts) { 35 | var xhr = new XMLHttpRequest() 36 | xhr.open('GET', url) 37 | xhr.responseType = 'blob' 38 | xhr.onload = function () { 39 | saveAs(xhr.response, name, opts) 40 | } 41 | xhr.onerror = function () { 42 | console.error('could not download file') 43 | } 44 | xhr.send() 45 | } 46 | 47 | function corsEnabled (url) { 48 | var xhr = new XMLHttpRequest() 49 | // use sync to avoid popup blocker 50 | xhr.open('HEAD', url, false) 51 | try { 52 | xhr.send() 53 | } catch (e) {} 54 | return xhr.status >= 200 && xhr.status <= 299 55 | } 56 | 57 | // `a.click()` doesn't work for all browsers (#465) 58 | function click (node) { 59 | try { 60 | node.dispatchEvent(new MouseEvent('click')) 61 | } catch (e) { 62 | var evt = document.createEvent('MouseEvents') 63 | evt.initMouseEvent('click', true, true, window, 0, 0, 0, 80, 64 | 20, false, false, false, false, 0, null) 65 | node.dispatchEvent(evt) 66 | } 67 | } 68 | 69 | // Detect WebView inside a native macOS app by ruling out all browsers 70 | // We just need to check for 'Safari' because all other browsers (besides Firefox) include that too 71 | // https://www.whatismybrowser.com/guides/the-latest-user-agent/macos 72 | var isMacOSWebView = _global.navigator && /Macintosh/.test(navigator.userAgent) && /AppleWebKit/.test(navigator.userAgent) && !/Safari/.test(navigator.userAgent) 73 | 74 | var saveAs = _global.saveAs || ( 75 | // probably in some web worker 76 | (typeof window !== 'object' || window !== _global) 77 | ? function saveAs () { /* noop */ } 78 | 79 | // Use download attribute first if possible (#193 Lumia mobile) unless this is a macOS WebView 80 | : ('download' in HTMLAnchorElement.prototype && !isMacOSWebView) 81 | ? function saveAs (blob, name, opts) { 82 | var URL = _global.URL || _global.webkitURL 83 | var a = document.createElement('a') 84 | name = name || blob.name || 'download' 85 | 86 | a.download = name 87 | a.rel = 'noopener' // tabnabbing 88 | 89 | // TODO: detect chrome extensions & packaged apps 90 | // a.target = '_blank' 91 | 92 | if (typeof blob === 'string') { 93 | // Support regular links 94 | a.href = blob 95 | if (a.origin !== location.origin) { 96 | corsEnabled(a.href) 97 | ? download(blob, name, opts) 98 | : click(a, a.target = '_blank') 99 | } else { 100 | click(a) 101 | } 102 | } else { 103 | // Support blobs 104 | a.href = URL.createObjectURL(blob) 105 | setTimeout(function () { URL.revokeObjectURL(a.href) }, 4E4) // 40s 106 | setTimeout(function () { click(a) }, 0) 107 | } 108 | } 109 | 110 | // Use msSaveOrOpenBlob as a second approach 111 | : 'msSaveOrOpenBlob' in navigator 112 | ? function saveAs (blob, name, opts) { 113 | name = name || blob.name || 'download' 114 | 115 | if (typeof blob === 'string') { 116 | if (corsEnabled(blob)) { 117 | download(blob, name, opts) 118 | } else { 119 | var a = document.createElement('a') 120 | a.href = blob 121 | a.target = '_blank' 122 | setTimeout(function () { click(a) }) 123 | } 124 | } else { 125 | navigator.msSaveOrOpenBlob(bom(blob, opts), name) 126 | } 127 | } 128 | 129 | // Fallback to using FileReader and a popup 130 | : function saveAs (blob, name, opts, popup) { 131 | // Open a popup immediately do go around popup blocker 132 | // Mostly only available on user interaction and the fileReader is async so... 133 | popup = popup || open('', '_blank') 134 | if (popup) { 135 | popup.document.title = 136 | popup.document.body.innerText = 'downloading...' 137 | } 138 | 139 | if (typeof blob === 'string') return download(blob, name, opts) 140 | 141 | var force = blob.type === 'application/octet-stream' 142 | var isSafari = /constructor/i.test(_global.HTMLElement) || _global.safari 143 | var isChromeIOS = /CriOS\/[\d]+/.test(navigator.userAgent) 144 | 145 | if ((isChromeIOS || (force && isSafari) || isMacOSWebView) && typeof FileReader !== 'undefined') { 146 | // Safari doesn't allow downloading of blob URLs 147 | var reader = new FileReader() 148 | reader.onloadend = function () { 149 | var url = reader.result 150 | url = isChromeIOS ? url : url.replace(/^data:[^;]*;/, 'data:attachment/file;') 151 | if (popup) popup.location.href = url 152 | else location = url 153 | popup = null // reverse-tabnabbing #460 154 | } 155 | reader.readAsDataURL(blob) 156 | } else { 157 | var URL = _global.URL || _global.webkitURL 158 | var url = URL.createObjectURL(blob) 159 | if (popup) popup.location = url 160 | else location.href = url 161 | popup = null // reverse-tabnabbing #460 162 | setTimeout(function () { URL.revokeObjectURL(url) }, 4E4) // 40s 163 | } 164 | } 165 | ) 166 | 167 | _global.saveAs = saveAs.saveAs = saveAs 168 | 169 | if (typeof module !== 'undefined') { 170 | module.exports = saveAs; 171 | } 172 | -------------------------------------------------------------------------------- /static/js/data/api.js: -------------------------------------------------------------------------------- 1 | class API { 2 | /** 3 | * get and cache config object 4 | * @return object 5 | */ 6 | static getConfig() { 7 | if (API.configCache == null) { 8 | API.configCache = $.get("serve_config.json"); 9 | } 10 | return API.configCache; 11 | } 12 | 13 | 14 | static getPapers() { 15 | if (API.paperCache == null) { 16 | API.paperCache = $.get("papers.json"); 17 | } 18 | return API.paperCache; 19 | } 20 | 21 | static getCitationGraphData() { 22 | if (API.citationGraphDataCache == null) { 23 | API.citationGraphDataCache = $.get("serve_citation_graph.json"); 24 | } 25 | return API.citationGraphDataCache; 26 | } 27 | 28 | static getPapersAndProjection() { 29 | return Promise.all([ 30 | API.getPapers(), 31 | $.get("serve_papers_projection.json"), 32 | ]); 33 | } 34 | 35 | /** 36 | * lazy store creation/loading - not needed if own store backend 37 | * @see API.storeIDs 38 | * @return object 39 | */ 40 | static getStore(storeID) { 41 | if (!(storeID in API._storeCaches)) { 42 | API._storeCaches[storeID] = new Persistor( 43 | `miniconf-${API.getConfig().name}-${storeID}` 44 | ); 45 | } 46 | return API._storeCaches[storeID]; 47 | } 48 | 49 | /** 50 | * get marks for all papers of a specific type 51 | * @see API.storeIDs 52 | * @param storeID 53 | * @return {Promise} 54 | */ 55 | static async markGetAll(storeID) { 56 | return API.getStore(storeID).getAll(); 57 | } 58 | 59 | static async markSet(storeID, paperID, read = true) { 60 | return API.getStore(storeID).set(paperID, read); 61 | } 62 | 63 | /* 64 | * Resource paths 65 | */ 66 | 67 | /** 68 | * Link to thumbnails derived from paper object 69 | * @param paper 70 | * @return {string} 71 | */ 72 | static thumbnailPath(paper) { 73 | return `thumbnail_${paper.UID}.png`; 74 | } 75 | 76 | /** 77 | * Link to paper detail 78 | * @param paper 79 | * @return {string} 80 | */ 81 | static paperLink(paper) { 82 | return `paper_${paper.UID}.html`; 83 | } 84 | } 85 | 86 | API.configCache = null; 87 | API.paperCache = null; 88 | API.citationGraphDataCache = null; 89 | API._storeCaches = {}; 90 | API.storeIDs = { 91 | visited: "visited", 92 | bookmarked: "bookmark", 93 | }; 94 | -------------------------------------------------------------------------------- /static/js/data/persistor.js: -------------------------------------------------------------------------------- 1 | class Persistor { 2 | constructor(storageID) { 3 | this.storageID = storageID; 4 | this.canStore = typeof Storage !== "undefined"; 5 | } 6 | 7 | getAll() { 8 | if (this.canStore) { 9 | return JSON.parse(window.localStorage.getItem(this.storageID)) || {}; 10 | } 11 | return {}; 12 | } 13 | 14 | setAll(store) { 15 | if (this.canStore) { 16 | window.localStorage.setItem(this.storageID, JSON.stringify(store)); 17 | return true; 18 | } 19 | return false; 20 | } 21 | 22 | set(property, value) { 23 | const store = this.getAll() || {}; 24 | const old = store[property]; 25 | if (value) store[property] = value; 26 | else delete store[property]; 27 | this.setAll(store); 28 | return old; 29 | } 30 | 31 | get(property) { 32 | const store = this.getAll() || {}; 33 | return store[property]; 34 | } 35 | 36 | cleanup() { 37 | if (this.canStore) { 38 | window.localStorage.removeItem(this.storageID); 39 | } 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /static/js/index.js: -------------------------------------------------------------------------------- 1 | window.HELP_IMPROVE_VIDEOJS = false; 2 | 3 | var INTERP_BASE = "https://homes.cs.washington.edu/~kpar/nerfies/interpolation/stacked"; 4 | var NUM_INTERP_FRAMES = 240; 5 | 6 | var interp_images = []; 7 | function preloadInterpolationImages() { 8 | for (var i = 0; i < NUM_INTERP_FRAMES; i++) { 9 | var path = INTERP_BASE + '/' + String(i).padStart(6, '0') + '.jpg'; 10 | interp_images[i] = new Image(); 11 | interp_images[i].src = path; 12 | } 13 | } 14 | 15 | function setInterpolationImage(i) { 16 | var image = interp_images[i]; 17 | image.ondragstart = function() { return false; }; 18 | image.oncontextmenu = function() { return false; }; 19 | $('#interpolation-image-wrapper').empty().append(image); 20 | } 21 | 22 | 23 | $(document).ready(function() { 24 | // Check for click events on the navbar burger icon 25 | $(".navbar-burger").click(function() { 26 | // Toggle the "is-active" class on both the "navbar-burger" and the "navbar-menu" 27 | $(".navbar-burger").toggleClass("is-active"); 28 | $(".navbar-menu").toggleClass("is-active"); 29 | 30 | }); 31 | 32 | var options = { 33 | slidesToScroll: 1, 34 | slidesToShow: 3, 35 | loop: true, 36 | infinite: true, 37 | autoplay: false, 38 | autoplaySpeed: 3000, 39 | } 40 | 41 | // Initialize all div with carousel class 42 | var carousels = bulmaCarousel.attach('.carousel', options); 43 | 44 | // Loop on each carousel initialized 45 | for(var i = 0; i < carousels.length; i++) { 46 | // Add listener to event 47 | carousels[i].on('before:show', state => { 48 | console.log(state); 49 | }); 50 | } 51 | 52 | // Access to bulmaCarousel instance of an element 53 | var element = document.querySelector('#my-element'); 54 | if (element && element.bulmaCarousel) { 55 | // bulmaCarousel instance is available as element.bulmaCarousel 56 | element.bulmaCarousel.on('before-show', function(state) { 57 | console.log(state); 58 | }); 59 | } 60 | 61 | /*var player = document.getElementById('interpolation-video'); 62 | player.addEventListener('loadedmetadata', function() { 63 | $('#interpolation-slider').on('input', function(event) { 64 | console.log(this.value, player.duration); 65 | player.currentTime = player.duration / 100 * this.value; 66 | }) 67 | }, false);*/ 68 | preloadInterpolationImages(); 69 | 70 | $('#interpolation-slider').on('input', function(event) { 71 | setInterpolationImage(this.value); 72 | }); 73 | setInterpolationImage(0); 74 | $('#interpolation-slider').prop('max', NUM_INTERP_FRAMES - 1); 75 | 76 | bulmaSlider.attach(); 77 | 78 | }) 79 | -------------------------------------------------------------------------------- /static/js/modules/auth0protect.js: -------------------------------------------------------------------------------- 1 | window.onload = async () => { 2 | const auth0 = await createAuth0Client({ 3 | domain: auth0_domain, 4 | client_id: auth0_client_id, 5 | }); 6 | try { 7 | await auth0.getTokenSilently(); 8 | } catch (error) { 9 | if (error.error !== "login_required") { 10 | throw error; 11 | } 12 | if (window.location.href.includes("index.html")) { 13 | await auth0.loginWithRedirect({ 14 | redirect_uri: window.location.href, 15 | }); 16 | } else { 17 | window.location.href = "index.html"; 18 | } 19 | } 20 | 21 | // NEW - check for the code and state parameters 22 | const query = window.location.search; 23 | if (query.includes("code=") && query.includes("state=")) { 24 | // Process the login state 25 | await auth0.handleRedirectCallback(); 26 | 27 | // Use replaceState to redirect the user away and remove the querystring parameters 28 | window.history.replaceState({}, document.title, "/"); 29 | } 30 | }; 31 | -------------------------------------------------------------------------------- /static/js/modules/gdprCookies.js: -------------------------------------------------------------------------------- 1 | const allow_cookies = Cookies.get("miniconf-allow-cookies"); 2 | 3 | if (!allow_cookies) { 4 | $(".gdpr").show(); 5 | } 6 | $(".gdpr-btn").on("click", () => { 7 | Cookies.set("miniconf-allow-cookies", 1, { expires: 7 }); 8 | $(".gdpr").hide(); 9 | }); 10 | -------------------------------------------------------------------------------- /static/js/modules/icons.js: -------------------------------------------------------------------------------- 1 | const icon_video = (size) => { 2 | size = size || 32; 3 | return ``; 6 | }; 7 | 8 | const icon_cal = (size) => { 9 | size = size || 32; 10 | return ``; 15 | }; 16 | -------------------------------------------------------------------------------- /static/js/modules/lazyLoad.js: -------------------------------------------------------------------------------- 1 | // credits: https://www.sitepoint.com/five-techniques-lazy-load-images-website-performance/ 2 | 3 | let lazy_active_observer = null; 4 | 5 | const lazyLoader = () => { 6 | if (lazy_active_observer) { 7 | lazy_active_observer.disconnect(); 8 | lazy_active_observer = null; 9 | } 10 | 11 | const config = { 12 | rootMargin: "0px 0px 150px 0px", 13 | threshold: 0, 14 | }; 15 | 16 | lazy_active_observer = new IntersectionObserver(function (entries, self) { 17 | entries.forEach((entry) => { 18 | const { target } = entry; 19 | if (entry.isIntersecting) { 20 | target.setAttribute("src", target.dataset.src); 21 | // the image is now in place, stop watching 22 | self.unobserve(entry.target); 23 | target.classList.remove("lazy-load-img"); 24 | } 25 | }); 26 | }, config); 27 | 28 | const imgs = document.querySelectorAll(".lazy-load-img"); 29 | // console.log(imgs,"--- imgs"); 30 | imgs.forEach((img) => { 31 | // console.log(img,"--- img"); 32 | lazy_active_observer.observe(img); 33 | }); 34 | }; 35 | -------------------------------------------------------------------------------- /static/js/modules/pdfRender.js: -------------------------------------------------------------------------------- 1 | (function () { 2 | let currentPageIndex = 0; 3 | const pageMode = 1; 4 | let cursorIndex = Math.floor(currentPageIndex / pageMode); 5 | let pdfInstance = null; 6 | let totalPagesCount = 0; 7 | 8 | let viewport = null; 9 | 10 | /** 11 | * render one page 12 | * @param page 13 | */ 14 | function renderPage(page) { 15 | let pdfViewport = page.getViewport(1); 16 | 17 | const container = 18 | viewport.children[page.pageIndex - cursorIndex * pageMode]; 19 | pdfViewport = page.getViewport( 20 | (2 * container.offsetWidth) / pdfViewport.width 21 | ); 22 | const canvas = container.children[0]; 23 | const context = canvas.getContext("2d"); 24 | canvas.height = pdfViewport.height; 25 | canvas.width = pdfViewport.width; 26 | 27 | page.render({ 28 | canvasContext: context, 29 | viewport: pdfViewport, 30 | }); 31 | } 32 | 33 | /** 34 | * render PDF 35 | */ 36 | function render() { 37 | cursorIndex = Math.floor(currentPageIndex / pageMode); 38 | const startPageIndex = cursorIndex * pageMode; 39 | const endPageIndex = 40 | startPageIndex + pageMode < totalPagesCount 41 | ? startPageIndex + pageMode - 1 42 | : totalPagesCount - 1; 43 | 44 | const renderPagesPromises = []; 45 | for (let i = startPageIndex; i <= endPageIndex; i += 1) { 46 | renderPagesPromises.push(pdfInstance.getPage(i + 1)); 47 | } 48 | 49 | Promise.all(renderPagesPromises).then((pages) => { 50 | const pagesHTML = `
`.repeat(pages.length); 53 | viewport.innerHTML = pagesHTML; 54 | pages.forEach(renderPage); 55 | }); 56 | } 57 | 58 | function onPagerButtonsClick(event) { 59 | const action = event.target.getAttribute("data-pager"); 60 | if (action === "prev") { 61 | if (currentPageIndex === 0) { 62 | return; 63 | } 64 | currentPageIndex -= pageMode; 65 | if (currentPageIndex < 0) { 66 | currentPageIndex = 0; 67 | } 68 | render(); 69 | } 70 | if (action === "next") { 71 | if (currentPageIndex === totalPagesCount - 1) { 72 | return; 73 | } 74 | currentPageIndex += pageMode; 75 | if (currentPageIndex > totalPagesCount - 1) { 76 | currentPageIndex = totalPagesCount - 1; 77 | } 78 | render(); 79 | } 80 | } 81 | 82 | /** 83 | * init PDF viewer and first render page 84 | * @param pdfURL -- url for PDF 85 | * @param selector -- css selector for container DIV 86 | */ 87 | window.initPDFViewer = function (pdfURL, selector) { 88 | selector = selector || "#pdf_view"; 89 | viewport = document.querySelector(selector); 90 | 91 | pdfjsLib.getDocument(pdfURL).then((pdf) => { 92 | pdfInstance = pdf; 93 | totalPagesCount = 1; 94 | render(); 95 | }); 96 | }; 97 | })(); 98 | -------------------------------------------------------------------------------- /static/js/modules/typeaheadSetup.js: -------------------------------------------------------------------------------- 1 | const initTypeAhead = (list, css_sel, name, callback) => { 2 | const bh = new Bloodhound({ 3 | datumTokenizer: Bloodhound.tokenizers.whitespace, 4 | queryTokenizer: Bloodhound.tokenizers.whitespace, 5 | local: list, 6 | sufficient: 20, 7 | identify(obj) { 8 | return obj; 9 | }, 10 | }); 11 | 12 | function bhDefaults(q, sync) { 13 | if (q === "" && name === "session") { 14 | sync(bh.all()); // This is the only change needed to get 'ALL' items as the defaults 15 | } else { 16 | bh.search(q, sync); 17 | } 18 | } 19 | 20 | // remove old 21 | $(css_sel).typeahead("destroy").off("keydown").off("typeahead:selected"); 22 | // .val(""); 23 | 24 | $(css_sel) 25 | .typeahead( 26 | { 27 | hint: false, 28 | highlight: true /* Enable substring highlighting */, 29 | minLength: 0 /* Specify minimum characters required for showing suggestions */, 30 | }, 31 | { source: bhDefaults, limit: 100 } 32 | ) 33 | .on("typeahead:selected", function (evt, item) { 34 | callback(evt, item); 35 | }); 36 | 37 | $(`${css_sel}_clear`).on("click", function () { 38 | $(css_sel).val(""); 39 | callback(null, ""); 40 | }); 41 | }; 42 | -------------------------------------------------------------------------------- /static/js/modules/urlParams.js: -------------------------------------------------------------------------------- 1 | function getUrlParameter(name) { 2 | name = name.replace(/[[]/, "\\[").replace(/[\]]/, "\\]"); 3 | const regex = new RegExp(`[\\?&]${name}=([^&#]*)`); 4 | // eslint-disable-next-line no-restricted-globals 5 | const results = regex.exec(location.search); 6 | return results === null 7 | ? "" 8 | : decodeURIComponent(results[1].replace(/\+/g, " ")); 9 | } 10 | 11 | function setQueryStringParameter(name, value) { 12 | // console.log("name", name, "value", value); 13 | const params = new URLSearchParams(window.location.search); 14 | params.set(name, value); 15 | window.history.replaceState( 16 | {}, 17 | "", 18 | decodeURIComponent(`${window.location.pathname}?${params}`) 19 | ); 20 | } 21 | -------------------------------------------------------------------------------- /static/js/tagEditor/jquery.caret.min.js: -------------------------------------------------------------------------------- 1 | // http://code.accursoft.com/caret - 1.3.3 2 | !function(e){e.fn.caret=function(e){var t=this[0],n="true"===t.contentEditable;if(0==arguments.length){if(window.getSelection){if(n){t.focus();var o=window.getSelection().getRangeAt(0),r=o.cloneRange();return r.selectNodeContents(t),r.setEnd(o.endContainer,o.endOffset),r.toString().length}return t.selectionStart}if(document.selection){if(t.focus(),n){var o=document.selection.createRange(),r=document.body.createTextRange();return r.moveToElementText(t),r.setEndPoint("EndToEnd",o),r.text.length}var e=0,c=t.createTextRange(),r=document.selection.createRange().duplicate(),a=r.getBookmark();for(c.moveToBookmark(a);0!==c.moveStart("character",-1);)e++;return e}return t.selectionStart?t.selectionStart:0}if(-1==e&&(e=this[n?"text":"val"]().length),window.getSelection)n?(t.focus(),window.getSelection().collapse(t.firstChild,e)):t.setSelectionRange(e,e);else if(document.body.createTextRange)if(n){var c=document.body.createTextRange();c.moveToElementText(t),c.moveStart("character",e),c.collapse(!0),c.select()}else{var c=t.createTextRange();c.move("character",e),c.select()}return n||t.focus(),e}}(jQuery); 3 | -------------------------------------------------------------------------------- /static/js/tagEditor/jquery.tag-editor.min.js: -------------------------------------------------------------------------------- 1 | // jQuery tagEditor v1.0.21 2 | // https://github.com/Pixabay/jQuery-tagEditor 3 | !function(t){t.fn.tagEditorInput=function(){var e=" ",i=t(this),a=parseInt(i.css("fontSize")),r=t("").css({position:"absolute",top:-9999,left:-9999,width:"auto",fontSize:i.css("fontSize"),fontFamily:i.css("fontFamily"),fontWeight:i.css("fontWeight"),letterSpacing:i.css("letterSpacing"),whiteSpace:"nowrap"}),l=function(){if(e!==(e=i.val())){r.text(e);var t=r.width()+a;20>t&&(t=20),t!=i.width()&&i.width(t)}};return r.insertAfter(i),i.bind("keyup keydown focus",l)},t.fn.tagEditor=function(e,a,r){function l(t){return t.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}var n,o=t.extend({},t.fn.tagEditor.defaults,e),c=this;if(o.dregex=new RegExp("["+o.delimiter.replace("-","-")+"]","g"),"string"==typeof e){var s=[];return c.each(function(){var i=t(this),l=i.data("options"),n=i.next(".tag-editor");if("getTags"==e)s.push({field:i[0],editor:n,tags:n.data("tags")});else if("addTag"==e){if(l.maxTags&&n.data("tags").length>=l.maxTags)return!1;t('
  •  '+l.delimiter[0]+'
  • ').appendTo(n).find(".tag-editor-tag").html('').addClass("active").find("input").val(a).blur(),r?t(".placeholder",n).remove():n.click()}else"removeTag"==e?(t(".tag-editor-tag",n).filter(function(){return t(this).text()==a}).closest("li").find(".tag-editor-delete").click(),r||n.click()):"destroy"==e&&i.removeClass("tag-editor-hidden-src").removeData("options").off("focus.tag-editor").next(".tag-editor").remove()}),"getTags"==e?s:this}return window.getSelection&&t(document).off("keydown.tag-editor").on("keydown.tag-editor",function(e){if(8==e.which||46==e.which||e.ctrlKey&&88==e.which){try{var a=getSelection(),r="INPUT"!=document.activeElement.tagName?t(a.getRangeAt(0).startContainer.parentNode).closest(".tag-editor"):0}catch(e){r=0}if(a.rangeCount>0&&r&&r.length){var l=[],n=a.toString().split(r.prev().data("options").dregex);for(i=0;i
    '+o.placeholder+"
    ")}function i(i){var a=c.toString();c=t(".tag-editor-tag:not(.deleted)",s).map(function(e,i){var a=t.trim(t(this).hasClass("active")?t(this).find("input").val():t(i).text());return a?a:void 0}).get(),s.data("tags",c),r.val(c.join(o.delimiter[0])),i||a!=c.toString()&&o.onChange(r,s,c),e()}function a(e){for(var a,n=e.closest("li"),d=e.val().replace(/ +/," ").split(o.dregex),g=e.data("old_tag"),f=c.slice(0),h=!1,u=0;u
     '+o.delimiter[0]+'
    '+l(v)+'
    '),o.maxTags&&f.length>=o.maxTags)){h=!0;break}e.attr("maxlength",o.maxLength).removeData("old_tag").val(""),h?e.blur():e.focus(),i()}var r=t(this),c=[],s=t("
      ').insertAfter(r);r.addClass("tag-editor-hidden-src").data("options",o).on("focus.tag-editor",function(){s.click()}),s.append('
    •  
    • ');var d='
    •  '+o.delimiter[0]+'
    • ';s.click(function(e,i){var a,r,l=99999;if(!window.getSelection||""==getSelection())return o.maxTags&&s.data("tags").length>=o.maxTags?(s.find("input").blur(),!1):(n=!0,t("input:focus",s).blur(),n?(n=!0,t(".placeholder",s).remove(),i&&i.length?r="before":t(".tag-editor-tag",s).each(function(){var n=t(this),o=n.offset(),c=o.left,s=o.top;e.pageY>=s&&e.pageY<=s+n.height()&&(e.pageXa&&(l=a,i=n))}),"before"==r?t(d).insertBefore(i.closest("li")).find(".tag-editor-tag").click():"after"==r?t(d).insertAfter(i.closest("li")).find(".tag-editor-tag").click():t(d).appendTo(s).find(".tag-editor-tag").click(),!1):!1)}),s.on("click",".tag-editor-delete",function(){if(t(this).prev().hasClass("active"))return t(this).closest("li").find("input").caret(-1),!1;var a=t(this).closest("li"),l=a.find(".tag-editor-tag");return o.beforeTagDelete(r,s,c,l.text())===!1?!1:(l.addClass("deleted").animate({width:0},o.animateDelete,function(){a.remove(),e()}),i(),!1)}),o.clickDelete&&s.on("mousedown",".tag-editor-tag",function(a){if(a.ctrlKey||a.which>1){var l=t(this).closest("li"),n=l.find(".tag-editor-tag");return o.beforeTagDelete(r,s,c,n.text())===!1?!1:(n.addClass("deleted").animate({width:0},o.animateDelete,function(){l.remove(),e()}),i(),!1)}}),s.on("click",".tag-editor-tag",function(e){if(o.clickDelete&&(e.ctrlKey||e.which>1))return!1;if(!t(this).hasClass("active")){var i=t(this).text(),a=Math.abs((t(this).offset().left-e.pageX)/t(this).width()),r=parseInt(i.length*a),n=t(this).html('').addClass("active").find("input");if(n.data("old_tag",i).tagEditorInput().focus().caret(r),o.autocomplete){var c=t.extend({},o.autocomplete),d="select"in c?o.autocomplete.select:"";c.select=function(e,i){d&&d(e,i),setTimeout(function(){s.trigger("click",[t(".active",s).find("input").closest("li").next("li").find(".tag-editor-tag")])},20)},n.autocomplete(c)}}return!1}),s.on("blur","input",function(d){d.stopPropagation();var g=t(this),f=g.data("old_tag"),h=t.trim(g.val().replace(/ +/," ").replace(o.dregex,o.delimiter[0]));if(h){if(h.indexOf(o.delimiter[0])>=0)return void a(g);if(h!=f)if(o.forceLowercase&&(h=h.toLowerCase()),cb_val=o.beforeTagSave(r,s,c,f,h),h=cb_val||h,cb_val===!1){if(f)return g.val(f).focus(),n=!1,void i();try{g.closest("li").remove()}catch(d){}f&&i()}else o.removeDuplicates&&t(".tag-editor-tag:not(.active)",s).each(function(){t(this).text()==h&&t(this).closest("li").remove()})}else{if(f&&o.beforeTagDelete(r,s,c,f)===!1)return g.val(f).focus(),n=!1,void i();try{g.closest("li").remove()}catch(d){}f&&i()}g.parent().html(l(h)).removeClass("active"),h!=f&&i(),e()});var g;s.on("paste","input",function(){t(this).removeAttr("maxlength"),g=t(this),setTimeout(function(){a(g)},30)});var f;s.on("keypress","input",function(e){o.delimiter.indexOf(String.fromCharCode(e.which))>=0&&(f=t(this),setTimeout(function(){a(f)},20))}),s.on("keydown","input",function(e){var i=t(this);if((37==e.which||!o.autocomplete&&38==e.which)&&!i.caret()||8==e.which&&!i.val()){var a=i.closest("li").prev("li").find(".tag-editor-tag");return a.length?a.click().find("input").caret(-1):!i.val()||o.maxTags&&s.data("tags").length>=o.maxTags||t(d).insertBefore(i.closest("li")).find(".tag-editor-tag").click(),!1}if((39==e.which||!o.autocomplete&&40==e.which)&&i.caret()==i.val().length){var l=i.closest("li").next("li").find(".tag-editor-tag");return l.length?l.click().find("input").caret(0):i.val()&&s.click(),!1}if(9==e.which){if(e.shiftKey){var a=i.closest("li").prev("li").find(".tag-editor-tag");if(a.length)a.click().find("input").caret(0);else{if(!i.val()||o.maxTags&&s.data("tags").length>=o.maxTags)return r.attr("disabled","disabled"),void setTimeout(function(){r.removeAttr("disabled")},30);t(d).insertBefore(i.closest("li")).find(".tag-editor-tag").click()}return!1}var l=i.closest("li").next("li").find(".tag-editor-tag");if(l.length)l.click().find("input").caret(0);else{if(!i.val())return;s.click()}return!1}if(!(46!=e.which||t.trim(i.val())&&i.caret()!=i.val().length)){var l=i.closest("li").next("li").find(".tag-editor-tag");return l.length?l.click().find("input").caret(0):i.val()&&s.click(),!1}if(13==e.which)return s.trigger("click",[i.closest("li").next("li").find(".tag-editor-tag")]),o.maxTags&&s.data("tags").length>=o.maxTags&&s.find("input").blur(),!1;if(36!=e.which||i.caret()){if(35==e.which&&i.caret()==i.val().length)s.find(".tag-editor-tag").last().click();else if(27==e.which)return i.val(i.data("old_tag")?i.data("old_tag"):"").blur(),!1}else s.find(".tag-editor-tag").first().click()});for(var h=o.initialTags.length?o.initialTags:r.val().split(o.dregex),u=0;u=o.maxTags);u++){var v=t.trim(h[u].replace(/ +/," "));v&&(o.forceLowercase&&(v=v.toLowerCase()),c.push(v),s.append('
    •  '+o.delimiter[0]+'
      '+l(v)+'
    • '))}i(!0),o.sortable&&t.fn.sortable&&s.sortable({distance:5,cancel:".tag-editor-spacer, input",helper:"clone",update:function(){i()}})})},t.fn.tagEditor.defaults={initialTags:[],maxTags:0,maxLength:50,delimiter:",;",placeholder:"",forceLowercase:!0,removeDuplicates:!0,clickDelete:!1,animateDelete:175,sortable:!0,autocomplete:null,onChange:function(){},beforeTagSave:function(){},beforeTagDelete:function(){}}}(jQuery); -------------------------------------------------------------------------------- /static/js/views/index.js: -------------------------------------------------------------------------------- 1 | let allPapers = []; 2 | const allKeys = { 3 | authors: [], 4 | keywords: [], 5 | titles: [], 6 | nicknames: [], 7 | venues: [], 8 | dates: [] 9 | }; 10 | 11 | const start = () => { 12 | Promise.all([API.getPapers()]) 13 | .then(([papers]) => { 14 | allPapers = papers; 15 | calcAllKeys(allPapers, allKeys); 16 | initTypeAhead( 17 | [...allKeys.titles, 18 | ...allKeys.nicknames, 19 | ...allKeys.authors, 20 | ...allKeys.keywords, 21 | ...allKeys.venues], 22 | ".vagueSearchTypeahead", "vagueSearch", vagueSearch); 23 | }) 24 | .catch((e) => console.error(e)); 25 | }; 26 | 27 | 28 | const vagueSearch = () => { 29 | const searchValue = document.getElementById("vagueSearchInput").value; 30 | const url = `papers_vague.html?vagueSearch=${searchValue}`; 31 | window.open(url,"_self").focus(); 32 | } 33 | -------------------------------------------------------------------------------- /static/js/views/paper_detail.js: -------------------------------------------------------------------------------- 1 | let citationGraph = null; 2 | 3 | function getHtmlInfoBox(html) { 4 | const container = document.createElement("div"); 5 | container.innerHTML = html; 6 | return container; 7 | } 8 | 9 | const prettifyTitle = (title) => { 10 | let prettyTitle = "
      "; 11 | const words = title.split(" "); 12 | for (let i = 0; i < words.length; ++i) { 13 | prettyTitle += `${words[i]} `; 14 | if (i % 5 === 0 && i !== 0) prettyTitle += "
      "; 15 | } 16 | prettyTitle += "
      "; 17 | return prettyTitle; 18 | }; 19 | 20 | const prettifyAuthors = (authors) => { 21 | let prettyAuthors = "

      "; 22 | for (let i = 0; i < authors.length; ++i) { 23 | prettyAuthors += authors[i]; 24 | if (i != authors.length - 1) prettyAuthors += ", "; 25 | if (i % 4 == 0 && i != 0) prettyAuthors += "

      "; 26 | } 27 | prettyAuthors += "

      "; 28 | return prettyAuthors; 29 | }; 30 | 31 | const prettifyKeywords = (keywords) => { 32 | let prettyKeywords = "

      Keywords: "; 33 | for (let i = 0; i < keywords.length; ++i) { 34 | prettyKeywords += keywords[i]; 35 | if (i != keywords.length - 1) prettyKeywords += ", "; 36 | if (i % 2 == 0 && i != 0) prettyKeywords += "

      "; 37 | } 38 | prettyKeywords += "

      "; 39 | return prettyKeywords; 40 | }; 41 | 42 | const generatePaperInfoBox = (paper) => { 43 | return ` 44 | ${prettifyTitle(paper.title)} 45 | ${prettifyAuthors(paper.authors)} 46 |
      ${paper.date}
      47 | ${prettifyKeywords(paper.keywords)} 48 | `; 49 | }; 50 | 51 | const generateNodes = (papers, isCurrentPaper) => { 52 | return papers.map((paper) => { 53 | return { 54 | id: paper.UID, 55 | label: 56 | paper.nickname !== "" 57 | ? paper.nickname 58 | : `${paper.title.substring(0, 6)}...`, 59 | color: isCurrentPaper ? "#ff7f7f" : "#9fc2f7", 60 | title: getHtmlInfoBox(generatePaperInfoBox(paper)), 61 | }; 62 | }); 63 | }; 64 | 65 | const generateEdges = (thisPaperID, otherPaperIDs, isInEdge) => { 66 | return otherPaperIDs.map((paperID) => { 67 | if (isInEdge) { 68 | return { 69 | from: paperID, 70 | to: thisPaperID, 71 | arrows: { 72 | to: { 73 | enabled: true, 74 | scaleFactor: 0.4, 75 | }, 76 | }, 77 | label: "citing", 78 | font: { align: "middle" }, 79 | color: "green", 80 | }; 81 | } 82 | 83 | return { 84 | from: thisPaperID, 85 | to: paperID, 86 | arrows: { 87 | to: { 88 | enabled: true, 89 | scaleFactor: 0.4, 90 | }, 91 | }, 92 | label: "citing", 93 | font: { align: "middle" }, 94 | color: "orange", 95 | }; 96 | }); 97 | }; 98 | 99 | const constructCitationCode = (paper) => { 100 | const authors = paper["authors"]; 101 | const year = paper["year"]; 102 | let citationCode = ""; 103 | if (authors.length == 1) 104 | { 105 | const familyname = authors[0].split(" ")[1]; 106 | citationCode = familyname.substring(0, 3) + year.substring(2); 107 | } 108 | else if (authors.length == 2) 109 | { 110 | const familyname1 = authors[0].split(" ")[1]; 111 | const familyname2 = authors[1].split(" ")[1]; 112 | citationCode = familyname1[0] + familyname2[0] + year.substring(2); 113 | } 114 | else if (authors.length == 3) 115 | { 116 | const familyname1 = authors[0].split(" ")[1]; 117 | const familyname2 = authors[1].split(" ")[1]; 118 | const familyname3 = authors[2].split(" ")[1]; 119 | citationCode = familyname1[0] + familyname2[0] + familyname3[0] + year.substring(2); 120 | } 121 | else { 122 | const familyname1 = authors[0].split(" ")[1]; 123 | const familyname2 = authors[1].split(" ")[1]; 124 | const familyname3 = authors[2].split(" ")[1]; 125 | citationCode = familyname1[0] + familyname2[0] + familyname3[0] + "*" + year.substring(2); 126 | } 127 | return citationCode; 128 | } 129 | 130 | const drawCitationGraphAndGenerateCitationCode = (paperID) => { 131 | Promise.all([API.getPapers(), API.getCitationGraphData()]) 132 | .then(([allPapers, citationGraphData]) => { 133 | paperIDsCitedByThisPaper = new Set(citationGraphData[paperID].out_edge); 134 | paperIDsCitingThisPaper = new Set(citationGraphData[paperID].in_edge); 135 | papersCitedByThisPaper = allPapers.filter((paper) => 136 | paperIDsCitedByThisPaper.has(paper.UID) 137 | ); 138 | thisPaper = allPapers.filter((paper) => paper.UID === paperID); 139 | papersCitingThisPaper = allPapers.filter((paper) => 140 | paperIDsCitingThisPaper.has(paper.UID) 141 | ); 142 | const citationCode = constructCitationCode(thisPaper[0]); 143 | d3.select("#citation-code-wrapper") 144 | .html(` ${citationCode} `); 145 | const nodes_ = new Set([...papersCitedByThisPaper, ...papersCitingThisPaper]); 146 | const nodes = new vis.DataSet([ 147 | ...generateNodes(thisPaper, true), 148 | ...generateNodes(Array.from(nodes_), false) 149 | ]); 150 | const edges = new vis.DataSet([ 151 | ...generateEdges(paperID, Array.from(paperIDsCitedByThisPaper), false), 152 | ...generateEdges(paperID, Array.from(paperIDsCitingThisPaper), true), 153 | ]); 154 | const container = document.getElementById("citationGraph"); 155 | const data = { 156 | nodes, 157 | edges, 158 | }; 159 | const options = { 160 | nodes: { 161 | shape: "dot", 162 | size: 22, 163 | }, 164 | }; 165 | citationGraph = new vis.Network(container, data, options); 166 | }) 167 | .catch((e) => console.error(e)); 168 | }; 169 | 170 | 171 | 172 | const openPaperLink = () => { 173 | const selectedNodes = citationGraph.getSelectedNodes(); 174 | for (let nodeId of selectedNodes) { 175 | const url = `paper_${nodeId}.html`; 176 | window.open(url, '_blank').focus(); 177 | } 178 | } 179 | -------------------------------------------------------------------------------- /static/js/views/paper_vis_statistics.js: -------------------------------------------------------------------------------- 1 | let allPapers = []; 2 | 3 | const start = () => { 4 | Promise.all([API.getPapers()]) 5 | .then(([papers]) => { 6 | allPapers = papers; 7 | drawKeywordsStatistics(allPapers); 8 | }) 9 | .catch((e) => console.error(e)); 10 | } 11 | 12 | 13 | const drawKeywordsStatistics = (allPapers) => { 14 | const keywords2freq = {}; 15 | for (let paper of allPapers) { 16 | for (let keyword of paper.keywords) { 17 | //if (keyword.length > 5) keyword = keyword.substring(0, 6) + "..."; 18 | if (! keywords2freq[keyword]) { 19 | keywords2freq[keyword] = 0; 20 | } 21 | keywords2freq[keyword] += 1; 22 | } 23 | } 24 | const keywords2freqEntries = Object.entries(keywords2freq); 25 | keywords2freqEntries.sort((a, b) => { if (a[1] == b[1]) { return 0; } else { return a[1] < b[1] ? 1 : -1 } }); 26 | const keywords = keywords2freqEntries.map((entry) => entry[0]); 27 | const freqs = keywords2freqEntries.map((entry) => entry[1]); 28 | let data = [ 29 | { 30 | x: freqs, 31 | y: keywords, 32 | type: 'bar', 33 | marker: { 34 | color: 'rgb(190, 217, 114)', 35 | opacity: 0.9, 36 | }, 37 | orientation: 'h' 38 | } 39 | ]; 40 | let layout = { 41 | margin: { 42 | t: 0 43 | }, 44 | paper_bgcolor: 'rgba(0,0,0,0)', 45 | plot_bgcolor: 'rgba(0,0,0,0)', 46 | xaxis: { automargin: true }, 47 | yaxis: { automargin: true }, 48 | } 49 | Plotly.newPlot('keywords-statistics', data, layout); 50 | var myPlot = document.getElementById('keywords-statistics'); 51 | myPlot.on('plotly_click', function(data){ 52 | const labelClicked = data.points[0].y; 53 | if (labelClicked) { 54 | const urlToOpen = `papers.html?keyword=${labelClicked}`; 55 | window.open(urlToOpen, '_blank').focus(); 56 | } 57 | }); 58 | } 59 | -------------------------------------------------------------------------------- /static/pdf/2021_NeuralFieldsReview.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brownvc/neural-fields-review/5f30abcee9451cea8193339a78e1dbdaa0687b2e/static/pdf/2021_NeuralFieldsReview.pdf -------------------------------------------------------------------------------- /static/webfonts/fa-solid-900.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brownvc/neural-fields-review/5f30abcee9451cea8193339a78e1dbdaa0687b2e/static/webfonts/fa-solid-900.eot -------------------------------------------------------------------------------- /static/webfonts/fa-solid-900.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brownvc/neural-fields-review/5f30abcee9451cea8193339a78e1dbdaa0687b2e/static/webfonts/fa-solid-900.ttf -------------------------------------------------------------------------------- /static/webfonts/fa-solid-900.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brownvc/neural-fields-review/5f30abcee9451cea8193339a78e1dbdaa0687b2e/static/webfonts/fa-solid-900.woff -------------------------------------------------------------------------------- /static/webfonts/fa-solid-900.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brownvc/neural-fields-review/5f30abcee9451cea8193339a78e1dbdaa0687b2e/static/webfonts/fa-solid-900.woff2 -------------------------------------------------------------------------------- /temp/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | !.gitignore 3 | -------------------------------------------------------------------------------- /templates/add_paper.html: -------------------------------------------------------------------------------- 1 | {% set active_page = "Add Paper" %} 2 | {% set page_title = "Add Paper" %} 3 | 4 | {% extends "base.html" %} 5 | 6 | {% block head %} 7 | {{ super() }} 8 | 25 | {% endblock %} 26 | 27 | {% block content %} 28 | 29 |
      30 | 31 |
      32 |

      Submit a new paper (takes 1 minute)

      33 |

      Please fill out this Google form.

      34 |

      Update an existing paper

      35 |

      Please fill out this Google form. 36 |
      37 |
      38 | *Changes will be reflected on the website within a few days. 39 |
      40 |

      Join us

      41 |

      We are looking for volunteers who can moderate and maintain this database. See Join Us tab.

      42 | 43 | 63 |
      64 |
      65 | {% endblock %} 66 | -------------------------------------------------------------------------------- /templates/base.html: -------------------------------------------------------------------------------- 1 | {% import 'components.html' as components %} 2 | 3 | 4 | 5 | 6 | {% block head %} 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 16 | 17 | 19 | 20 | 23 | 24 | 26 | 27 | 29 | 30 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | {{config.page_title.prefix}}{% if page_title 62 | %}{{config.page_title.separator}}{{page_title}}{% endif %} 63 | 64 | 65 | 66 | 67 | 68 | 75 | 76 | {% endblock %} 77 | 78 | 79 | 80 | 81 | {% block header %} 82 | {% set navigation_bar = [ 83 | ('index.html', 'Home'), 84 | ('papers.html', 'Advanced Search'), 85 | ('add_paper.html', 'Add Paper'), 86 | ('join_us.html', 'Join Us'), 87 | ('faq.html', 'FAQ') 88 | ] -%} 89 | 90 | 110 | {% endblock %} 111 | 112 | {% block body %} 113 | 114 | 115 | {% block top %} 116 | 117 | {% endblock %} 118 | 119 |
      120 | 121 |
      122 | {% block tabs %} {% endblock %} 123 |
      124 | 125 |
      126 | {% block content %} {% endblock %} 127 |
      128 |
      129 | 130 | 131 | {% endblock %} 132 | 133 | 134 | {% block footer %} 135 | 136 | 137 | 138 | 150 | 151 | 152 | 168 | 169 | 170 | {% endblock %} 171 | 172 | 173 | 174 | -------------------------------------------------------------------------------- /templates/components.html: -------------------------------------------------------------------------------- 1 | {# Components: 2 | tabs -- Navigation tabs 3 | section, subsection -- bootstrap sections 4 | speakergroup 5 | organizergroup 6 | faqgroup 7 | highlightgroup 8 | workshopgroup 9 | 10 | #} 11 | 12 | {% macro tabs(tab_group) -%} 13 | 22 | {%- endmacro %} 23 | 24 | {% macro sectionTitleLink(name, url) -%} 25 |
      26 |
      27 |
      28 | {{name}} 29 |
      30 |
      31 | {%- endmacro %} 32 | 33 | {% macro sectionTitlePlain(name) -%} 34 |
      35 |
      36 |
      37 | {{name}} 38 |
      39 |
      40 | {%- endmacro %} 41 | 42 | {% macro sectionTitleCitationGraph(name) -%} 43 |
      44 |
      45 |
      46 | {{name}}
      47 | (Double click on nodes to open corresponding papers' pages) 48 |
      49 |
      50 | {%- endmacro %} 51 | 52 | {% macro subsection(name) -%} 53 |
      54 |
      55 |

      {{name}}

      56 |
      57 |
      58 | {%- endmacro %} 59 | 60 | {% macro speakergroup(speakers) -%} 61 | {% for speaker in speakers %} 62 |
      63 |
      64 |
      65 |
      66 |
      67 |
      68 | 69 |
      70 |
      71 |
      72 |

      73 | 74 | {{speaker.title}} 75 | 76 |

      77 |
      78 |
      79 | 80 | {{speaker.speaker}} / {{speaker.institution}} 81 | 82 |
      83 |
      84 | {{speaker.abstract|safe}} 85 |
      86 |
      87 |
      88 |
      89 |
      90 |
      91 |
      92 | {% endfor %} 93 | {%- endmacro %} 94 | 95 | {% macro organizergroup(committee) -%} 96 |
      97 | {% for org in committee %} 98 |
      99 |
      100 |
      101 |
      {{org.name}}
      102 |
      103 |
      104 | {{org.role}} 105 |
      106 |
      107 |
      108 |
      109 | {{org.aff}}{% if org.tw %} / 110 | @{{org.tw}}{% endif %} 111 |
      112 |
      113 |
      114 | 115 |
      116 |
      117 |
      118 |
      119 | {% endfor %} 120 |
      121 | {%- endmacro %} 122 | 123 | {% macro faqgroup(FAQ) -%} 124 | {% for section in FAQ %} 125 | {{ subsection(section.Section) }} 126 | 127 | {% set rowloop = loop.index %} 128 | {% for qa in section.QA %} 129 |
      130 |
      131 |
      132 | 138 |
      140 |
      141 | {{qa.Answer}} 142 |
      143 |
      144 |
      145 |
      146 |
      147 | {% endfor %} 148 | {% endfor %} 149 | {%- endmacro %} 150 | 151 | {% macro highlightgroup(papers, id) -%} 152 |
      153 | 194 |
      195 | {%- endmacro %} 196 | 197 | {% macro workshopgroup(workshops) -%} 198 |
      199 | {% for workshop in workshops %} 200 |
      201 |
      202 |
      203 | 204 |

      205 | {{workshop.title}} 206 |

      207 |
      208 |
      209 | {{ workshop.organizers | join(", ") }} 210 |
      211 |
      212 | {{workshop.abstract|safe}} 213 |
      214 |
      215 |
      216 |
      217 | {% endfor %} 218 |
      219 | {%- endmacro %} 220 | -------------------------------------------------------------------------------- /templates/index.html: -------------------------------------------------------------------------------- 1 | {% set active_page = "Home" %} 2 | {% set page_title = "Home" %} 3 | {% extends "index_base.html" %} 4 | 5 | {% block top %} 6 | 16 | 17 | A living database of neural field papers in visual computing and beyond 20 | {% endblock %} 21 | 22 | {% block content %} 23 | 24 |
      25 |
      26 |
      27 | 29 | 33 |
      34 |
      35 | 39 |
      40 |
      41 | 42 |
      43 |
      44 | 47 |
      48 |
      49 | 52 |
      53 |
      54 | 57 |
      58 |
      59 | 60 | 61 |

      Eurographics 2022 STAR | CVPR 2022 Tutorial | SIGGRAPH 2023 Course

      62 | 63 | 64 |
      65 |
      66 |
      67 |
      68 | 69 | 70 | 71 | 72 | 73 |
      74 | arXiv   75 | PDF   76 |  BibTeX 77 |
      78 |
      79 |
      80 |
      81 |
      82 | 83 | 84 | 85 | 86 | 104 | {% endblock %} 105 | -------------------------------------------------------------------------------- /templates/index_base.html: -------------------------------------------------------------------------------- 1 | {% import 'components.html' as components %} 2 | 3 | 4 | 5 | 6 | {% block head %} 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 16 | 17 | 19 | 20 | 23 | 24 | 26 | 27 | 29 | 30 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 63 | 65 | 66 | {{config.page_title.prefix}}{% if page_title 67 | %}{{config.page_title.separator}}{{page_title}}{% endif %} 68 | 69 | 70 | 71 | 72 | 73 | 80 | 81 | {% endblock %} 82 | 83 | 84 | 85 | 86 | {% block header %} 87 | {% set navigation_bar = [ 88 | ('index.html', 'Home'), 89 | ('papers.html', 'Advanced Search'), 90 | ('add_paper.html', 'Add Paper'), 91 | ('join_us.html', 'Join Us'), 92 | ('faq.html', 'FAQ') 93 | ] -%} 94 | 95 | 112 | {% endblock %} 113 | 114 | {% block body %} 115 | 116 | 117 | {% block top %} 118 | 119 | {% endblock %} 120 | 121 |
      122 | 123 |
      124 | {% block tabs %} {% endblock %} 125 |
      126 | 127 |
      128 | {% block content %} {% endblock %} 129 |
      130 |
      131 | 132 | 133 | {% endblock %} 134 | 135 | 136 | {% block footer %} 137 | 138 | 139 | 140 | 149 | 150 | 151 | 167 | 168 | 169 | {% endblock %} 170 | 171 | 172 | 173 | -------------------------------------------------------------------------------- /templates/join_us.html: -------------------------------------------------------------------------------- 1 | {% set active_page = "Join Us" %} 2 | {% set page_title = "Join Us" %} 3 | 4 | {% extends "base.html" %} 5 | 6 | {% block head %} 7 | {{ super() }} 8 | 13 | {% endblock %} 14 | 15 | {% block content %} 16 | 17 |
      18 | 19 |

      Join our Slack channel

      20 |

      Joint the community of Neural Field researchers on our 21 | Slack channel, 22 | where you can bounce off ideas, join reading groups, and ask questions. 23 |

      24 | 25 | 26 | 27 |

      Become a moderator

      28 |

      We hope that this database becomes an asset of our community, 29 | so we welcome anyone interested to become a moderator for the database. 30 | You can help by submitting new papers, and review paper submissions. 31 | Please let us know via this short 32 | Google Form 33 | if you are interested! 34 |

      35 | 36 | 37 | 38 |

      Contributors

      39 | 40 | 41 |
      42 |
      43 | 44 | 45 |

      Acknowledgements

      46 |

      This website was built on top of MiniConf project for 47 | a virtual conference in a box from Hendrik Strobelt and Sasha Rush. 48 | Citation relation data used for generating citation graphs are derived from 49 | the Semantic Scholar API. 50 | This work was supported by an NSF grant (CNS-2038897) and the Google Research Scholar Program. 51 |

      52 | 53 | 54 | 55 |

      Project Led By

      56 |
      57 |
      58 | 59 | Brown Visual Computing 61 | 62 |
      63 |
      64 | 65 | MIT Scene Representation Group 67 | 68 |
      69 |
      70 | 71 |
      72 | 73 | 163 | {% endblock %} 164 | -------------------------------------------------------------------------------- /templates/paper_detail.html: -------------------------------------------------------------------------------- 1 | {% set page_title = paper.title %} 2 | {% extends "base.html" %} 3 | 4 | 5 | {% block head %} 6 | 7 | {{ super() }} 8 | 9 | 10 | {% for author in paper.authors %} 11 | 12 | {% endfor %} 13 | 14 | 15 | 16 | {% for keyword in paper.keywords %} 17 | 18 | {% endfor %} 19 | 20 | 21 | 22 | 27 | {% endblock %} 28 | 29 | {% block content %} 30 | 31 | 32 |
      33 |
      34 |

      35 | {{paper.title}} 36 |

      37 |

      38 | {% for author in paper.authors %} 39 | {{author}}{{ "," if not loop.last }} 42 | {% endfor %} 43 |

      44 |

      45 | {{paper.date}} 46 |

      47 |
      49 |
      50 |

      51 | Keywords: 52 | {% for keyword in paper.keywords %} 53 | {{keyword}}{{ "," if not loop.last }} 56 | {% endfor %} 57 |

      58 | 59 | {% if paper.venue != "" and paper.year != "" %} 60 |

      61 | Venue: 62 | {{paper.venue}} {{paper.year}} 63 |

      64 | {% endif %} 65 | 66 |
      67 | 68 | Paper 69 | 70 | {% if paper.citation != "" %} 71 | 72 | Citation 73 | 74 | {% endif %} 75 | {% if ((paper.code_link == "Coming soon") or (paper.code_link == "coming soon") or (paper.code_link == "Coming soon...")) %} 76 | Code coming soon... 77 | {% elif paper.code_link != "" %} 78 | 79 | Code 80 | 81 | {% endif %} 82 | {% if (paper.data_link == "Coming soon") or (paper.data_link == "coming soon") or (paper.data_link == "Coming soon...") %} 83 | Data coming soon... 84 | {% elif paper.data_link != "" %} 85 | 86 | Data 87 | 88 | {% endif %} 89 |
      90 |
      91 | 92 |
      93 |
      94 |
      95 |
      96 | Bibtex: 97 | 98 | {{paper.citation}} 99 | 100 |
      101 |

      102 |
      103 |
      104 |
      105 |
      106 |
      107 |
      108 |

      Abstract

      109 | {{paper.abstract}} 110 |
      111 |
      112 |

      113 |
      114 |
      115 | 116 | 117 | {% if "youtube" in paper.talk_link %} 118 | {{ components.sectionTitleLink("Video", paper.talk_link) }} 119 |
      120 | 122 |
      123 | 124 | {% endif %} 125 | 126 | 127 | {% if paper.project_link != "" %} 128 | {{ components.sectionTitleLink("Project Webpage", paper.project_link) }} 129 |
      130 | 132 |
      133 | 134 | {% endif %} 135 | 136 | 137 | {{ components.sectionTitleCitationGraph("Citation Graph") }} 138 | 139 |
      142 |

      * Showing citation graph for papers within our database. Data retrieved from Semantic Scholar. For full citation graphs, visit ConnectedPapers.

      143 | 144 | 145 | 146 | 152 | 153 | {% endblock %} 154 | -------------------------------------------------------------------------------- /templates/papers.html: -------------------------------------------------------------------------------- 1 | {% set active_page = "Advanced Search" %} 2 | {% set page_title = "Advanced Search" %} 3 | 4 | {% extends "base.html" %} 5 | 6 | {% block head %} 7 | {{ super() }} 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 26 | {% endblock %} 27 | 28 | {% block tabs %} 29 | 45 | 46 | {% endblock %} 47 | 48 | {% block content %} 49 |
      50 | 51 | 52 | 53 |
      54 |
      55 | 57 | 61 |
      62 |
      63 | 67 |
      68 |
      69 | 70 | 71 |
      72 |
      73 | 74 |
      75 |
      76 | 79 |
      80 |
      81 | 84 |
      85 |
      86 | 96 |
      97 |
      98 |
      99 |
      100 | 104 | 109 | 113 |
      114 |
      115 |
      116 |
      117 | 118 |
      119 | 120 |
      124 |
      125 | 126 | 127 |
      128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 145 | 146 | {% endblock %} 147 | -------------------------------------------------------------------------------- /templates/papers_vague.html: -------------------------------------------------------------------------------- 1 | {% set page_title = "Papers" %} 2 | 3 | {% extends "base.html" %} 4 | 5 | {% block head %} 6 | {{ super() }} 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 26 | {% endblock %} 27 | 28 | 29 | {% block content %} 30 |
      31 | 32 | 33 | 34 |
      35 |
      36 | 38 | 42 |
      43 |
      44 | 50 |
      51 |
      52 | 53 |
      54 |
      55 | Advanced Search 56 |
      57 |
      58 | 68 |
      69 |
      70 |
      71 |
      72 | 76 | 81 | 85 |
      86 |
      87 |
      88 |
      89 | 90 |
      91 | 92 |
      96 |
      97 | 98 | 99 |
      100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 117 | 118 | {% endblock %} 119 | -------------------------------------------------------------------------------- /templates/papers_vis_citation_graph.html: -------------------------------------------------------------------------------- 1 | {% set active_page = "Advanced Search" %} 2 | {% set page_title = "Advanced Search" %} 3 | 4 | {% extends "base.html" %} 5 | 6 | {% block head %} 7 | {{ super() }} 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | {% endblock %} 20 | 21 | {% block tabs %} 22 | 36 | {% endblock %} 37 | 38 | {% block content %} 39 |
      40 | 41 | 42 | 43 |
      44 |
      45 | 47 | 51 |
      52 |
      53 | 57 |
      58 |
      59 | 60 | 61 |
      62 |
      63 | 64 |
      65 |
      66 | 69 |
      70 |
      71 | 75 |
      76 |
      77 | 78 | 79 | 80 |
      81 | 82 |
      84 | Double click on a node to open its corresponding paper page. 85 | 86 |
      87 | 88 |
      89 |
      92 |
      93 |
      94 |
      0%
      95 |
      96 |
      97 |
      98 |
      99 |
      100 |
      101 | 102 | 103 |

      * Not showing citation relations with papers outside of our current database. 104 |

      105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 126 | 127 | {% endblock %} 128 | -------------------------------------------------------------------------------- /templates/papers_vis_statistics.html: -------------------------------------------------------------------------------- 1 | {% set active_page = "Advanced Search" %} 2 | {% set page_title = "Advanced Search" %} 3 | 4 | {% extends "base.html" %} 5 | 6 | {% block head %} 7 | {{ super() }} 8 | 9 | 10 | 11 | 12 | {% endblock %} 13 | 14 | {% block tabs %} 15 | 29 | {% endblock %} 30 | 31 | {% block content %} 32 | 33 | {{ components.sectionTitlePlain("Keywords Statistics") }} 34 |
      35 | 36 | 37 |
      38 | Click on bars to search for keyword. 39 |
      40 | 41 | 42 | 45 | {% endblock %} 46 | -------------------------------------------------------------------------------- /templates/papers_vis_timeline.html: -------------------------------------------------------------------------------- 1 | {% set active_page = "Advanced Search" %} 2 | {% set page_title = "Advanced Search" %} 3 | 4 | {% extends "base.html" %} 5 | 6 | {% block head %} 7 | {{ super() }} 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | {% endblock %} 21 | 22 | {% block tabs %} 23 | 37 | 38 | {% endblock %} 39 | 40 | {% block content %} 41 |
      42 | 43 | 44 | 45 |
      46 |
      47 | 49 | 53 |
      54 |
      55 | 59 |
      60 |
      61 | 62 | 63 |
      64 |
      65 | 66 |
      67 |
      68 | 71 |
      72 |
      73 | 76 |
      77 |
      78 | 79 | 80 | 81 |
      82 | 83 |
      85 |
      86 | 87 |
      88 |
      89 | Scroll to zoom in / zoom out;   Drag to browse through the timeline; 90 |
      91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 110 | 111 | {% endblock %} 112 | -------------------------------------------------------------------------------- /update.sh: -------------------------------------------------------------------------------- 1 | # auto deployment script running on server 2 | -------------------------------------------------------------------------------- /web-update.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | # Adding papers to the website: 4 | 5 | ### First, copy the new entries (lines) from google sheets to csv file 6 | 7 | ```bash 8 | export GH_TOKEN=: 9 | export GH_REF=github.com/brownvc/neural-fields-review 10 | python scripts/run_api.py 11 | python scripts/spreadsheet_check_error.py 12 | mv temp/checked.csv sitedata/papers.csv 13 | rm sitedata/*.Zone.Identifier 14 | git add -A 15 | git commit -m "routine" 16 | git push 17 | make deploy 18 | ``` 19 | 20 | If the above method does not work, try this: 21 | ```bash 22 | export GH_REF=github.com/brownvc/neural-fields-review 23 | python scripts/run_api.py 24 | python scripts/spreadsheet_check_error.py 25 | mv temp/checked.csv sitedata/papers.csv 26 | rm sitedata/*.Zone.Identifier 27 | git add -A 28 | git commit -m "routine" 29 | git push 30 | make deploy-2 31 | 32 | ``` 33 | --------------------------------------------------------------------------------