├── .github
└── workflows
│ ├── Compile-with-PyInstaller.yml
│ └── docker-publish.yml
├── .gitignore
├── .idea
├── .gitignore
├── inspectionProfiles
│ └── profiles_settings.xml
├── jyy_slide_web.iml
├── misc.xml
├── modules.xml
└── vcs.xml
├── Dockerfile
├── LICENSE.txt
├── README.md
├── db.sqlite3
├── docker-compose.yml
├── jyy_slide_web.spec
├── jyy_slide_web
├── __init__.py
├── asgi.py
├── settings.py
├── urls.py
└── wsgi.py
├── manage.py
├── requirements.txt
├── run_daphne.py
├── slideapp
├── __init__.py
├── admin.py
├── apps.py
├── consumers.py
├── default_content.md
├── migrations
│ ├── 0001_initial.py
│ ├── 0002_slide_lock.py
│ └── __init__.py
├── models.py
├── routing.py
├── src
│ ├── __init__.py
│ ├── backup
│ │ ├── rouv
│ │ │ ├── ruoshui255.html
│ │ │ └── ruoshui255.md.py
│ │ └── template
│ │ │ ├── authortemp.html
│ │ │ └── basetemp.html
│ ├── converter.py
│ ├── settings.py
│ ├── static
│ │ ├── css
│ │ │ ├── base.css
│ │ │ ├── fonts.css
│ │ │ └── tailwind.min.css
│ │ ├── fonts
│ │ │ ├── Lato
│ │ │ │ ├── S6u8w4BMUTPHjxsAUi-qNiXg7eU0.woff2
│ │ │ │ ├── S6u8w4BMUTPHjxsAXC-qNiXg7Q.woff2
│ │ │ │ ├── S6u9w4BMUTPHh6UVSwaPGQ3q5d0N7w.woff2
│ │ │ │ ├── S6u9w4BMUTPHh6UVSwiPGQ3q5d0.woff2
│ │ │ │ ├── S6u_w4BMUTPHjxsI5wq_FQftx9897sxZ.woff2
│ │ │ │ ├── S6u_w4BMUTPHjxsI5wq_Gwftx9897g.woff2
│ │ │ │ ├── S6uyw4BMUTPHjx4wXiWtFCc.woff2
│ │ │ │ └── S6uyw4BMUTPHjxAwXiWtFCfQ7A.woff2
│ │ │ ├── News_Cycle
│ │ │ │ ├── CSR54z1Qlv-GDxkbKVQ_dFsvWNReuc4nG2o.woff2
│ │ │ │ ├── CSR54z1Qlv-GDxkbKVQ_dFsvWNpeuc4nG2qQKg.woff2
│ │ │ │ ├── CSR64z1Qlv-GDxkbKVQ_fO4KTfl8tOQdEg.woff2
│ │ │ │ ├── CSR64z1Qlv-GDxkbKVQ_fOAKTfl8tOQ.woff2
│ │ │ │ ├── NewsCycle-Bold.ttf
│ │ │ │ ├── NewsCycle-Regular.ttf
│ │ │ │ └── OFL.txt
│ │ │ └── inconsolata
│ │ │ │ ├── QldgNThLqRwH-OJ1UHjlKENVzkWGVkL3GZQmAwLYxYWI2qfdm7Lpp4U8WR32kXWdycuJDA.woff
│ │ │ │ ├── QldgNThLqRwH-OJ1UHjlKENVzkWGVkL3GZQmAwLYxYWI2qfdm7Lpp4U8WRL2kXWdycuJDETf.woff
│ │ │ │ ├── QldgNThLqRwH-OJ1UHjlKENVzkWGVkL3GZQmAwLYxYWI2qfdm7Lpp4U8WRP2kXWdycuJDETf.woff
│ │ │ │ ├── S6uyw4BMUTPHjx4wXiWtFCc (1).woff2
│ │ │ │ ├── S6uyw4BMUTPHjxAwXiWtFCfQ7A (1).woff2
│ │ │ │ ├── neIQzD-0qpwxpaWvjeD0X88SAOeauXA-oAGIyY0Wfw.woff2
│ │ │ │ ├── neIQzD-0qpwxpaWvjeD0X88SAOeauXQ-oAGIyY0.woff2
│ │ │ │ ├── neIQzD-0qpwxpaWvjeD0X88SAOeauXc-oAGIyY0Wfw.woff2
│ │ │ │ ├── neIQzD-0qpwxpaWvjeD0X88SAOeauXk-oAGIyY0Wfw.woff2
│ │ │ │ ├── neIQzD-0qpwxpaWvjeD0X88SAOeauXo-oAGIyY0Wfw.woff2
│ │ │ │ └── neIQzD-0qpwxpaWvjeD0X88SAOeauXs-oAGIyY0Wfw.woff2
│ │ ├── img
│ │ │ └── favicon.png
│ │ ├── js
│ │ │ └── jquery-3.7.1.min.js
│ │ ├── jyy
│ │ │ └── jyy.css
│ │ ├── katex
│ │ │ ├── auto-render.min.js
│ │ │ ├── fonts
│ │ │ │ ├── KaTeX_Main-Regular.ttf
│ │ │ │ ├── KaTeX_Main-Regular.woff
│ │ │ │ ├── KaTeX_Main-Regular.woff2
│ │ │ │ ├── KaTeX_Math-Italic.ttf
│ │ │ │ ├── KaTeX_Math-Italic.woff
│ │ │ │ └── KaTeX_Math-Italic.woff2
│ │ │ ├── katex.min.css
│ │ │ └── katex.min.js
│ │ └── reveal
│ │ │ ├── reveal.css
│ │ │ ├── reveal.js
│ │ │ └── theme
│ │ │ └── simple.css
│ └── util
│ │ ├── __init__.py
│ │ ├── file_util.py
│ │ ├── md_util.py
│ │ ├── net_util.py
│ │ └── str_util.py
├── templates
│ ├── edit_slide.html
│ ├── index.html
│ ├── login.html
│ ├── public_edit_slide.html
│ └── public_slides.html
├── tests.py
├── urls.py
└── views.py
└── staticfiles
├── admin
├── css
│ ├── autocomplete.css
│ ├── base.css
│ ├── changelists.css
│ ├── dark_mode.css
│ ├── dashboard.css
│ ├── forms.css
│ ├── login.css
│ ├── nav_sidebar.css
│ ├── responsive.css
│ ├── responsive_rtl.css
│ ├── rtl.css
│ ├── unusable_password_field.css
│ ├── vendor
│ │ └── select2
│ │ │ ├── LICENSE-SELECT2.md
│ │ │ ├── select2.css
│ │ │ └── select2.min.css
│ └── widgets.css
├── img
│ ├── LICENSE
│ ├── README.txt
│ ├── calendar-icons.svg
│ ├── gis
│ │ ├── move_vertex_off.svg
│ │ └── move_vertex_on.svg
│ ├── icon-addlink.svg
│ ├── icon-alert.svg
│ ├── icon-calendar.svg
│ ├── icon-changelink.svg
│ ├── icon-clock.svg
│ ├── icon-deletelink.svg
│ ├── icon-hidelink.svg
│ ├── icon-no.svg
│ ├── icon-unknown-alt.svg
│ ├── icon-unknown.svg
│ ├── icon-viewlink.svg
│ ├── icon-yes.svg
│ ├── inline-delete.svg
│ ├── search.svg
│ ├── selector-icons.svg
│ ├── sorting-icons.svg
│ ├── tooltag-add.svg
│ └── tooltag-arrowright.svg
└── js
│ ├── SelectBox.js
│ ├── SelectFilter2.js
│ ├── actions.js
│ ├── admin
│ ├── DateTimeShortcuts.js
│ └── RelatedObjectLookups.js
│ ├── autocomplete.js
│ ├── calendar.js
│ ├── cancel.js
│ ├── change_form.js
│ ├── core.js
│ ├── filters.js
│ ├── inlines.js
│ ├── jquery.init.js
│ ├── nav_sidebar.js
│ ├── popup_response.js
│ ├── prepopulate.js
│ ├── prepopulate_init.js
│ ├── theme.js
│ ├── unusable_password_field.js
│ ├── urlify.js
│ └── vendor
│ ├── jquery
│ ├── LICENSE.txt
│ ├── jquery.js
│ └── jquery.min.js
│ ├── select2
│ ├── LICENSE.md
│ ├── i18n
│ │ ├── af.js
│ │ ├── ar.js
│ │ ├── az.js
│ │ ├── bg.js
│ │ ├── bn.js
│ │ ├── bs.js
│ │ ├── ca.js
│ │ ├── cs.js
│ │ ├── da.js
│ │ ├── de.js
│ │ ├── dsb.js
│ │ ├── el.js
│ │ ├── en.js
│ │ ├── es.js
│ │ ├── et.js
│ │ ├── eu.js
│ │ ├── fa.js
│ │ ├── fi.js
│ │ ├── fr.js
│ │ ├── gl.js
│ │ ├── he.js
│ │ ├── hi.js
│ │ ├── hr.js
│ │ ├── hsb.js
│ │ ├── hu.js
│ │ ├── hy.js
│ │ ├── id.js
│ │ ├── is.js
│ │ ├── it.js
│ │ ├── ja.js
│ │ ├── ka.js
│ │ ├── km.js
│ │ ├── ko.js
│ │ ├── lt.js
│ │ ├── lv.js
│ │ ├── mk.js
│ │ ├── ms.js
│ │ ├── nb.js
│ │ ├── ne.js
│ │ ├── nl.js
│ │ ├── pl.js
│ │ ├── ps.js
│ │ ├── pt-BR.js
│ │ ├── pt.js
│ │ ├── ro.js
│ │ ├── ru.js
│ │ ├── sk.js
│ │ ├── sl.js
│ │ ├── sq.js
│ │ ├── sr-Cyrl.js
│ │ ├── sr.js
│ │ ├── sv.js
│ │ ├── th.js
│ │ ├── tk.js
│ │ ├── tr.js
│ │ ├── uk.js
│ │ ├── vi.js
│ │ ├── zh-CN.js
│ │ └── zh-TW.js
│ ├── select2.full.js
│ └── select2.full.min.js
│ └── xregexp
│ ├── LICENSE.txt
│ ├── xregexp.js
│ └── xregexp.min.js
├── css
├── base.css
└── tailwind.min.css
├── img
├── GitHub-Mark.png
├── auto-save.png
├── auto-title.jpg
├── auto-upload-img.gif
├── favicon.avif
├── fufu.avif
├── fufu.jpg
├── index.png
├── jyySlideWeb.png
├── public-mode.png
├── realtime-converter.gif
├── realtime-preview.gif
├── slide-lock.png
├── yuyupub_analyze1.png
└── yuyupub_analyze2.png
├── jyy
└── jyy.css
├── katex
├── auto-render.min.js
├── fonts
│ ├── KaTeX_Main-Regular.ttf
│ ├── KaTeX_Main-Regular.woff
│ ├── KaTeX_Main-Regular.woff2
│ ├── KaTeX_Math-Italic.ttf
│ ├── KaTeX_Math-Italic.woff
│ └── KaTeX_Math-Italic.woff2
├── katex.min.css
└── katex.min.js
└── reveal
├── reveal.css
├── reveal.js
└── theme
└── simple.css
/.github/workflows/Compile-with-PyInstaller.yml:
--------------------------------------------------------------------------------
1 | name: Build with PyInstaller
2 |
3 | on:
4 | release:
5 | types: [created]
6 |
7 | jobs:
8 | build:
9 | runs-on: windows-latest
10 | steps:
11 | - name: Checkout code
12 | uses: actions/checkout@v2
13 |
14 | - name: Set PYTHONIOENCODING
15 | run: |
16 | $env:PYTHONIOENCODING = 'utf-8'
17 |
18 | - name: Set up Python
19 | uses: actions/setup-python@v2
20 | with:
21 | python-version: '3.11'
22 |
23 | - name: Install dependencies
24 | run: |
25 | python -m pip install --upgrade pip
26 | pip install -r requirements.txt
27 |
28 | - name: Compile with PyInstaller
29 | run: |
30 | pip install pyinstaller
31 | pyinstaller jyy_slide_web.spec
32 |
33 | - name: Compress output folder
34 | run: |
35 | Compress-Archive -Path './dist/jyy_slide_web/*' -DestinationPath './dist/jyy_slide_web.zip'
36 |
37 | - name: Upload zip to release
38 | uses: actions/upload-release-asset@v1
39 | env:
40 | GITHUB_TOKEN: ${{ secrets.PERSONAL_ACCESS_TOKEN }}
41 | with:
42 | upload_url: ${{ github.event.release.upload_url }}
43 | asset_path: ./dist/jyy_slide_web.zip
44 | asset_name: jyy_slide_web.zip
45 | asset_content_type: application/zip
--------------------------------------------------------------------------------
/.github/workflows/docker-publish.yml:
--------------------------------------------------------------------------------
1 | name: Docker Image CI
2 |
3 | on:
4 | release:
5 | types: [published] # 仅在发布新版本时触发
6 |
7 | jobs:
8 | build:
9 | runs-on: ubuntu-latest
10 |
11 | steps:
12 | # 检出项目代码
13 | - name: Checkout repository
14 | uses: actions/checkout@v2
15 |
16 | # 设置Docker Hub凭据(需要提前在GitHub中设置Secrets)
17 | - name: Log in to Docker Hub
18 | uses: docker/login-action@v2
19 | with:
20 | username: ${{ secrets.DOCKER_HUB_USERNAME }}
21 | password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }}
22 |
23 | # 设置 Docker Buildx
24 | - name: Set up Docker Buildx
25 | uses: docker/setup-buildx-action@v2
26 |
27 | # 创建一个支持多平台构建的 Buildx 实例
28 | - name: Create builder
29 | run: |
30 | docker buildx create --name multiarch-builder --use
31 | docker buildx inspect --bootstrap
32 |
33 | # 构建并推送多架构Docker镜像
34 | - name: Build and push multi-arch backend service image
35 | uses: docker/build-push-action@v2
36 | with:
37 | context: ./ # 你的Django项目的根目录
38 | file: ./Dockerfile # Dockerfile的路径
39 | tags: ${{ secrets.DOCKER_HUB_USERNAME }}/jyy_slide_web:latest,${{ secrets.DOCKER_HUB_USERNAME }}/jyy_slide_web:${{ github.event.release.tag_name }}
40 | platforms: linux/amd64,linux/arm64
41 | push: true
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | /media/
2 |
--------------------------------------------------------------------------------
/.idea/.gitignore:
--------------------------------------------------------------------------------
1 | # Default ignored files
2 | /shelf/
3 | /workspace.xml
4 | # Editor-based HTTP Client requests
5 | /httpRequests/
6 | # Datasource local storage ignored files
7 | /dataSources/
8 | /dataSources.local.xml
9 |
--------------------------------------------------------------------------------
/.idea/inspectionProfiles/profiles_settings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/.idea/jyy_slide_web.iml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
27 |
28 |
--------------------------------------------------------------------------------
/.idea/misc.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/.idea/modules.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/.idea/vcs.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/Dockerfile:
--------------------------------------------------------------------------------
1 | # 使用官方Python镜像作为基础镜像
2 | FROM python:3.11-slim
3 |
4 | # 设置工作目录
5 | WORKDIR /app
6 |
7 | # 将requirements.txt复制到容器中
8 | COPY requirements.txt .
9 |
10 | # 安装Python依赖
11 | RUN pip install --no-cache-dir -r requirements.txt
12 |
13 | # 将项目文件复制到容器中
14 | COPY . .
15 |
16 | # 暴露应用的端口
17 | EXPOSE 10001
18 |
19 | # 启动Daphne
20 | CMD ["daphne", "-b", "0.0.0.0", "-p", "10001", "jyy_slide_web.asgi:application"]
--------------------------------------------------------------------------------
/db.sqlite3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xieyumc/jyySlideWeb/8e7653ac0e97e5910750dd9780c6e9dab25b0a2f/db.sqlite3
--------------------------------------------------------------------------------
/docker-compose.yml:
--------------------------------------------------------------------------------
1 | services:
2 | jyy_slide_web:
3 | image: mona233/jyy_slide_web:latest
4 | container_name: jyy_slide_web
5 | ports:
6 | - "10001:10001"
7 | volumes:
8 | - ./media:/app/media
9 | - ./db.sqlite3:/app/db.sqlite3
10 | restart: always
11 | environment:
12 | - CSRF_TRUSTED_ORIGINS=https://localhost,https://yourdomain.com # 定义CSRF信任域
13 |
14 | watchtower:
15 | image: containrrr/watchtower
16 | container_name: watchtower_jyy_slide_web
17 | volumes:
18 | - /var/run/docker.sock:/var/run/docker.sock
19 | restart: always
20 | environment:
21 | - WATCHTOWER_CLEANUP=true
--------------------------------------------------------------------------------
/jyy_slide_web.spec:
--------------------------------------------------------------------------------
1 | # -*- mode: python ; coding: utf-8 -*-
2 |
3 | import os
4 | from PyInstaller.utils.hooks import collect_submodules
5 |
6 | block_cipher = None
7 |
8 | # 项目根目录
9 | project_root = os.path.abspath(os.getcwd())
10 |
11 | # 收集模块的所有子模块
12 | hiddenimports = (
13 | collect_submodules('django') +
14 | collect_submodules('channels') +
15 | collect_submodules('daphne') +
16 | collect_submodules('jyy_slide_web') +
17 | collect_submodules('slideapp') +
18 | collect_submodules('whitenoise')
19 | )
20 |
21 | # 手动指定数据文件
22 | datas = []
23 |
24 | def add_data_dir(source_rel_path, target_rel_path):
25 | source_abs_path = os.path.join(project_root, source_rel_path)
26 | if os.path.exists(source_abs_path):
27 | datas.append((source_abs_path, target_rel_path))
28 | else:
29 | print(f"Warning: Directory '{source_abs_path}' does not exist, skipped.")
30 |
31 | # 添加需要的资源目录
32 | add_data_dir('slideapp/templates', 'slideapp/templates')
33 | add_data_dir('slideapp/src/static', 'slideapp/src/static')
34 | add_data_dir('slideapp/src/backup/template', 'slideapp/src/backup/template')
35 | add_data_dir('jyy_slide_web', 'jyy_slide_web')
36 |
37 | # 添加收集后的静态文件目录
38 | add_data_dir('staticfiles', 'staticfiles')
39 |
40 | # 添加媒体文件目录
41 | add_data_dir('media', 'media')
42 |
43 | # 添加 default_content.md 文件
44 | default_content_path = os.path.join('slideapp', 'default_content.md')
45 | if os.path.exists(default_content_path):
46 | datas.append((default_content_path, 'slideapp'))
47 | else:
48 | print(f"Warning: File '{default_content_path}' does not exist, skipped.")
49 |
50 | # 如果使用 SQLite 数据库,确保数据库文件不被打包,以免覆盖用户数据
51 | db_file = os.path.join(project_root, 'db.sqlite3')
52 | if os.path.exists(db_file):
53 | datas.append((db_file, '.'))
54 | else:
55 | print(f"Warning: Database file '{db_file}' does not exist, skipped.")
56 |
57 | # 创建打包分析对象
58 | a = Analysis(
59 | ['run_daphne.py'], # 主入口文件
60 | pathex=[project_root], # 搜索路径
61 | binaries=[], # 需要额外的二进制文件
62 | datas=datas, # 数据文件
63 | hiddenimports=hiddenimports, # 隐藏导入
64 | hookspath=[], # 自定义hook路径
65 | runtime_hooks=[], # 运行时hook
66 | excludes=[], # 排除的模块
67 | cipher=block_cipher, # 加密方法
68 | noarchive=False # 是否生成单文件
69 | )
70 |
71 | # 创建 PyInstaller 打包步骤
72 | pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher)
73 |
74 | # 可执行文件的配置
75 | exe = EXE(
76 | pyz,
77 | a.scripts,
78 | [],
79 | exclude_binaries=True,
80 | name='jyy_slide_web', # 可执行文件名称
81 | debug=False,
82 | strip=False,
83 | upx=True,
84 | console=True # 是否显示控制台窗口
85 | )
86 |
87 | # 打包成一个文件夹
88 | coll = COLLECT(
89 | exe,
90 | a.binaries,
91 | a.zipfiles,
92 | a.datas,
93 | strip=False,
94 | upx=True,
95 | name='jyy_slide_web' # 输出文件夹名称
96 | )
--------------------------------------------------------------------------------
/jyy_slide_web/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xieyumc/jyySlideWeb/8e7653ac0e97e5910750dd9780c6e9dab25b0a2f/jyy_slide_web/__init__.py
--------------------------------------------------------------------------------
/jyy_slide_web/asgi.py:
--------------------------------------------------------------------------------
1 | # jyy_slide_web/asgi.py
2 |
3 | import os
4 | import django
5 | from channels.routing import ProtocolTypeRouter, URLRouter
6 | from channels.auth import AuthMiddlewareStack
7 |
8 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'jyy_slide_web.settings')
9 | django.setup()
10 |
11 | from slideapp.routing import websocket_urlpatterns
12 | from django.core.asgi import get_asgi_application
13 |
14 | application = ProtocolTypeRouter({
15 | 'http': get_asgi_application(),
16 | 'websocket': AuthMiddlewareStack(
17 | URLRouter(
18 | websocket_urlpatterns
19 | )
20 | ),
21 | })
--------------------------------------------------------------------------------
/jyy_slide_web/settings.py:
--------------------------------------------------------------------------------
1 | """
2 | Django settings for jyy_slide_web project.
3 |
4 | Generated by 'django-admin startproject' using Django 5.1.
5 |
6 | For more information on this file, see
7 | https://docs.djangoproject.com/en/5.1/topics/settings/
8 |
9 | For the full list of settings and their values, see
10 | https://docs.djangoproject.com/en/5.1/ref/settings/
11 | """
12 |
13 | from pathlib import Path
14 | import os
15 |
16 | # Build paths inside the project like this: BASE_DIR / 'subdir'.
17 | BASE_DIR = Path(__file__).resolve().parent.parent
18 |
19 | # Quick-start development settings - unsuitable for production
20 | # See https://docs.djangoproject.com/en/5.1/howto/deployment/checklist/
21 |
22 | # SECURITY WARNING: keep the secret key used in production secret!
23 | SECRET_KEY = "django-insecure-bxd)3tz&y6oo_jq5r^92qyqbg^hx=#m(#i+n#@&cih86qmh8k1"
24 |
25 | # SECURITY WARNING: don't run with debug turned on in production!
26 | DEBUG = True
27 | ALLOWED_HOSTS = ['*']
28 | CSRF_TRUSTED_ORIGINS = os.environ.get('CSRF_TRUSTED_ORIGINS', 'https://localhost').split(',')
29 |
30 | # Application definition
31 |
32 | INSTALLED_APPS = [
33 | 'channels',
34 | 'slideapp',
35 | "django.contrib.admin",
36 | "django.contrib.auth",
37 | "django.contrib.contenttypes",
38 | "django.contrib.sessions",
39 | "django.contrib.messages",
40 | "django.contrib.staticfiles",
41 | ]
42 | ASGI_APPLICATION = 'jyy_slide_web.asgi.application'
43 |
44 | MIDDLEWARE = [
45 | "django.middleware.security.SecurityMiddleware",
46 | "django.contrib.sessions.middleware.SessionMiddleware",
47 | "django.middleware.common.CommonMiddleware",
48 | "django.middleware.csrf.CsrfViewMiddleware",
49 | "django.contrib.auth.middleware.AuthenticationMiddleware",
50 | "django.contrib.messages.middleware.MessageMiddleware",
51 | "django.middleware.clickjacking.XFrameOptionsMiddleware",
52 | 'whitenoise.middleware.WhiteNoiseMiddleware',
53 |
54 | ]
55 |
56 | ROOT_URLCONF = "jyy_slide_web.urls"
57 |
58 | TEMPLATES = [
59 | {
60 | "BACKEND": "django.template.backends.django.DjangoTemplates",
61 | "DIRS": [],
62 | "APP_DIRS": True,
63 | "OPTIONS": {
64 | "context_processors": [
65 | "django.template.context_processors.debug",
66 | "django.template.context_processors.request",
67 | "django.contrib.auth.context_processors.auth",
68 | "django.contrib.messages.context_processors.messages",
69 | ],
70 | },
71 | },
72 | ]
73 |
74 | WSGI_APPLICATION = "jyy_slide_web.wsgi.application"
75 |
76 | # Database
77 | # https://docs.djangoproject.com/en/5.1/ref/settings/#databases
78 |
79 | DATABASES = {
80 | "default": {
81 | "ENGINE": "django.db.backends.sqlite3",
82 | "NAME": BASE_DIR / "db.sqlite3",
83 | }
84 | }
85 |
86 | # Password validation
87 | # https://docs.djangoproject.com/en/5.1/ref/settings/#auth-password-validators
88 |
89 | AUTH_PASSWORD_VALIDATORS = [
90 | {
91 | "NAME": "django.contrib.auth.password_validation.UserAttributeSimilarityValidator",
92 | },
93 | {
94 | "NAME": "django.contrib.auth.password_validation.MinimumLengthValidator",
95 | },
96 | {
97 | "NAME": "django.contrib.auth.password_validation.CommonPasswordValidator",
98 | },
99 | {
100 | "NAME": "django.contrib.auth.password_validation.NumericPasswordValidator",
101 | },
102 | ]
103 |
104 | # Internationalization
105 | # https://docs.djangoproject.com/en/5.1/topics/i18n/
106 |
107 | LANGUAGE_CODE = "en-us"
108 |
109 | TIME_ZONE = 'Asia/Shanghai'
110 |
111 | USE_I18N = True
112 |
113 | USE_TZ = True
114 |
115 | # Static files (CSS, JavaScript, Images)
116 | # https://docs.djangoproject.com/en/5.1/howto/static-files/
117 | BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
118 |
119 | STATIC_URL = '/static/'
120 |
121 | # 指定静态文件目录
122 | STATICFILES_DIRS = [
123 | os.path.join(BASE_DIR, 'slideapp' ,'src','static'),
124 | # 如果有其他静态文件目录,继续添加
125 | ]
126 |
127 | # 指定静态文件的根目录,用于 collectstatic
128 | STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
129 |
130 | # 启用 WhiteNoise 的压缩和缓存功能(可选)
131 | STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'
132 |
133 | MEDIA_URL = '/media/'
134 | MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
135 | # Default primary key field type
136 | # https://docs.djangoproject.com/en/5.1/ref/settings/#default-auto-field
137 |
138 | DEFAULT_AUTO_FIELD = "django.db.models.BigAutoField"
139 |
140 | LOGIN_URL = 'login'
141 | LOGIN_REDIRECT_URL = 'index' # 登录后重定向的 URL
--------------------------------------------------------------------------------
/jyy_slide_web/urls.py:
--------------------------------------------------------------------------------
1 | """
2 | URL configuration for jyy_slide_web project.
3 |
4 | The `urlpatterns` list routes URLs to views. For more information please see:
5 | https://docs.djangoproject.com/en/5.1/topics/http/urls/
6 | Examples:
7 | Function views
8 | 1. Add an import: from my_app import views
9 | 2. Add a URL to urlpatterns: path('', views.home, name='home')
10 | Class-based views
11 | 1. Add an import: from other_app.views import Home
12 | 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
13 | Including another URLconf
14 | 1. Import the include() function: from django.urls import include, path
15 | 2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
16 | """
17 |
18 | from django.contrib import admin
19 | from django.urls import path, include
20 | from django.conf import settings
21 | from django.conf.urls.static import static
22 |
23 | urlpatterns = [
24 | path('', include('slideapp.urls')),
25 | path('admin/', admin.site.urls),
26 | ]
27 |
28 | if settings.DEBUG:
29 | urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
--------------------------------------------------------------------------------
/jyy_slide_web/wsgi.py:
--------------------------------------------------------------------------------
1 | """
2 | WSGI config for jyy_slide_web project.
3 |
4 | It exposes the WSGI callable as a module-level variable named ``application``.
5 |
6 | For more information on this file, see
7 | https://docs.djangoproject.com/en/5.1/howto/deployment/wsgi/
8 | """
9 |
10 | import os
11 |
12 | from django.core.wsgi import get_wsgi_application
13 |
14 | os.environ.setdefault("DJANGO_SETTINGS_MODULE", "jyy_slide_web.settings")
15 |
16 | application = get_wsgi_application()
17 |
--------------------------------------------------------------------------------
/manage.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 | """Django's command-line utility for administrative tasks."""
3 | import os
4 | import sys
5 |
6 |
7 | def main():
8 | """Run administrative tasks."""
9 | os.environ.setdefault("DJANGO_SETTINGS_MODULE", "jyy_slide_web.settings")
10 | try:
11 | from django.core.management import execute_from_command_line
12 | except ImportError as exc:
13 | raise ImportError(
14 | "Couldn't import Django. Are you sure it's installed and "
15 | "available on your PYTHONPATH environment variable? Did you "
16 | "forget to activate a virtual environment?"
17 | ) from exc
18 | execute_from_command_line(sys.argv)
19 |
20 |
21 | if __name__ == "__main__":
22 | main()
23 |
--------------------------------------------------------------------------------
/requirements.txt:
--------------------------------------------------------------------------------
1 | jinja2
2 | lxml
3 | markdown
4 | pygments
5 | pyquery
6 | pyyaml
7 | requests
8 | types-markdown
9 | types-pyyaml
10 | types-requests
11 | whitenoise
12 | django
13 | channels
14 | daphne
15 | twisted[http2,tls]
16 | psycopg2-binary
--------------------------------------------------------------------------------
/run_daphne.py:
--------------------------------------------------------------------------------
1 | import os
2 | import threading
3 | import webbrowser
4 | from daphne.cli import CommandLineInterface
5 |
6 | def open_browser():
7 | import time
8 | # 等待服务器启动
9 | time.sleep(5)
10 | # 打开浏览器访问指定的 URL
11 | webbrowser.open('http://localhost:10001')
12 |
13 | if __name__ == '__main__':
14 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'jyy_slide_web.settings')
15 |
16 | # 启动线程来打开浏览器
17 | threading.Thread(target=open_browser).start()
18 |
19 | # 运行 Daphne 服务器
20 | CommandLineInterface().run(['-b', '0.0.0.0', '-p', '10001', 'jyy_slide_web.asgi:application'])
--------------------------------------------------------------------------------
/slideapp/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xieyumc/jyySlideWeb/8e7653ac0e97e5910750dd9780c6e9dab25b0a2f/slideapp/__init__.py
--------------------------------------------------------------------------------
/slideapp/admin.py:
--------------------------------------------------------------------------------
1 | from django.contrib import admin
2 |
3 | # Register your models here.
4 |
5 | from .models import Slide
6 |
7 |
8 | class SlideAdmin(admin.ModelAdmin):
9 | list_display = ('title', 'created_at', 'updated_at')
10 |
11 | admin.site.register(Slide, SlideAdmin)
--------------------------------------------------------------------------------
/slideapp/apps.py:
--------------------------------------------------------------------------------
1 | from django.apps import AppConfig
2 |
3 |
4 | class SlideappConfig(AppConfig):
5 | default_auto_field = 'django.db.models.BigAutoField'
6 | name = 'slideapp'
7 |
--------------------------------------------------------------------------------
/slideapp/default_content.md:
--------------------------------------------------------------------------------
1 | # 新建幻灯片
2 |
3 |
4 | >[作者]()
5 |
6 |
7 |
8 | ---
9 | # 主题一
10 | ----
11 | ## 子主题一
12 |
13 | ----
14 | ## 子主题二
15 |
16 |
17 |
18 |
19 |
20 | ---
21 |
22 | # 主题二
23 | ----
24 | ## 子主题一
25 |
26 | ----
27 | ## 子主题二
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
49 |
50 |
53 |
54 |
57 |
58 |
61 |
62 |
69 |
70 |
--------------------------------------------------------------------------------
/slideapp/migrations/0001_initial.py:
--------------------------------------------------------------------------------
1 | # Generated by Django 5.1 on 2024-09-29 08:11
2 |
3 | from django.db import migrations, models
4 |
5 |
6 | class Migration(migrations.Migration):
7 |
8 | initial = True
9 |
10 | dependencies = [
11 | ]
12 |
13 | operations = [
14 | migrations.CreateModel(
15 | name='Slide',
16 | fields=[
17 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
18 | ('title', models.CharField(default='未命名', max_length=200)),
19 | ('content', models.TextField(blank=True)),
20 | ('created_at', models.DateTimeField(auto_now_add=True)),
21 | ('updated_at', models.DateTimeField(auto_now=True)),
22 | ],
23 | ),
24 | ]
25 |
--------------------------------------------------------------------------------
/slideapp/migrations/0002_slide_lock.py:
--------------------------------------------------------------------------------
1 | # Generated by Django 5.1 on 2024-09-30 02:34
2 |
3 | from django.db import migrations, models
4 |
5 |
6 | class Migration(migrations.Migration):
7 |
8 | dependencies = [
9 | ('slideapp', '0001_initial'),
10 | ]
11 |
12 | operations = [
13 | migrations.AddField(
14 | model_name='slide',
15 | name='lock',
16 | field=models.BooleanField(default=True),
17 | ),
18 | ]
19 |
--------------------------------------------------------------------------------
/slideapp/migrations/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xieyumc/jyySlideWeb/8e7653ac0e97e5910750dd9780c6e9dab25b0a2f/slideapp/migrations/__init__.py
--------------------------------------------------------------------------------
/slideapp/models.py:
--------------------------------------------------------------------------------
1 | # slideapp/models.py
2 |
3 | from django.db import models
4 | from django.contrib.auth.models import User
5 |
6 | class Slide(models.Model):
7 | title = models.CharField(max_length=200, default='未命名')
8 | content = models.TextField(blank=True)
9 | created_at = models.DateTimeField(auto_now_add=True)
10 | updated_at = models.DateTimeField(auto_now=True)
11 | lock = models.BooleanField(default=True)
12 |
--------------------------------------------------------------------------------
/slideapp/routing.py:
--------------------------------------------------------------------------------
1 | # slideapp/routing.py
2 |
3 | from django.urls import re_path
4 | from . import consumers
5 |
6 | websocket_urlpatterns = [
7 | re_path(r'ws/slide/(?P\d+)/$', consumers.SlideConsumer.as_asgi()),
8 | re_path(r'ws/public_slide/(?P\d+)/$', consumers.PublicSlideConsumer.as_asgi()),
9 | ]
--------------------------------------------------------------------------------
/slideapp/src/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xieyumc/jyySlideWeb/8e7653ac0e97e5910750dd9780c6e9dab25b0a2f/slideapp/src/__init__.py
--------------------------------------------------------------------------------
/slideapp/src/backup/template/authortemp.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
10 |
11 |
12 | {% for department in departments %}
13 |
21 | {% endfor %}
22 |
23 |
24 |
25 |
--------------------------------------------------------------------------------
/slideapp/src/backup/template/basetemp.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
8 |
9 |
10 |
11 |
12 | {{ title }}
13 |
14 |
15 |
24 |
26 |
27 |
28 |
31 |
32 | {# #}
33 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 | {{ body }}
61 |
62 |
63 |
64 |
65 |
66 |
82 |
83 |
84 |
--------------------------------------------------------------------------------
/slideapp/src/settings.py:
--------------------------------------------------------------------------------
1 | import os
2 |
3 | from jinja2 import Template
4 |
5 | settings_abspath = os.path.split(os.path.realpath(__file__))[0]
6 | projects_abspath = os.path.abspath(os.path.join(settings_abspath, ".."))
7 |
8 | static_path = os.path.join(projects_abspath, "src", "static")
9 | backup_path = os.path.join(projects_abspath, "src", "backup")
10 | template_from = os.path.join(backup_path, "template", "basetemp.html")
11 | authortemp_from = os.path.join(backup_path, "template", "authortemp.html")
12 |
13 | op_first_section = "\n---\n"
14 | op_second_section = "\n----\n"
15 | op_animate_section = "\n++++\n"
16 | op_index_fragment = "\n--\n"
17 | op_front_matter = "\n+++++\n"
18 |
19 | # 文件信息
20 | filename = str()
21 | filepath = str()
22 | output_foldname = "dist"
23 | output_filename = "index.html"
24 | output_foldpath = str()
25 | output_filepath = str()
26 | static_foldpath = str()
27 | images_foldname = "img" # 如果要修改还要修炼static下的img文件名,template中icon的文件路径
28 | images_foldpath = str()
29 |
30 | content = str() # MD内容
31 |
32 | template: str | Template = str() # HTML内容
33 | title = str()
34 | body = str()
35 |
36 | # 作者信息相关
37 | author_template: str | Template = str()
38 |
39 |
40 | def Init(target_filepath):
41 | global filename, filepath, output_foldname, output_filename, output_foldpath, output_filepath, static_foldpath, images_foldpath
42 | filename = os.path.basename(target_filepath)
43 | filepath = os.path.abspath(target_filepath)
44 | output_foldpath = os.path.join(filepath.split(filename)[0], output_foldname)
45 | output_filepath = os.path.join(output_foldpath, output_filename)
46 |
47 | static_foldpath = os.path.join(output_foldpath, "static")
48 | images_foldpath = os.path.join(static_foldpath, images_foldname)
49 |
--------------------------------------------------------------------------------
/slideapp/src/static/css/base.css:
--------------------------------------------------------------------------------
1 | .watermark {
2 | position: fixed;
3 | opacity: 0.1;
4 | font-size: 128px;
5 | width: 100%;
6 | text-align: center;
7 | z-index: 1000;
8 | pointer-events: none;
9 | }
10 |
11 | .reveal .katex {
12 | font-size: 100%;
13 | }
14 |
15 | red { color: red; }
16 | green { color: green; }
17 | blue { color: blue; }
18 |
19 | .codehilite .hll { background-color: #ffffcc }
20 | .codehilite .c { color: #408080; font-style: italic } /* Comment */
21 | .codehilite .err { border: 1px solid #FF0000 } /* Error */
22 | .codehilite .k { color: #008000; font-weight: bold } /* Keyword */
23 | .codehilite .o { color: #666666 } /* Operator */
24 | .codehilite .ch { color: #408080; font-style: italic } /* Comment.Hashbang */
25 | .codehilite .cm { color: #408080; font-style: italic } /* Comment.Multiline */
26 | .codehilite .cp { color: #BC7A00 } /* Comment.Preproc */
27 | .codehilite .cpf { color: #408080; font-style: italic } /* Comment.PreprocFile */
28 | .codehilite .c1 { color: #408080; font-style: italic } /* Comment.Single */
29 | .codehilite .cs { color: #408080; font-style: italic } /* Comment.Special */
30 | .codehilite .gd { color: #A00000 } /* Generic.Deleted */
31 | .codehilite .ge { font-style: italic } /* Generic.Emph */
32 | .codehilite .gr { color: #FF0000 } /* Generic.Error */
33 | .codehilite .gh { color: #000080; font-weight: bold } /* Generic.Heading */
34 | .codehilite .gi { color: #00A000 } /* Generic.Inserted */
35 | .codehilite .go { color: #888888 } /* Generic.Output */
36 | .codehilite .gp { color: #000080; font-weight: bold } /* Generic.Prompt */
37 | .codehilite .gs { font-weight: bold } /* Generic.Strong */
38 | .codehilite .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
39 | .codehilite .gt { color: #0044DD } /* Generic.Traceback */
40 | .codehilite .kc { color: #008000; font-weight: bold } /* Keyword.Constant */
41 | .codehilite .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */
42 | .codehilite .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */
43 | .codehilite .kp { color: #008000 } /* Keyword.Pseudo */
44 | .codehilite .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */
45 | .codehilite .kt { color: #B00040 } /* Keyword.Type */
46 | .codehilite .m { color: #666666 } /* Literal.Number */
47 | .codehilite .s { color: #BA2121 } /* Literal.String */
48 | .codehilite .na { color: #7D9029 } /* Name.Attribute */
49 | .codehilite .nb { color: #008000 } /* Name.Builtin */
50 | .codehilite .nc { color: #0000FF; font-weight: bold } /* Name.Class */
51 | .codehilite .no { color: #880000 } /* Name.Constant */
52 | .codehilite .nd { color: #AA22FF } /* Name.Decorator */
53 | .codehilite .ni { color: #999999; font-weight: bold } /* Name.Entity */
54 | .codehilite .ne { color: #D2413A; font-weight: bold } /* Name.Exception */
55 | .codehilite .nf { color: #0000FF } /* Name.Function */
56 | .codehilite .nl { color: #A0A000 } /* Name.Label */
57 | .codehilite .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */
58 | .codehilite .nt { color: #008000; font-weight: bold } /* Name.Tag */
59 | .codehilite .nv { color: #19177C } /* Name.Variable */
60 | .codehilite .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */
61 | .codehilite .w { color: #bbbbbb } /* Text.Whitespace */
62 | .codehilite .mb { color: #666666 } /* Literal.Number.Bin */
63 | .codehilite .mf { color: #666666 } /* Literal.Number.Float */
64 | .codehilite .mh { color: #666666 } /* Literal.Number.Hex */
65 | .codehilite .mi { color: #666666 } /* Literal.Number.Integer */
66 | .codehilite .mo { color: #666666 } /* Literal.Number.Oct */
67 | .codehilite .sa { color: #BA2121 } /* Literal.String.Affix */
68 | .codehilite .sb { color: #BA2121 } /* Literal.String.Backtick */
69 | .codehilite .sc { color: #BA2121 } /* Literal.String.Char */
70 | .codehilite .dl { color: #BA2121 } /* Literal.String.Delimiter */
71 | .codehilite .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */
72 | .codehilite .s2 { color: #BA2121 } /* Literal.String.Double */
73 | .codehilite .se { color: #BB6622; font-weight: bold } /* Literal.String.Escape */
74 | .codehilite .sh { color: #BA2121 } /* Literal.String.Heredoc */
75 | .codehilite .si { color: #BB6688; font-weight: bold } /* Literal.String.Interpol */
76 | .codehilite .sx { color: #008000 } /* Literal.String.Other */
77 | .codehilite .sr { color: #BB6688 } /* Literal.String.Regex */
78 | .codehilite .s1 { color: #BA2121 } /* Literal.String.Single */
79 | .codehilite .ss { color: #19177C } /* Literal.String.Symbol */
80 | .codehilite .bp { color: #008000 } /* Name.Builtin.Pseudo */
81 | .codehilite .fm { color: #0000FF } /* Name.Function.Magic */
82 | .codehilite .vc { color: #19177C } /* Name.Variable.Class */
83 | .codehilite .vg { color: #19177C } /* Name.Variable.Global */
84 | .codehilite .vi { color: #19177C } /* Name.Variable.Instance */
85 | .codehilite .vm { color: #19177C } /* Name.Variable.Magic */
86 | .codehilite .il { color: #666666 } /* Literal.Number.Integer.Long */
87 |
--------------------------------------------------------------------------------
/slideapp/src/static/css/fonts.css:
--------------------------------------------------------------------------------
1 | /* vietnamese */
2 | @font-face {
3 | font-family: 'Inconsolata';
4 | font-style: normal;
5 | font-weight: 400;
6 | font-stretch: 100%;
7 | src: url('../fonts/inconsolata/QldgNThLqRwH-OJ1UHjlKENVzkWGVkL3GZQmAwLYxYWI2qfdm7Lpp4U8WRL2kXWdycuJDETf.woff') format('woff');
8 | unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
9 | }
10 | /* latin-ext */
11 | @font-face {
12 | font-family: 'Inconsolata';
13 | font-style: normal;
14 | font-weight: 400;
15 | font-stretch: 100%;
16 | src: url('../fonts/inconsolata/QldgNThLqRwH-OJ1UHjlKENVzkWGVkL3GZQmAwLYxYWI2qfdm7Lpp4U8WRP2kXWdycuJDETf.woff') format('woff');
17 | unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
18 | }
19 | /* latin */
20 | @font-face {
21 | font-family: 'Inconsolata';
22 | font-style: normal;
23 | font-weight: 400;
24 | font-stretch: 100%;
25 | src: url('../fonts/inconsolata/QldgNThLqRwH-OJ1UHjlKENVzkWGVkL3GZQmAwLYxYWI2qfdm7Lpp4U8WR32kXWdycuJDA.woff') format('woff');
26 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
27 | }
28 | /* latin-ext */
29 | @font-face {
30 | font-family: 'Lato';
31 | font-style: normal;
32 | font-weight: 400;
33 | src: url('../fonts/inconsolata/S6uyw4BMUTPHjxAwXiWtFCfQ7A (1).woff2') format('woff2');
34 | unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
35 | }
36 | /* latin */
37 | @font-face {
38 | font-family: 'Lato';
39 | font-style: normal;
40 | font-weight: 400;
41 | src: url('../fonts/inconsolata/S6uyw4BMUTPHjx4wXiWtFCc (1).woff2') format('woff2');
42 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
43 | }
44 | /* cyrillic-ext */
45 | @font-face {
46 | font-family: 'Source Serif Pro';
47 | font-style: normal;
48 | font-weight: 400;
49 | src: url('../fonts/inconsolata/neIQzD-0qpwxpaWvjeD0X88SAOeauXk-oAGIyY0Wfw.woff2') format('woff2');
50 | unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
51 | }
52 | /* cyrillic */
53 | @font-face {
54 | font-family: 'Source Serif Pro';
55 | font-style: normal;
56 | font-weight: 400;
57 | src: url('../fonts/inconsolata/neIQzD-0qpwxpaWvjeD0X88SAOeauXA-oAGIyY0Wfw.woff2') format('woff2');
58 | unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
59 | }
60 | /* greek */
61 | @font-face {
62 | font-family: 'Source Serif Pro';
63 | font-style: normal;
64 | font-weight: 400;
65 | src: url('../fonts/inconsolata/neIQzD-0qpwxpaWvjeD0X88SAOeauXc-oAGIyY0Wfw.woff2') format('woff2');
66 | unicode-range: U+0370-0377, U+037A-037F, U+0384-038A, U+038C, U+038E-03A1, U+03A3-03FF;
67 | }
68 | /* vietnamese */
69 | @font-face {
70 | font-family: 'Source Serif Pro';
71 | font-style: normal;
72 | font-weight: 400;
73 | src: url('../fonts/inconsolata/neIQzD-0qpwxpaWvjeD0X88SAOeauXs-oAGIyY0Wfw.woff2') format('woff2');
74 | unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+0300-0301, U+0303-0304, U+0308-0309, U+0323, U+0329, U+1EA0-1EF9, U+20AB;
75 | }
76 | /* latin-ext */
77 | @font-face {
78 | font-family: 'Source Serif Pro';
79 | font-style: normal;
80 | font-weight: 400;
81 | src: url('../fonts/inconsolata/neIQzD-0qpwxpaWvjeD0X88SAOeauXo-oAGIyY0Wfw.woff2') format('woff2');
82 | unicode-range: U+0100-02AF, U+0304, U+0308, U+0329, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
83 | }
84 | /* latin */
85 | @font-face {
86 | font-family: 'Source Serif Pro';
87 | font-style: normal;
88 | font-weight: 400;
89 | src: url('../fonts/inconsolata/neIQzD-0qpwxpaWvjeD0X88SAOeauXQ-oAGIyY0.woff2') format('woff2');
90 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
91 | }
--------------------------------------------------------------------------------
/slideapp/src/static/fonts/Lato/S6u8w4BMUTPHjxsAUi-qNiXg7eU0.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xieyumc/jyySlideWeb/8e7653ac0e97e5910750dd9780c6e9dab25b0a2f/slideapp/src/static/fonts/Lato/S6u8w4BMUTPHjxsAUi-qNiXg7eU0.woff2
--------------------------------------------------------------------------------
/slideapp/src/static/fonts/Lato/S6u8w4BMUTPHjxsAXC-qNiXg7Q.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xieyumc/jyySlideWeb/8e7653ac0e97e5910750dd9780c6e9dab25b0a2f/slideapp/src/static/fonts/Lato/S6u8w4BMUTPHjxsAXC-qNiXg7Q.woff2
--------------------------------------------------------------------------------
/slideapp/src/static/fonts/Lato/S6u9w4BMUTPHh6UVSwaPGQ3q5d0N7w.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xieyumc/jyySlideWeb/8e7653ac0e97e5910750dd9780c6e9dab25b0a2f/slideapp/src/static/fonts/Lato/S6u9w4BMUTPHh6UVSwaPGQ3q5d0N7w.woff2
--------------------------------------------------------------------------------
/slideapp/src/static/fonts/Lato/S6u9w4BMUTPHh6UVSwiPGQ3q5d0.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xieyumc/jyySlideWeb/8e7653ac0e97e5910750dd9780c6e9dab25b0a2f/slideapp/src/static/fonts/Lato/S6u9w4BMUTPHh6UVSwiPGQ3q5d0.woff2
--------------------------------------------------------------------------------
/slideapp/src/static/fonts/Lato/S6u_w4BMUTPHjxsI5wq_FQftx9897sxZ.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xieyumc/jyySlideWeb/8e7653ac0e97e5910750dd9780c6e9dab25b0a2f/slideapp/src/static/fonts/Lato/S6u_w4BMUTPHjxsI5wq_FQftx9897sxZ.woff2
--------------------------------------------------------------------------------
/slideapp/src/static/fonts/Lato/S6u_w4BMUTPHjxsI5wq_Gwftx9897g.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xieyumc/jyySlideWeb/8e7653ac0e97e5910750dd9780c6e9dab25b0a2f/slideapp/src/static/fonts/Lato/S6u_w4BMUTPHjxsI5wq_Gwftx9897g.woff2
--------------------------------------------------------------------------------
/slideapp/src/static/fonts/Lato/S6uyw4BMUTPHjx4wXiWtFCc.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xieyumc/jyySlideWeb/8e7653ac0e97e5910750dd9780c6e9dab25b0a2f/slideapp/src/static/fonts/Lato/S6uyw4BMUTPHjx4wXiWtFCc.woff2
--------------------------------------------------------------------------------
/slideapp/src/static/fonts/Lato/S6uyw4BMUTPHjxAwXiWtFCfQ7A.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xieyumc/jyySlideWeb/8e7653ac0e97e5910750dd9780c6e9dab25b0a2f/slideapp/src/static/fonts/Lato/S6uyw4BMUTPHjxAwXiWtFCfQ7A.woff2
--------------------------------------------------------------------------------
/slideapp/src/static/fonts/News_Cycle/CSR54z1Qlv-GDxkbKVQ_dFsvWNReuc4nG2o.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xieyumc/jyySlideWeb/8e7653ac0e97e5910750dd9780c6e9dab25b0a2f/slideapp/src/static/fonts/News_Cycle/CSR54z1Qlv-GDxkbKVQ_dFsvWNReuc4nG2o.woff2
--------------------------------------------------------------------------------
/slideapp/src/static/fonts/News_Cycle/CSR54z1Qlv-GDxkbKVQ_dFsvWNpeuc4nG2qQKg.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xieyumc/jyySlideWeb/8e7653ac0e97e5910750dd9780c6e9dab25b0a2f/slideapp/src/static/fonts/News_Cycle/CSR54z1Qlv-GDxkbKVQ_dFsvWNpeuc4nG2qQKg.woff2
--------------------------------------------------------------------------------
/slideapp/src/static/fonts/News_Cycle/CSR64z1Qlv-GDxkbKVQ_fO4KTfl8tOQdEg.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xieyumc/jyySlideWeb/8e7653ac0e97e5910750dd9780c6e9dab25b0a2f/slideapp/src/static/fonts/News_Cycle/CSR64z1Qlv-GDxkbKVQ_fO4KTfl8tOQdEg.woff2
--------------------------------------------------------------------------------
/slideapp/src/static/fonts/News_Cycle/CSR64z1Qlv-GDxkbKVQ_fOAKTfl8tOQ.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xieyumc/jyySlideWeb/8e7653ac0e97e5910750dd9780c6e9dab25b0a2f/slideapp/src/static/fonts/News_Cycle/CSR64z1Qlv-GDxkbKVQ_fOAKTfl8tOQ.woff2
--------------------------------------------------------------------------------
/slideapp/src/static/fonts/News_Cycle/NewsCycle-Bold.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xieyumc/jyySlideWeb/8e7653ac0e97e5910750dd9780c6e9dab25b0a2f/slideapp/src/static/fonts/News_Cycle/NewsCycle-Bold.ttf
--------------------------------------------------------------------------------
/slideapp/src/static/fonts/News_Cycle/NewsCycle-Regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xieyumc/jyySlideWeb/8e7653ac0e97e5910750dd9780c6e9dab25b0a2f/slideapp/src/static/fonts/News_Cycle/NewsCycle-Regular.ttf
--------------------------------------------------------------------------------
/slideapp/src/static/fonts/News_Cycle/OFL.txt:
--------------------------------------------------------------------------------
1 | Copyright (c) 2010-2011, Nathan Willis (nwillis@glyphography.com), with Reserved Font Name "News Cycle."
2 |
3 | This Font Software is licensed under the SIL Open Font License, Version 1.1.
4 | This license is copied below, and is also available with a FAQ at:
5 | https://openfontlicense.org
6 |
7 |
8 | -----------------------------------------------------------
9 | SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
10 | -----------------------------------------------------------
11 |
12 | PREAMBLE
13 | The goals of the Open Font License (OFL) are to stimulate worldwide
14 | development of collaborative font projects, to support the font creation
15 | efforts of academic and linguistic communities, and to provide a free and
16 | open framework in which fonts may be shared and improved in partnership
17 | with others.
18 |
19 | The OFL allows the licensed fonts to be used, studied, modified and
20 | redistributed freely as long as they are not sold by themselves. The
21 | fonts, including any derivative works, can be bundled, embedded,
22 | redistributed and/or sold with any software provided that any reserved
23 | names are not used by derivative works. The fonts and derivatives,
24 | however, cannot be released under any other type of license. The
25 | requirement for fonts to remain under this license does not apply
26 | to any document created using the fonts or their derivatives.
27 |
28 | DEFINITIONS
29 | "Font Software" refers to the set of files released by the Copyright
30 | Holder(s) under this license and clearly marked as such. This may
31 | include source files, build scripts and documentation.
32 |
33 | "Reserved Font Name" refers to any names specified as such after the
34 | copyright statement(s).
35 |
36 | "Original Version" refers to the collection of Font Software components as
37 | distributed by the Copyright Holder(s).
38 |
39 | "Modified Version" refers to any derivative made by adding to, deleting,
40 | or substituting -- in part or in whole -- any of the components of the
41 | Original Version, by changing formats or by porting the Font Software to a
42 | new environment.
43 |
44 | "Author" refers to any designer, engineer, programmer, technical
45 | writer or other person who contributed to the Font Software.
46 |
47 | PERMISSION & CONDITIONS
48 | Permission is hereby granted, free of charge, to any person obtaining
49 | a copy of the Font Software, to use, study, copy, merge, embed, modify,
50 | redistribute, and sell modified and unmodified copies of the Font
51 | Software, subject to the following conditions:
52 |
53 | 1) Neither the Font Software nor any of its individual components,
54 | in Original or Modified Versions, may be sold by itself.
55 |
56 | 2) Original or Modified Versions of the Font Software may be bundled,
57 | redistributed and/or sold with any software, provided that each copy
58 | contains the above copyright notice and this license. These can be
59 | included either as stand-alone text files, human-readable headers or
60 | in the appropriate machine-readable metadata fields within text or
61 | binary files as long as those fields can be easily viewed by the user.
62 |
63 | 3) No Modified Version of the Font Software may use the Reserved Font
64 | Name(s) unless explicit written permission is granted by the corresponding
65 | Copyright Holder. This restriction only applies to the primary font name as
66 | presented to the users.
67 |
68 | 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
69 | Software shall not be used to promote, endorse or advertise any
70 | Modified Version, except to acknowledge the contribution(s) of the
71 | Copyright Holder(s) and the Author(s) or with their explicit written
72 | permission.
73 |
74 | 5) The Font Software, modified or unmodified, in part or in whole,
75 | must be distributed entirely under this license, and must not be
76 | distributed under any other license. The requirement for fonts to
77 | remain under this license does not apply to any document created
78 | using the Font Software.
79 |
80 | TERMINATION
81 | This license becomes null and void if any of the above conditions are
82 | not met.
83 |
84 | DISCLAIMER
85 | THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
86 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
87 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
88 | OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
89 | COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
90 | INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
91 | DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
92 | FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
93 | OTHER DEALINGS IN THE FONT SOFTWARE.
94 |
--------------------------------------------------------------------------------
/slideapp/src/static/fonts/inconsolata/QldgNThLqRwH-OJ1UHjlKENVzkWGVkL3GZQmAwLYxYWI2qfdm7Lpp4U8WR32kXWdycuJDA.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xieyumc/jyySlideWeb/8e7653ac0e97e5910750dd9780c6e9dab25b0a2f/slideapp/src/static/fonts/inconsolata/QldgNThLqRwH-OJ1UHjlKENVzkWGVkL3GZQmAwLYxYWI2qfdm7Lpp4U8WR32kXWdycuJDA.woff
--------------------------------------------------------------------------------
/slideapp/src/static/fonts/inconsolata/QldgNThLqRwH-OJ1UHjlKENVzkWGVkL3GZQmAwLYxYWI2qfdm7Lpp4U8WRL2kXWdycuJDETf.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xieyumc/jyySlideWeb/8e7653ac0e97e5910750dd9780c6e9dab25b0a2f/slideapp/src/static/fonts/inconsolata/QldgNThLqRwH-OJ1UHjlKENVzkWGVkL3GZQmAwLYxYWI2qfdm7Lpp4U8WRL2kXWdycuJDETf.woff
--------------------------------------------------------------------------------
/slideapp/src/static/fonts/inconsolata/QldgNThLqRwH-OJ1UHjlKENVzkWGVkL3GZQmAwLYxYWI2qfdm7Lpp4U8WRP2kXWdycuJDETf.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xieyumc/jyySlideWeb/8e7653ac0e97e5910750dd9780c6e9dab25b0a2f/slideapp/src/static/fonts/inconsolata/QldgNThLqRwH-OJ1UHjlKENVzkWGVkL3GZQmAwLYxYWI2qfdm7Lpp4U8WRP2kXWdycuJDETf.woff
--------------------------------------------------------------------------------
/slideapp/src/static/fonts/inconsolata/S6uyw4BMUTPHjx4wXiWtFCc (1).woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xieyumc/jyySlideWeb/8e7653ac0e97e5910750dd9780c6e9dab25b0a2f/slideapp/src/static/fonts/inconsolata/S6uyw4BMUTPHjx4wXiWtFCc (1).woff2
--------------------------------------------------------------------------------
/slideapp/src/static/fonts/inconsolata/S6uyw4BMUTPHjxAwXiWtFCfQ7A (1).woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xieyumc/jyySlideWeb/8e7653ac0e97e5910750dd9780c6e9dab25b0a2f/slideapp/src/static/fonts/inconsolata/S6uyw4BMUTPHjxAwXiWtFCfQ7A (1).woff2
--------------------------------------------------------------------------------
/slideapp/src/static/fonts/inconsolata/neIQzD-0qpwxpaWvjeD0X88SAOeauXA-oAGIyY0Wfw.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xieyumc/jyySlideWeb/8e7653ac0e97e5910750dd9780c6e9dab25b0a2f/slideapp/src/static/fonts/inconsolata/neIQzD-0qpwxpaWvjeD0X88SAOeauXA-oAGIyY0Wfw.woff2
--------------------------------------------------------------------------------
/slideapp/src/static/fonts/inconsolata/neIQzD-0qpwxpaWvjeD0X88SAOeauXQ-oAGIyY0.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xieyumc/jyySlideWeb/8e7653ac0e97e5910750dd9780c6e9dab25b0a2f/slideapp/src/static/fonts/inconsolata/neIQzD-0qpwxpaWvjeD0X88SAOeauXQ-oAGIyY0.woff2
--------------------------------------------------------------------------------
/slideapp/src/static/fonts/inconsolata/neIQzD-0qpwxpaWvjeD0X88SAOeauXc-oAGIyY0Wfw.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xieyumc/jyySlideWeb/8e7653ac0e97e5910750dd9780c6e9dab25b0a2f/slideapp/src/static/fonts/inconsolata/neIQzD-0qpwxpaWvjeD0X88SAOeauXc-oAGIyY0Wfw.woff2
--------------------------------------------------------------------------------
/slideapp/src/static/fonts/inconsolata/neIQzD-0qpwxpaWvjeD0X88SAOeauXk-oAGIyY0Wfw.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xieyumc/jyySlideWeb/8e7653ac0e97e5910750dd9780c6e9dab25b0a2f/slideapp/src/static/fonts/inconsolata/neIQzD-0qpwxpaWvjeD0X88SAOeauXk-oAGIyY0Wfw.woff2
--------------------------------------------------------------------------------
/slideapp/src/static/fonts/inconsolata/neIQzD-0qpwxpaWvjeD0X88SAOeauXo-oAGIyY0Wfw.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xieyumc/jyySlideWeb/8e7653ac0e97e5910750dd9780c6e9dab25b0a2f/slideapp/src/static/fonts/inconsolata/neIQzD-0qpwxpaWvjeD0X88SAOeauXo-oAGIyY0Wfw.woff2
--------------------------------------------------------------------------------
/slideapp/src/static/fonts/inconsolata/neIQzD-0qpwxpaWvjeD0X88SAOeauXs-oAGIyY0Wfw.woff2:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xieyumc/jyySlideWeb/8e7653ac0e97e5910750dd9780c6e9dab25b0a2f/slideapp/src/static/fonts/inconsolata/neIQzD-0qpwxpaWvjeD0X88SAOeauXs-oAGIyY0Wfw.woff2
--------------------------------------------------------------------------------
/slideapp/src/static/img/favicon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xieyumc/jyySlideWeb/8e7653ac0e97e5910750dd9780c6e9dab25b0a2f/slideapp/src/static/img/favicon.png
--------------------------------------------------------------------------------
/slideapp/src/static/jyy/jyy.css:
--------------------------------------------------------------------------------
1 | .reveal .slide-number {
2 | font-size: 26px;
3 | border-radius: 5px;
4 | background-color: rgba(0, 0, 0, .3);
5 | }
6 |
7 | .reveal .slides {
8 | border: 1.5px #ddd solid;
9 | border-radius: 7px;
10 | text-align: left;
11 | font-weight: 300;
12 | }
13 |
14 | .reveal h1,
15 | .reveal h2,
16 | .reveal h3,
17 | .reveal h4 {
18 | font-family: 'Lato', 'SimHei', 'STXihei', 'Sans Serif';
19 | font-weight: 400;
20 | }
21 |
22 | .reveal p,
23 | .reveal li,
24 | .reveal center {
25 | font-size: 32px;
26 | font-family: 'Lato', 'STHeiti', 'SimHei', 'Sans Serif';
27 | }
28 |
29 | .reveal li+li {
30 | margin-top: 10px;
31 | }
32 |
33 | .reveal ul {
34 | display: block;
35 | margin-right: 15px;
36 | }
37 |
38 | .reveal p,
39 | .reveal h1,
40 | .reveal h2,
41 | .reveal h3,
42 | .reveal h4,
43 | .reveal h5 {
44 | padding: 0 25px 0 25px;
45 | }
46 |
47 | .reveal table {
48 | font-size: 32px;
49 | font-family: 'Lato', 'STHeiti', 'SimHei', 'Sans Serif';
50 | margin-top: 15px;
51 | margin-bottom: 15px;
52 | }
53 |
54 | .reveal th {
55 | background-color: #eee;
56 | }
57 |
58 | .reveal tr:nth-child(even) {
59 | background-color: #efffff;
60 | }
61 |
62 | .reveal h1,
63 | .reveal h2,
64 | .reveal h3,
65 | .reveal h4,
66 | .reveal h5,
67 | .reveal h6 {
68 | text-align: left;
69 | margin: 0 0 20px 0;
70 | color: #222;
71 | font-weight: 400;
72 | line-height: 1.2;
73 | letter-spacing: normal;
74 | }
75 |
76 | .reveal h1 {
77 | margin: 0 10 0 10;
78 | font-size: 60px;
79 | }
80 |
81 | .reveal .middle h1 {
82 | text-align: center;
83 | }
84 |
85 | .reveal h2 {
86 | font-size: 48px;
87 | border-bottom: 2px solid rgb(106, 0, 95);
88 | padding-bottom: 5px;
89 | }
90 |
91 | .reveal h3 {
92 | font-size: 1.15em;
93 | }
94 |
95 | .reveal h4 {
96 | font-size: 1.05em;
97 | }
98 |
99 | .reveal .center {
100 | text-align: center;
101 | }
102 |
103 | .reveal .middle {
104 | height: 728px;
105 | display: flex;
106 | align-items: center;
107 | width: 100%;
108 | }
109 |
110 | .reveal pre {
111 | font-size: 28px;
112 |
113 | background-color: #eee;
114 |
115 | border-radius: 3mm;
116 | padding: 10px 10px 10px 10px;
117 | }
118 |
119 | .reveal pre code {
120 | max-height: none;
121 | }
122 |
123 | .reveal code {
124 | font-family: 'Inconsolata', 'STKaiti', 'KaiTi', 'Sans Serif', Monospace;
125 | }
126 |
127 | .reveal .middle blockquote {
128 | text-align: center;
129 | color: rgb(106, 0, 95);
130 | background: none;
131 | box-shadow: none;
132 | }
133 |
134 | .reveal .middle blockquote a {
135 | color: inherit;
136 | }
137 |
138 | .reveal blockquote p,
139 | .reveal blockquote li {
140 | font-family: 'Lato', 'STKaiti', 'KaiTi', 'Sans Serif';
141 | }
142 |
143 | section .center {
144 | display: block;
145 | margin-left: auto;
146 | margin-right: auto;
147 | }
148 |
149 | .reveal .author-block {
150 | margin: 75px 0 35px 0;
151 | }
152 |
153 | .reveal .author-affiliation img {
154 | margin: 15px 0 0 0;
155 | }
156 |
157 | .reveal .author-block p,
158 | .reveal .author-affiliation p {
159 | font-family: 'Kaiti', 'STKaiti', 'Serif', 'Times', 'Times New Roman';
160 | margin-block-start: 0em;
161 | margin-block-end: 0em;
162 | }
163 |
164 | .reveal .author-affiliation {
165 | display: inline-block;
166 | font-size: 90%;
167 | }
168 |
169 | .reveal hr {
170 | border: 10px solid rgba(0, 0, 0, 0);
171 | }
172 |
173 | .reveal li {
174 | margin-top: 10px;
175 | }
--------------------------------------------------------------------------------
/slideapp/src/static/katex/auto-render.min.js:
--------------------------------------------------------------------------------
1 | !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("katex")):"function"==typeof define&&define.amd?define(["katex"],t):"object"==typeof exports?exports.renderMathInElement=t(require("katex")):e.renderMathInElement=t(e.katex)}("undefined"!=typeof self?self:this,(function(e){return function(){"use strict";var t={771:function(t){t.exports=e}},r={};function n(e){var i=r[e];if(void 0!==i)return i.exports;var a=r[e]={exports:{}};return t[e](a,a.exports,n),a.exports}n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,{a:t}),t},n.d=function(e,t){for(var r in t)n.o(t,r)&&!n.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)};var i={};return function(){n.d(i,{default:function(){return s}});var e=n(771),t=n.n(e),r=function(e,t,r){for(var n=r,i=0,a=e.length;n0&&(i.push({type:"text",data:e.slice(0,n)}),e=e.slice(n));var l=t.findIndex((function(t){return e.startsWith(t.left)}));if(-1===(n=r(t[l].right,e,t[l].left.length)))break;var d=e.slice(0,n+t[l].right.length),s=a.test(d)?d:e.slice(t[l].left.length,n);i.push({type:"math",data:s,rawData:d,display:t[l].display}),e=e.slice(n+t[l].right.length)}return""!==e&&i.push({type:"text",data:e}),i},l=function(e,r){var n=o(e,r.delimiters);if(1===n.length&&"text"===n[0].type)return null;for(var i=document.createDocumentFragment(),a=0;a list[str]:
9 | """返回目录folderpath下后缀名为suffix_name的所有文件的绝对路径列表"""
10 | return [
11 | os.path.abspath(os.path.join(dirpath, filename))
12 | for dirpath, dirnames, filenames in os.walk(folerpath)
13 | for filename in filenames
14 | if suffix_name is None or str(filename).endswith("." + suffix_name)
15 | ]
16 |
17 |
18 | def read(filepath: str) -> str: # 读取文本文件内容
19 | if os.path.exists(filepath) is False:
20 | raise Exception("The path {} is not exists".format(filepath))
21 | with open(filepath, "r", encoding="utf-8") as f:
22 | return str(f.read())
23 |
24 |
25 | def write(filepath: str, data: str) -> None: # 向文件(覆)写内容
26 | dirpath = os.path.dirname(filepath)
27 | if os.path.exists(dirpath) is False:
28 | os.makedirs(dirpath)
29 | with open(filepath, "w", encoding="utf-8") as f:
30 | f.write(data)
31 |
32 |
33 | def get_abspath(basefile: str, filepath: str) -> str: # 从绝对路径变化成相对路径且符合当前的操作系统
34 | return os.path.normpath(os.path.join(os.path.dirname(basefile), filepath))
35 |
36 |
37 | def get_image_to_target(
38 | link: str, from_filepath: str, target_foldpath: str
39 | ) -> Tuple[str, bool]:
40 | # 对于from_filepath(请使用其绝对地址)中的图床链接link, 它可能是url、绝对地址或相对地址, 我们会get它然后重命名并放到target_foldpath下, 并返回重命名后的名字
41 | # 这里对图片类型的判断是通过link的后缀名, 有些图片的url的末尾不是类型名, 就会有bug
42 | name = uuid.uuid4().hex + "." + link.split(".")[-1]
43 | if str_util.is_url(link):
44 | pass
45 | else:
46 | if os.path.isabs(link) is True:
47 | pass
48 | else:
49 | link = get_abspath(from_filepath, link)
50 | pass
51 |
52 | if str_util.is_url(link):
53 | net_util.down_image(link, os.path.join(target_foldpath, name))
54 | else:
55 | if os.path.exists(link) is False:
56 | print("The path is not exists: ", link)
57 | return "", True
58 | shutil.copyfile(link, os.path.join(target_foldpath, name))
59 |
60 | return name, False
61 |
--------------------------------------------------------------------------------
/slideapp/src/util/md_util.py:
--------------------------------------------------------------------------------
1 | import re
2 | from typing import List, Union
3 |
4 |
5 | def process_images(content, func):
6 | """处理Markdown类型字符串中的图片链接, 返回处理过图片链接部分的Markdown字符串
7 |
8 | Args:
9 | content (_type_): Markdown类型字符串
10 | func (_type_): 处理图片链接的函数, 该函数接受图片链接字符串, 返回一个(有关图片链接的新串, 是否有错误)的元组
11 | """
12 |
13 | def modify(match):
14 | # 下面是黑盒魔法
15 | tar = match.group()
16 | pre, mid, suf = str(), str(), str()
17 | if tar[-1] == ")":
18 | pre = tar[: tar.index("(") + 1]
19 | mid = tar[tar.index("(") + 1 : -1]
20 | suf = tar[-1]
21 | else:
22 | mid = re.search(r'src="([^"]*)"', tar).group(1)
23 | pre, suf = tar.split(mid)
24 |
25 | link = mid
26 | # 黑盒魔法结束
27 | new_name, err = func(link)
28 | return pre + (new_name if err is False else link) + suf
29 |
30 | patten = r"!\[.*?\]\((.*?)\)|"
31 | return re.sub(patten, modify, content)
32 |
33 |
34 | ###
35 |
36 | from markdown import markdown
37 | from markdown import Extension
38 | from markdown.blockprocessors import BlockProcessor
39 | import xml.etree.ElementTree as etree
40 |
41 |
42 | def md_to_html(md: str) -> str:
43 | class BoxBlockProcessor(BlockProcessor):
44 | first = True
45 |
46 | def run(self, parent, blocks):
47 | if self.first:
48 | self.first = False
49 | e = etree.SubElement(parent, "div")
50 | self.parser.parseBlocks(e, blocks)
51 | for _ in range(0, len(blocks)):
52 | blocks.pop(0)
53 | return True
54 | return False
55 |
56 | class BoxExtension(Extension):
57 | def extendMarkdown(self, md):
58 | md.parser.blockprocessors.register(BoxBlockProcessor(md.parser), "box", 175)
59 |
60 | extensions: List[Union[str, BoxExtension]] = [
61 | BoxExtension(),
62 | "meta",
63 | "fenced_code",
64 | "codehilite",
65 | "extra",
66 | "attr_list",
67 | "tables",
68 | "toc",
69 | ]
70 | return markdown(md, extensions=extensions)
71 |
--------------------------------------------------------------------------------
/slideapp/src/util/net_util.py:
--------------------------------------------------------------------------------
1 | import requests
2 |
3 |
4 | def down_image(img_url, save_file_path):
5 | resp = requests.get(img_url)
6 | with open(save_file_path, "wb") as f:
7 | f.write(resp.content)
8 |
--------------------------------------------------------------------------------
/slideapp/src/util/str_util.py:
--------------------------------------------------------------------------------
1 | from urllib.parse import urlparse
2 |
3 |
4 | # 分辨URL和路径: 判断一个字符串是否为URL
5 | def is_url(string):
6 | result = urlparse(string)
7 | return all([result.scheme, result.netloc])
8 |
9 |
10 | # 分辨URL和路径: 判断一个字符串是否为路径
11 | def is_path(string):
12 | result = urlparse(string)
13 | return not all([result.scheme, result.netloc])
14 |
--------------------------------------------------------------------------------
/slideapp/templates/login.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | Login
7 |
72 |
73 |
74 |
92 |
93 |
--------------------------------------------------------------------------------
/slideapp/templates/public_edit_slide.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | {{ slide.title }}
5 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 | {{ slide_html|safe }}
51 |
52 |
53 |
--------------------------------------------------------------------------------
/slideapp/templates/public_slides.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | Public Slides
7 |
60 |
61 |
62 |
63 |
64 |
65 | {% for slide in slides %}
66 |
67 | {{ slide.title }}
68 |
{{ slide.created_at|date:"Y-m-d H:i" }}
69 |
70 | {% endfor %}
71 |
72 |
73 |
--------------------------------------------------------------------------------
/slideapp/tests.py:
--------------------------------------------------------------------------------
1 | from django.test import TestCase
2 |
3 | # Create your tests here.
4 |
--------------------------------------------------------------------------------
/slideapp/urls.py:
--------------------------------------------------------------------------------
1 | # slideapp/urls.py
2 |
3 | from django.urls import path
4 | from . import views
5 | from django.contrib.auth import views as auth_views
6 |
7 | urlpatterns = [
8 | path('', views.index, name='index'),
9 | path('create/', views.create_slide, name='create_slide'),
10 | path('edit//', views.edit_slide, name='edit_slide'),
11 | path('upload_image/', views.upload_image, name='upload_image'),
12 | path('delete//', views.delete_slide, name='delete_slide'),
13 | path('login/', auth_views.LoginView.as_view(template_name='login.html'), name='login'),
14 | path('logout/', auth_views.LogoutView.as_view(next_page='login'), name='logout'),
15 | path('toggle_lock//', views.toggle_lock, name='toggle_lock'),
16 | path('public/', views.public_slides, name='public_slides'),
17 | path('public/edit//', views.public_edit_slide, name='public_edit_slide'),
18 |
19 | ]
--------------------------------------------------------------------------------
/slideapp/views.py:
--------------------------------------------------------------------------------
1 | from django.views.decorators.csrf import csrf_exempt
2 | from django.http import JsonResponse
3 | import os
4 | import uuid
5 | from django.conf import settings
6 | from django.shortcuts import render
7 | from django.http import JsonResponse
8 | import os
9 | import uuid
10 | from django.conf import settings
11 | from imghdr import what
12 |
13 | from django.shortcuts import render, redirect
14 | from .models import Slide
15 | from django.http import JsonResponse
16 | from django.shortcuts import render, redirect, get_object_or_404
17 | from django.contrib.auth.decorators import login_required
18 | from django.views.decorators.http import require_POST
19 |
20 | @login_required
21 | def upload_image(request):
22 | if request.method == 'POST':
23 | image = request.FILES.get('image')
24 | if image and image.content_type.startswith('image/'):
25 | # 生成唯一的文件名,防止冲突
26 | ext = os.path.splitext(image.name)[1]
27 | filename = uuid.uuid4().hex + ext
28 | filepath = os.path.join(settings.MEDIA_ROOT, 'uploads', filename)
29 |
30 | # 确保上传目录存在
31 | os.makedirs(os.path.dirname(filepath), exist_ok=True)
32 |
33 | # 保存文件
34 | with open(filepath, 'wb+') as destination:
35 | for chunk in image.chunks():
36 | destination.write(chunk)
37 |
38 | # 返回图片的访问 URL
39 | url = settings.MEDIA_URL + 'uploads/' + filename
40 | return JsonResponse({'url': url})
41 | else:
42 | return JsonResponse({'error': '无效的文件'}, status=400)
43 | else:
44 | return JsonResponse({'error': '不支持的请求方法'}, status=405)
45 |
46 |
47 |
48 |
49 |
50 | # slideapp/views.py
51 | @login_required
52 | def index(request):
53 | # 按照创建时间排序的幻灯片
54 | slides = Slide.objects.all().order_by('-created_at') # 按照创建时间降序排序
55 | return render(request, 'index.html', {'slides': slides})
56 |
57 | @login_required
58 | def create_slide(request):
59 | # 获取当前文件所在的目录
60 | current_dir = os.path.dirname(os.path.abspath(__file__))
61 | # 默认内容文件的路径
62 | default_content_path = os.path.join(current_dir, 'default_content.md')
63 |
64 | # 读取默认内容
65 | with open(default_content_path, 'r', encoding='utf-8') as f:
66 | default_content = f.read()
67 |
68 | # 创建新的幻灯片,并设置默认内容
69 | slide = Slide.objects.create(
70 | title='未命名',
71 | content=default_content,
72 | lock=True
73 | )
74 |
75 | return redirect('edit_slide', slide_id=slide.id)
76 |
77 | @login_required
78 | def edit_slide(request, slide_id):
79 | slide = Slide.objects.get(id=slide_id)
80 | return render(request, 'edit_slide.html', {'slide': slide})
81 |
82 | @login_required
83 | def delete_slide(request, slide_id):
84 | slide = get_object_or_404(Slide, id=slide_id)
85 | slide.delete()
86 | return JsonResponse({'status': 'success'})
87 |
88 | @login_required
89 | @require_POST
90 | def toggle_lock(request, slide_id):
91 | slide = get_object_or_404(Slide, id=slide_id)
92 | # 切换锁定状态
93 | slide.lock = not slide.lock
94 | slide.save()
95 | return JsonResponse({'status': 'success', 'lock': slide.lock})
96 |
97 |
98 | def public_slides(request):
99 | slides = Slide.objects.filter(lock=False).order_by('-created_at')
100 | return render(request, 'public_slides.html', {'slides': slides})
101 |
102 |
103 | from django.shortcuts import render, get_object_or_404
104 | from .models import Slide
105 | import tempfile
106 | import os
107 | from .src.converter import converter
108 | from django.conf import settings
109 | import traceback
110 |
111 |
112 | def public_edit_slide(request, slide_id):
113 | slide = get_object_or_404(Slide, id=slide_id, lock=False)
114 |
115 | # 转换Markdown为HTML
116 | slide_html = convert_markdown_to_html(slide.content)
117 |
118 | return render(request, 'public_edit_slide.html', {'slide': slide, 'slide_html': slide_html})
119 |
120 |
121 | def convert_markdown_to_html(markdown_content):
122 | try:
123 | with tempfile.TemporaryDirectory() as temp_dir:
124 | temp_md_file_path = os.path.join(temp_dir, 'temp.md')
125 | with open(temp_md_file_path, 'w', encoding='utf-8') as temp_md_file:
126 | temp_md_file.write(markdown_content)
127 |
128 | # 调用转换器
129 | converter(temp_md_file_path)
130 |
131 | output_html_path = os.path.join(temp_dir, 'dist', 'index.html')
132 | with open(output_html_path, 'r', encoding='utf-8') as html_file:
133 | html_content = html_file.read()
134 |
135 | html_content = html_content.replace('./static/', '/static/')
136 | html_content = html_content.replace('./img/', '/static/img/')
137 |
138 | return html_content
139 | except Exception as e:
140 | error_message = ''.join(traceback.format_exception_only(type(e), e))
141 | print(f"转换失败: {error_message}")
142 | return f"转换失败: {error_message}
"
--------------------------------------------------------------------------------
/staticfiles/admin/css/dark_mode.css:
--------------------------------------------------------------------------------
1 | @media (prefers-color-scheme: dark) {
2 | :root {
3 | --primary: #264b5d;
4 | --primary-fg: #f7f7f7;
5 |
6 | --body-fg: #eeeeee;
7 | --body-bg: #121212;
8 | --body-quiet-color: #d0d0d0;
9 | --body-medium-color: #e0e0e0;
10 | --body-loud-color: #ffffff;
11 |
12 | --breadcrumbs-link-fg: #e0e0e0;
13 | --breadcrumbs-bg: var(--primary);
14 |
15 | --link-fg: #81d4fa;
16 | --link-hover-color: #4ac1f7;
17 | --link-selected-fg: #6f94c6;
18 |
19 | --hairline-color: #272727;
20 | --border-color: #353535;
21 |
22 | --error-fg: #e35f5f;
23 | --message-success-bg: #006b1b;
24 | --message-warning-bg: #583305;
25 | --message-error-bg: #570808;
26 |
27 | --darkened-bg: #212121;
28 | --selected-bg: #1b1b1b;
29 | --selected-row: #00363a;
30 |
31 | --close-button-bg: #333333;
32 | --close-button-hover-bg: #666666;
33 |
34 | color-scheme: dark;
35 | }
36 | }
37 |
38 |
39 | html[data-theme="dark"] {
40 | --primary: #264b5d;
41 | --primary-fg: #f7f7f7;
42 |
43 | --body-fg: #eeeeee;
44 | --body-bg: #121212;
45 | --body-quiet-color: #d0d0d0;
46 | --body-medium-color: #e0e0e0;
47 | --body-loud-color: #ffffff;
48 |
49 | --breadcrumbs-link-fg: #e0e0e0;
50 | --breadcrumbs-bg: var(--primary);
51 |
52 | --link-fg: #81d4fa;
53 | --link-hover-color: #4ac1f7;
54 | --link-selected-fg: #6f94c6;
55 |
56 | --hairline-color: #272727;
57 | --border-color: #353535;
58 |
59 | --error-fg: #e35f5f;
60 | --message-success-bg: #006b1b;
61 | --message-warning-bg: #583305;
62 | --message-error-bg: #570808;
63 |
64 | --darkened-bg: #212121;
65 | --selected-bg: #1b1b1b;
66 | --selected-row: #00363a;
67 |
68 | --close-button-bg: #333333;
69 | --close-button-hover-bg: #666666;
70 |
71 | color-scheme: dark;
72 | }
73 |
74 | /* THEME SWITCH */
75 | .theme-toggle {
76 | cursor: pointer;
77 | border: none;
78 | padding: 0;
79 | background: transparent;
80 | vertical-align: middle;
81 | margin-inline-start: 5px;
82 | margin-top: -1px;
83 | }
84 |
85 | .theme-toggle svg {
86 | vertical-align: middle;
87 | height: 1rem;
88 | width: 1rem;
89 | display: none;
90 | }
91 |
92 | /*
93 | Fully hide screen reader text so we only show the one matching the current
94 | theme.
95 | */
96 | .theme-toggle .visually-hidden {
97 | display: none;
98 | }
99 |
100 | html[data-theme="auto"] .theme-toggle .theme-label-when-auto {
101 | display: block;
102 | }
103 |
104 | html[data-theme="dark"] .theme-toggle .theme-label-when-dark {
105 | display: block;
106 | }
107 |
108 | html[data-theme="light"] .theme-toggle .theme-label-when-light {
109 | display: block;
110 | }
111 |
112 | /* ICONS */
113 | .theme-toggle svg.theme-icon-when-auto,
114 | .theme-toggle svg.theme-icon-when-dark,
115 | .theme-toggle svg.theme-icon-when-light {
116 | fill: var(--header-link-color);
117 | color: var(--header-bg);
118 | }
119 |
120 | html[data-theme="auto"] .theme-toggle svg.theme-icon-when-auto {
121 | display: block;
122 | }
123 |
124 | html[data-theme="dark"] .theme-toggle svg.theme-icon-when-dark {
125 | display: block;
126 | }
127 |
128 | html[data-theme="light"] .theme-toggle svg.theme-icon-when-light {
129 | display: block;
130 | }
131 |
--------------------------------------------------------------------------------
/staticfiles/admin/css/dashboard.css:
--------------------------------------------------------------------------------
1 | /* DASHBOARD */
2 | .dashboard td, .dashboard th {
3 | word-break: break-word;
4 | }
5 |
6 | .dashboard .module table th {
7 | width: 100%;
8 | }
9 |
10 | .dashboard .module table td {
11 | white-space: nowrap;
12 | }
13 |
14 | .dashboard .module table td a {
15 | display: block;
16 | padding-right: .6em;
17 | }
18 |
19 | /* RECENT ACTIONS MODULE */
20 |
21 | .module ul.actionlist {
22 | margin-left: 0;
23 | }
24 |
25 | ul.actionlist li {
26 | list-style-type: none;
27 | overflow: hidden;
28 | text-overflow: ellipsis;
29 | }
30 |
--------------------------------------------------------------------------------
/staticfiles/admin/css/login.css:
--------------------------------------------------------------------------------
1 | /* LOGIN FORM */
2 |
3 | .login {
4 | background: var(--darkened-bg);
5 | height: auto;
6 | }
7 |
8 | .login #header {
9 | height: auto;
10 | padding: 15px 16px;
11 | justify-content: center;
12 | }
13 |
14 | .login #header h1 {
15 | font-size: 1.125rem;
16 | margin: 0;
17 | }
18 |
19 | .login #header h1 a {
20 | color: var(--header-link-color);
21 | }
22 |
23 | .login #content {
24 | padding: 20px;
25 | }
26 |
27 | .login #container {
28 | background: var(--body-bg);
29 | border: 1px solid var(--hairline-color);
30 | border-radius: 4px;
31 | overflow: hidden;
32 | width: 28em;
33 | min-width: 300px;
34 | margin: 100px auto;
35 | height: auto;
36 | }
37 |
38 | .login .form-row {
39 | padding: 4px 0;
40 | }
41 |
42 | .login .form-row label {
43 | display: block;
44 | line-height: 2em;
45 | }
46 |
47 | .login .form-row #id_username, .login .form-row #id_password {
48 | padding: 8px;
49 | width: 100%;
50 | box-sizing: border-box;
51 | }
52 |
53 | .login .submit-row {
54 | padding: 1em 0 0 0;
55 | margin: 0;
56 | text-align: center;
57 | }
58 |
59 | .login .password-reset-link {
60 | text-align: center;
61 | }
62 |
--------------------------------------------------------------------------------
/staticfiles/admin/css/nav_sidebar.css:
--------------------------------------------------------------------------------
1 | .sticky {
2 | position: sticky;
3 | top: 0;
4 | max-height: 100vh;
5 | }
6 |
7 | .toggle-nav-sidebar {
8 | z-index: 20;
9 | left: 0;
10 | display: flex;
11 | align-items: center;
12 | justify-content: center;
13 | flex: 0 0 23px;
14 | width: 23px;
15 | border: 0;
16 | border-right: 1px solid var(--hairline-color);
17 | background-color: var(--body-bg);
18 | cursor: pointer;
19 | font-size: 1.25rem;
20 | color: var(--link-fg);
21 | padding: 0;
22 | }
23 |
24 | [dir="rtl"] .toggle-nav-sidebar {
25 | border-left: 1px solid var(--hairline-color);
26 | border-right: 0;
27 | }
28 |
29 | .toggle-nav-sidebar:hover,
30 | .toggle-nav-sidebar:focus {
31 | background-color: var(--darkened-bg);
32 | }
33 |
34 | #nav-sidebar {
35 | z-index: 15;
36 | flex: 0 0 275px;
37 | left: -276px;
38 | margin-left: -276px;
39 | border-top: 1px solid transparent;
40 | border-right: 1px solid var(--hairline-color);
41 | background-color: var(--body-bg);
42 | overflow: auto;
43 | }
44 |
45 | [dir="rtl"] #nav-sidebar {
46 | border-left: 1px solid var(--hairline-color);
47 | border-right: 0;
48 | left: 0;
49 | margin-left: 0;
50 | right: -276px;
51 | margin-right: -276px;
52 | }
53 |
54 | .toggle-nav-sidebar::before {
55 | content: '\00BB';
56 | }
57 |
58 | .main.shifted .toggle-nav-sidebar::before {
59 | content: '\00AB';
60 | }
61 |
62 | .main > #nav-sidebar {
63 | visibility: hidden;
64 | }
65 |
66 | .main.shifted > #nav-sidebar {
67 | margin-left: 0;
68 | visibility: visible;
69 | }
70 |
71 | [dir="rtl"] .main.shifted > #nav-sidebar {
72 | margin-right: 0;
73 | }
74 |
75 | #nav-sidebar .module th {
76 | width: 100%;
77 | overflow-wrap: anywhere;
78 | }
79 |
80 | #nav-sidebar .module th,
81 | #nav-sidebar .module caption {
82 | padding-left: 16px;
83 | }
84 |
85 | #nav-sidebar .module td {
86 | white-space: nowrap;
87 | }
88 |
89 | [dir="rtl"] #nav-sidebar .module th,
90 | [dir="rtl"] #nav-sidebar .module caption {
91 | padding-left: 8px;
92 | padding-right: 16px;
93 | }
94 |
95 | #nav-sidebar .current-app .section:link,
96 | #nav-sidebar .current-app .section:visited {
97 | color: var(--header-color);
98 | font-weight: bold;
99 | }
100 |
101 | #nav-sidebar .current-model {
102 | background: var(--selected-row);
103 | }
104 |
105 | @media (forced-colors: active) {
106 | #nav-sidebar .current-model {
107 | background-color: SelectedItem;
108 | }
109 | }
110 |
111 | .main > #nav-sidebar + .content {
112 | max-width: calc(100% - 23px);
113 | }
114 |
115 | .main.shifted > #nav-sidebar + .content {
116 | max-width: calc(100% - 299px);
117 | }
118 |
119 | @media (max-width: 767px) {
120 | #nav-sidebar, #toggle-nav-sidebar {
121 | display: none;
122 | }
123 |
124 | .main > #nav-sidebar + .content,
125 | .main.shifted > #nav-sidebar + .content {
126 | max-width: 100%;
127 | }
128 | }
129 |
130 | #nav-filter {
131 | width: 100%;
132 | box-sizing: border-box;
133 | padding: 2px 5px;
134 | margin: 5px 0;
135 | border: 1px solid var(--border-color);
136 | background-color: var(--darkened-bg);
137 | color: var(--body-fg);
138 | }
139 |
140 | #nav-filter:focus {
141 | border-color: var(--body-quiet-color);
142 | }
143 |
144 | #nav-filter.no-results {
145 | background: var(--message-error-bg);
146 | }
147 |
148 | #nav-sidebar table {
149 | width: 100%;
150 | }
151 |
--------------------------------------------------------------------------------
/staticfiles/admin/css/responsive_rtl.css:
--------------------------------------------------------------------------------
1 | /* TABLETS */
2 |
3 | @media (max-width: 1024px) {
4 | [dir="rtl"] .colMS {
5 | margin-right: 0;
6 | }
7 |
8 | [dir="rtl"] #user-tools {
9 | text-align: right;
10 | }
11 |
12 | [dir="rtl"] #changelist .actions label {
13 | padding-left: 10px;
14 | padding-right: 0;
15 | }
16 |
17 | [dir="rtl"] #changelist .actions select {
18 | margin-left: 0;
19 | margin-right: 15px;
20 | }
21 |
22 | [dir="rtl"] .change-list .filtered .results,
23 | [dir="rtl"] .change-list .filtered .paginator,
24 | [dir="rtl"] .filtered #toolbar,
25 | [dir="rtl"] .filtered div.xfull,
26 | [dir="rtl"] .filtered .actions,
27 | [dir="rtl"] #changelist-filter {
28 | margin-left: 0;
29 | }
30 |
31 | [dir="rtl"] .inline-group ul.tools a.add,
32 | [dir="rtl"] .inline-group div.add-row a,
33 | [dir="rtl"] .inline-group .tabular tr.add-row td a {
34 | padding: 8px 26px 8px 10px;
35 | background-position: calc(100% - 8px) 9px;
36 | }
37 |
38 | [dir="rtl"] .selector .selector-filter label {
39 | margin-right: 0;
40 | margin-left: 8px;
41 | }
42 |
43 | [dir="rtl"] .object-tools li {
44 | float: right;
45 | }
46 |
47 | [dir="rtl"] .object-tools li + li {
48 | margin-left: 0;
49 | margin-right: 15px;
50 | }
51 |
52 | [dir="rtl"] .dashboard .module table td a {
53 | padding-left: 0;
54 | padding-right: 16px;
55 | }
56 |
57 | [dir="rtl"] .selector-add {
58 | background-position: 0 -80px;
59 | }
60 |
61 | [dir="rtl"] .selector-remove {
62 | background-position: 0 -120px;
63 | }
64 |
65 | [dir="rtl"] .active.selector-add:focus, .active.selector-add:hover {
66 | background-position: 0 -100px;
67 | }
68 |
69 | [dir="rtl"] .active.selector-remove:focus, .active.selector-remove:hover {
70 | background-position: 0 -140px;
71 | }
72 | }
73 |
74 | /* MOBILE */
75 |
76 | @media (max-width: 767px) {
77 | [dir="rtl"] .aligned .related-lookup,
78 | [dir="rtl"] .aligned .datetimeshortcuts {
79 | margin-left: 0;
80 | margin-right: 15px;
81 | }
82 |
83 | [dir="rtl"] .aligned ul,
84 | [dir="rtl"] form .aligned ul.errorlist {
85 | margin-right: 0;
86 | }
87 |
88 | [dir="rtl"] #changelist-filter {
89 | margin-left: 0;
90 | margin-right: 0;
91 | }
92 | [dir="rtl"] .aligned .vCheckboxLabel {
93 | padding: 1px 5px 0 0;
94 | }
95 |
96 | [dir="rtl"] .selector-remove {
97 | background-position: 0 0;
98 | }
99 |
100 | [dir="rtl"] .active.selector-remove:focus, .active.selector-remove:hover {
101 | background-position: 0 -20px;
102 | }
103 |
104 | [dir="rtl"] .selector-add {
105 | background-position: 0 -40px;
106 | }
107 |
108 | [dir="rtl"] .active.selector-add:focus, .active.selector-add:hover {
109 | background-position: 0 -60px;
110 | }
111 | }
112 |
--------------------------------------------------------------------------------
/staticfiles/admin/css/rtl.css:
--------------------------------------------------------------------------------
1 | /* GLOBAL */
2 |
3 | th {
4 | text-align: right;
5 | }
6 |
7 | .module h2, .module caption {
8 | text-align: right;
9 | }
10 |
11 | .module ul, .module ol {
12 | margin-left: 0;
13 | margin-right: 1.5em;
14 | }
15 |
16 | .viewlink, .addlink, .changelink, .hidelink {
17 | padding-left: 0;
18 | padding-right: 16px;
19 | background-position: 100% 1px;
20 | }
21 |
22 | .deletelink {
23 | padding-left: 0;
24 | padding-right: 16px;
25 | background-position: 100% 1px;
26 | }
27 |
28 | .object-tools {
29 | float: left;
30 | }
31 |
32 | thead th:first-child,
33 | tfoot td:first-child {
34 | border-left: none;
35 | }
36 |
37 | /* LAYOUT */
38 |
39 | #user-tools {
40 | right: auto;
41 | left: 0;
42 | text-align: left;
43 | }
44 |
45 | div.breadcrumbs {
46 | text-align: right;
47 | }
48 |
49 | #content-main {
50 | float: right;
51 | }
52 |
53 | #content-related {
54 | float: left;
55 | margin-left: -300px;
56 | margin-right: auto;
57 | }
58 |
59 | .colMS {
60 | margin-left: 300px;
61 | margin-right: 0;
62 | }
63 |
64 | /* SORTABLE TABLES */
65 |
66 | table thead th.sorted .sortoptions {
67 | float: left;
68 | }
69 |
70 | thead th.sorted .text {
71 | padding-right: 0;
72 | padding-left: 42px;
73 | }
74 |
75 | /* dashboard styles */
76 |
77 | .dashboard .module table td a {
78 | padding-left: .6em;
79 | padding-right: 16px;
80 | }
81 |
82 | /* changelists styles */
83 |
84 | .change-list .filtered table {
85 | border-left: none;
86 | border-right: 0px none;
87 | }
88 |
89 | #changelist-filter {
90 | border-left: none;
91 | border-right: none;
92 | margin-left: 0;
93 | margin-right: 30px;
94 | }
95 |
96 | #changelist-filter li.selected {
97 | border-left: none;
98 | padding-left: 10px;
99 | margin-left: 0;
100 | border-right: 5px solid var(--hairline-color);
101 | padding-right: 10px;
102 | margin-right: -15px;
103 | }
104 |
105 | #changelist table tbody td:first-child, #changelist table tbody th:first-child {
106 | border-right: none;
107 | border-left: none;
108 | }
109 |
110 | .paginator .end {
111 | margin-left: 6px;
112 | margin-right: 0;
113 | }
114 |
115 | .paginator input {
116 | margin-left: 0;
117 | margin-right: auto;
118 | }
119 |
120 | /* FORMS */
121 |
122 | .aligned label {
123 | padding: 0 0 3px 1em;
124 | }
125 |
126 | .submit-row a.deletelink {
127 | margin-left: 0;
128 | margin-right: auto;
129 | }
130 |
131 | .vDateField, .vTimeField {
132 | margin-left: 2px;
133 | }
134 |
135 | .aligned .form-row input {
136 | margin-left: 5px;
137 | }
138 |
139 | form .aligned ul {
140 | margin-right: 163px;
141 | padding-right: 10px;
142 | margin-left: 0;
143 | padding-left: 0;
144 | }
145 |
146 | form ul.inline li {
147 | float: right;
148 | padding-right: 0;
149 | padding-left: 7px;
150 | }
151 |
152 | form .aligned p.help,
153 | form .aligned div.help {
154 | margin-left: 0;
155 | margin-right: 160px;
156 | padding-right: 10px;
157 | }
158 |
159 | form div.help ul,
160 | form .aligned .checkbox-row + .help,
161 | form .aligned p.date div.help.timezonewarning,
162 | form .aligned p.datetime div.help.timezonewarning,
163 | form .aligned p.time div.help.timezonewarning {
164 | margin-right: 0;
165 | padding-right: 0;
166 | }
167 |
168 | form .wide p.help,
169 | form .wide ul.errorlist,
170 | form .wide div.help {
171 | padding-left: 0;
172 | padding-right: 50px;
173 | }
174 |
175 | .submit-row {
176 | text-align: right;
177 | }
178 |
179 | fieldset .fieldBox {
180 | margin-left: 20px;
181 | margin-right: 0;
182 | }
183 |
184 | .errorlist li {
185 | background-position: 100% 12px;
186 | padding: 0;
187 | }
188 |
189 | .errornote {
190 | background-position: 100% 12px;
191 | padding: 10px 12px;
192 | }
193 |
194 | /* WIDGETS */
195 |
196 | .calendarnav-previous {
197 | top: 0;
198 | left: auto;
199 | right: 10px;
200 | background: url(../img/calendar-icons.svg) 0 -15px no-repeat;
201 | }
202 |
203 | .calendarnav-next {
204 | top: 0;
205 | right: auto;
206 | left: 10px;
207 | background: url(../img/calendar-icons.svg) 0 0 no-repeat;
208 | }
209 |
210 | .calendar caption, .calendarbox h2 {
211 | text-align: center;
212 | }
213 |
214 | .selector {
215 | float: right;
216 | }
217 |
218 | .selector .selector-filter {
219 | text-align: right;
220 | }
221 |
222 | .selector-add {
223 | background: url(../img/selector-icons.svg) 0 -64px no-repeat;
224 | }
225 |
226 | .active.selector-add:focus, .active.selector-add:hover {
227 | background-position: 0 -80px;
228 | }
229 |
230 | .selector-remove {
231 | background: url(../img/selector-icons.svg) 0 -96px no-repeat;
232 | }
233 |
234 | .active.selector-remove:focus, .active.selector-remove:hover {
235 | background-position: 0 -112px;
236 | }
237 |
238 | a.selector-chooseall {
239 | background: url(../img/selector-icons.svg) right -128px no-repeat;
240 | }
241 |
242 | a.active.selector-chooseall:focus, a.active.selector-chooseall:hover {
243 | background-position: 100% -144px;
244 | }
245 |
246 | a.selector-clearall {
247 | background: url(../img/selector-icons.svg) 0 -160px no-repeat;
248 | }
249 |
250 | a.active.selector-clearall:focus, a.active.selector-clearall:hover {
251 | background-position: 0 -176px;
252 | }
253 |
254 | .inline-deletelink {
255 | float: left;
256 | }
257 |
258 | form .form-row p.datetime {
259 | overflow: hidden;
260 | }
261 |
262 | .related-widget-wrapper {
263 | float: right;
264 | }
265 |
266 | /* MISC */
267 |
268 | .inline-related h2, .inline-group h2 {
269 | text-align: right
270 | }
271 |
272 | .inline-related h3 span.delete {
273 | padding-right: 20px;
274 | padding-left: inherit;
275 | left: 10px;
276 | right: inherit;
277 | float:left;
278 | }
279 |
280 | .inline-related h3 span.delete label {
281 | margin-left: inherit;
282 | margin-right: 2px;
283 | }
284 |
285 | .inline-group .tabular td.original p {
286 | right: 0;
287 | }
288 |
289 | .selector .selector-chooser {
290 | margin: 0;
291 | }
292 |
--------------------------------------------------------------------------------
/staticfiles/admin/css/unusable_password_field.css:
--------------------------------------------------------------------------------
1 | /* Hide warnings fields if usable password is selected */
2 | form:has(#id_usable_password input[value="true"]:checked) .messagelist {
3 | display: none;
4 | }
5 |
6 | /* Hide password fields if unusable password is selected */
7 | form:has(#id_usable_password input[value="false"]:checked) .field-password1,
8 | form:has(#id_usable_password input[value="false"]:checked) .field-password2 {
9 | display: none;
10 | }
11 |
12 | /* Select appropriate submit button */
13 | form:has(#id_usable_password input[value="true"]:checked) input[type="submit"].unset-password {
14 | display: none;
15 | }
16 |
17 | form:has(#id_usable_password input[value="false"]:checked) input[type="submit"].set-password {
18 | display: none;
19 | }
20 |
--------------------------------------------------------------------------------
/staticfiles/admin/css/vendor/select2/LICENSE-SELECT2.md:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) 2012-2017 Kevin Brown, Igor Vaynberg, and Select2 contributors
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
13 | all 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
21 | THE SOFTWARE.
22 |
--------------------------------------------------------------------------------
/staticfiles/admin/img/LICENSE:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) 2014 Code Charm Ltd
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy of
6 | this software and associated documentation files (the "Software"), to deal in
7 | the Software without restriction, including without limitation the rights to
8 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
9 | the Software, and to permit persons to whom the Software is furnished to do so,
10 | 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, FITNESS
17 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
18 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
19 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
20 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21 |
--------------------------------------------------------------------------------
/staticfiles/admin/img/README.txt:
--------------------------------------------------------------------------------
1 | All icons are taken from Font Awesome (https://fontawesome.com/) project.
2 | The Font Awesome font is licensed under the SIL OFL 1.1:
3 | - https://scripts.sil.org/OFL
4 |
5 | SVG icons source: https://github.com/encharm/Font-Awesome-SVG-PNG
6 | Font-Awesome-SVG-PNG is licensed under the MIT license (see file license
7 | in current folder).
8 |
--------------------------------------------------------------------------------
/staticfiles/admin/img/calendar-icons.svg:
--------------------------------------------------------------------------------
1 |
2 |
64 |
--------------------------------------------------------------------------------
/staticfiles/admin/img/gis/move_vertex_off.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/staticfiles/admin/img/gis/move_vertex_on.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/staticfiles/admin/img/icon-addlink.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/staticfiles/admin/img/icon-alert.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/staticfiles/admin/img/icon-calendar.svg:
--------------------------------------------------------------------------------
1 |
10 |
--------------------------------------------------------------------------------
/staticfiles/admin/img/icon-changelink.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/staticfiles/admin/img/icon-clock.svg:
--------------------------------------------------------------------------------
1 |
10 |
--------------------------------------------------------------------------------
/staticfiles/admin/img/icon-deletelink.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/staticfiles/admin/img/icon-hidelink.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/staticfiles/admin/img/icon-no.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/staticfiles/admin/img/icon-unknown-alt.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/staticfiles/admin/img/icon-unknown.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/staticfiles/admin/img/icon-viewlink.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/staticfiles/admin/img/icon-yes.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/staticfiles/admin/img/inline-delete.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/staticfiles/admin/img/search.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/staticfiles/admin/img/selector-icons.svg:
--------------------------------------------------------------------------------
1 |
35 |
--------------------------------------------------------------------------------
/staticfiles/admin/img/sorting-icons.svg:
--------------------------------------------------------------------------------
1 |
20 |
--------------------------------------------------------------------------------
/staticfiles/admin/img/tooltag-add.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/staticfiles/admin/img/tooltag-arrowright.svg:
--------------------------------------------------------------------------------
1 |
4 |
--------------------------------------------------------------------------------
/staticfiles/admin/js/SelectBox.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 | {
3 | const SelectBox = {
4 | cache: {},
5 | init: function(id) {
6 | const box = document.getElementById(id);
7 | SelectBox.cache[id] = [];
8 | const cache = SelectBox.cache[id];
9 | for (const node of box.options) {
10 | cache.push({value: node.value, text: node.text, displayed: 1});
11 | }
12 | },
13 | redisplay: function(id) {
14 | // Repopulate HTML select box from cache
15 | const box = document.getElementById(id);
16 | const scroll_value_from_top = box.scrollTop;
17 | box.innerHTML = '';
18 | for (const node of SelectBox.cache[id]) {
19 | if (node.displayed) {
20 | const new_option = new Option(node.text, node.value, false, false);
21 | // Shows a tooltip when hovering over the option
22 | new_option.title = node.text;
23 | box.appendChild(new_option);
24 | }
25 | }
26 | box.scrollTop = scroll_value_from_top;
27 | },
28 | filter: function(id, text) {
29 | // Redisplay the HTML select box, displaying only the choices containing ALL
30 | // the words in text. (It's an AND search.)
31 | const tokens = text.toLowerCase().split(/\s+/);
32 | for (const node of SelectBox.cache[id]) {
33 | node.displayed = 1;
34 | const node_text = node.text.toLowerCase();
35 | for (const token of tokens) {
36 | if (!node_text.includes(token)) {
37 | node.displayed = 0;
38 | break; // Once the first token isn't found we're done
39 | }
40 | }
41 | }
42 | SelectBox.redisplay(id);
43 | },
44 | get_hidden_node_count(id) {
45 | const cache = SelectBox.cache[id] || [];
46 | return cache.filter(node => node.displayed === 0).length;
47 | },
48 | delete_from_cache: function(id, value) {
49 | let delete_index = null;
50 | const cache = SelectBox.cache[id];
51 | for (const [i, node] of cache.entries()) {
52 | if (node.value === value) {
53 | delete_index = i;
54 | break;
55 | }
56 | }
57 | cache.splice(delete_index, 1);
58 | },
59 | add_to_cache: function(id, option) {
60 | SelectBox.cache[id].push({value: option.value, text: option.text, displayed: 1});
61 | },
62 | cache_contains: function(id, value) {
63 | // Check if an item is contained in the cache
64 | for (const node of SelectBox.cache[id]) {
65 | if (node.value === value) {
66 | return true;
67 | }
68 | }
69 | return false;
70 | },
71 | move: function(from, to) {
72 | const from_box = document.getElementById(from);
73 | for (const option of from_box.options) {
74 | const option_value = option.value;
75 | if (option.selected && SelectBox.cache_contains(from, option_value)) {
76 | SelectBox.add_to_cache(to, {value: option_value, text: option.text, displayed: 1});
77 | SelectBox.delete_from_cache(from, option_value);
78 | }
79 | }
80 | SelectBox.redisplay(from);
81 | SelectBox.redisplay(to);
82 | },
83 | move_all: function(from, to) {
84 | const from_box = document.getElementById(from);
85 | for (const option of from_box.options) {
86 | const option_value = option.value;
87 | if (SelectBox.cache_contains(from, option_value)) {
88 | SelectBox.add_to_cache(to, {value: option_value, text: option.text, displayed: 1});
89 | SelectBox.delete_from_cache(from, option_value);
90 | }
91 | }
92 | SelectBox.redisplay(from);
93 | SelectBox.redisplay(to);
94 | },
95 | sort: function(id) {
96 | SelectBox.cache[id].sort(function(a, b) {
97 | a = a.text.toLowerCase();
98 | b = b.text.toLowerCase();
99 | if (a > b) {
100 | return 1;
101 | }
102 | if (a < b) {
103 | return -1;
104 | }
105 | return 0;
106 | } );
107 | },
108 | select_all: function(id) {
109 | const box = document.getElementById(id);
110 | for (const option of box.options) {
111 | option.selected = true;
112 | }
113 | }
114 | };
115 | window.SelectBox = SelectBox;
116 | }
117 |
--------------------------------------------------------------------------------
/staticfiles/admin/js/autocomplete.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 | {
3 | const $ = django.jQuery;
4 |
5 | $.fn.djangoAdminSelect2 = function() {
6 | $.each(this, function(i, element) {
7 | $(element).select2({
8 | ajax: {
9 | data: (params) => {
10 | return {
11 | term: params.term,
12 | page: params.page,
13 | app_label: element.dataset.appLabel,
14 | model_name: element.dataset.modelName,
15 | field_name: element.dataset.fieldName
16 | };
17 | }
18 | }
19 | });
20 | });
21 | return this;
22 | };
23 |
24 | $(function() {
25 | // Initialize all autocomplete widgets except the one in the template
26 | // form used when a new formset is added.
27 | $('.admin-autocomplete').not('[name*=__prefix__]').djangoAdminSelect2();
28 | });
29 |
30 | document.addEventListener('formset:added', (event) => {
31 | $(event.target).find('.admin-autocomplete').djangoAdminSelect2();
32 | });
33 | }
34 |
--------------------------------------------------------------------------------
/staticfiles/admin/js/cancel.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 | {
3 | // Call function fn when the DOM is loaded and ready. If it is already
4 | // loaded, call the function now.
5 | // http://youmightnotneedjquery.com/#ready
6 | function ready(fn) {
7 | if (document.readyState !== 'loading') {
8 | fn();
9 | } else {
10 | document.addEventListener('DOMContentLoaded', fn);
11 | }
12 | }
13 |
14 | ready(function() {
15 | function handleClick(event) {
16 | event.preventDefault();
17 | const params = new URLSearchParams(window.location.search);
18 | if (params.has('_popup')) {
19 | window.close(); // Close the popup.
20 | } else {
21 | window.history.back(); // Otherwise, go back.
22 | }
23 | }
24 |
25 | document.querySelectorAll('.cancel-link').forEach(function(el) {
26 | el.addEventListener('click', handleClick);
27 | });
28 | });
29 | }
30 |
--------------------------------------------------------------------------------
/staticfiles/admin/js/change_form.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 | {
3 | const inputTags = ['BUTTON', 'INPUT', 'SELECT', 'TEXTAREA'];
4 | const modelName = document.getElementById('django-admin-form-add-constants').dataset.modelName;
5 | if (modelName) {
6 | const form = document.getElementById(modelName + '_form');
7 | for (const element of form.elements) {
8 | // HTMLElement.offsetParent returns null when the element is not
9 | // rendered.
10 | if (inputTags.includes(element.tagName) && !element.disabled && element.offsetParent) {
11 | element.focus();
12 | break;
13 | }
14 | }
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/staticfiles/admin/js/filters.js:
--------------------------------------------------------------------------------
1 | /**
2 | * Persist changelist filters state (collapsed/expanded).
3 | */
4 | 'use strict';
5 | {
6 | // Init filters.
7 | let filters = JSON.parse(sessionStorage.getItem('django.admin.filtersState'));
8 |
9 | if (!filters) {
10 | filters = {};
11 | }
12 |
13 | Object.entries(filters).forEach(([key, value]) => {
14 | const detailElement = document.querySelector(`[data-filter-title='${CSS.escape(key)}']`);
15 |
16 | // Check if the filter is present, it could be from other view.
17 | if (detailElement) {
18 | value ? detailElement.setAttribute('open', '') : detailElement.removeAttribute('open');
19 | }
20 | });
21 |
22 | // Save filter state when clicks.
23 | const details = document.querySelectorAll('details');
24 | details.forEach(detail => {
25 | detail.addEventListener('toggle', event => {
26 | filters[`${event.target.dataset.filterTitle}`] = detail.open;
27 | sessionStorage.setItem('django.admin.filtersState', JSON.stringify(filters));
28 | });
29 | });
30 | }
31 |
--------------------------------------------------------------------------------
/staticfiles/admin/js/jquery.init.js:
--------------------------------------------------------------------------------
1 | /*global jQuery:false*/
2 | 'use strict';
3 | /* Puts the included jQuery into our own namespace using noConflict and passing
4 | * it 'true'. This ensures that the included jQuery doesn't pollute the global
5 | * namespace (i.e. this preserves pre-existing values for both window.$ and
6 | * window.jQuery).
7 | */
8 | window.django = {jQuery: jQuery.noConflict(true)};
9 |
--------------------------------------------------------------------------------
/staticfiles/admin/js/nav_sidebar.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 | {
3 | const toggleNavSidebar = document.getElementById('toggle-nav-sidebar');
4 | if (toggleNavSidebar !== null) {
5 | const navSidebar = document.getElementById('nav-sidebar');
6 | const main = document.getElementById('main');
7 | let navSidebarIsOpen = localStorage.getItem('django.admin.navSidebarIsOpen');
8 | if (navSidebarIsOpen === null) {
9 | navSidebarIsOpen = 'true';
10 | }
11 | main.classList.toggle('shifted', navSidebarIsOpen === 'true');
12 | navSidebar.setAttribute('aria-expanded', navSidebarIsOpen);
13 |
14 | toggleNavSidebar.addEventListener('click', function() {
15 | if (navSidebarIsOpen === 'true') {
16 | navSidebarIsOpen = 'false';
17 | } else {
18 | navSidebarIsOpen = 'true';
19 | }
20 | localStorage.setItem('django.admin.navSidebarIsOpen', navSidebarIsOpen);
21 | main.classList.toggle('shifted');
22 | navSidebar.setAttribute('aria-expanded', navSidebarIsOpen);
23 | });
24 | }
25 |
26 | function initSidebarQuickFilter() {
27 | const options = [];
28 | const navSidebar = document.getElementById('nav-sidebar');
29 | if (!navSidebar) {
30 | return;
31 | }
32 | navSidebar.querySelectorAll('th[scope=row] a').forEach((container) => {
33 | options.push({title: container.innerHTML, node: container});
34 | });
35 |
36 | function checkValue(event) {
37 | let filterValue = event.target.value;
38 | if (filterValue) {
39 | filterValue = filterValue.toLowerCase();
40 | }
41 | if (event.key === 'Escape') {
42 | filterValue = '';
43 | event.target.value = ''; // clear input
44 | }
45 | let matches = false;
46 | for (const o of options) {
47 | let displayValue = '';
48 | if (filterValue) {
49 | if (o.title.toLowerCase().indexOf(filterValue) === -1) {
50 | displayValue = 'none';
51 | } else {
52 | matches = true;
53 | }
54 | }
55 | // show/hide parent
56 | o.node.parentNode.parentNode.style.display = displayValue;
57 | }
58 | if (!filterValue || matches) {
59 | event.target.classList.remove('no-results');
60 | } else {
61 | event.target.classList.add('no-results');
62 | }
63 | sessionStorage.setItem('django.admin.navSidebarFilterValue', filterValue);
64 | }
65 |
66 | const nav = document.getElementById('nav-filter');
67 | nav.addEventListener('change', checkValue, false);
68 | nav.addEventListener('input', checkValue, false);
69 | nav.addEventListener('keyup', checkValue, false);
70 |
71 | const storedValue = sessionStorage.getItem('django.admin.navSidebarFilterValue');
72 | if (storedValue) {
73 | nav.value = storedValue;
74 | checkValue({target: nav, key: ''});
75 | }
76 | }
77 | window.initSidebarQuickFilter = initSidebarQuickFilter;
78 | initSidebarQuickFilter();
79 | }
80 |
--------------------------------------------------------------------------------
/staticfiles/admin/js/popup_response.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 | {
3 | const initData = JSON.parse(document.getElementById('django-admin-popup-response-constants').dataset.popupResponse);
4 | switch(initData.action) {
5 | case 'change':
6 | opener.dismissChangeRelatedObjectPopup(window, initData.value, initData.obj, initData.new_value);
7 | break;
8 | case 'delete':
9 | opener.dismissDeleteRelatedObjectPopup(window, initData.value);
10 | break;
11 | default:
12 | opener.dismissAddRelatedObjectPopup(window, initData.value, initData.obj);
13 | break;
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/staticfiles/admin/js/prepopulate.js:
--------------------------------------------------------------------------------
1 | /*global URLify*/
2 | 'use strict';
3 | {
4 | const $ = django.jQuery;
5 | $.fn.prepopulate = function(dependencies, maxLength, allowUnicode) {
6 | /*
7 | Depends on urlify.js
8 | Populates a selected field with the values of the dependent fields,
9 | URLifies and shortens the string.
10 | dependencies - array of dependent fields ids
11 | maxLength - maximum length of the URLify'd string
12 | allowUnicode - Unicode support of the URLify'd string
13 | */
14 | return this.each(function() {
15 | const prepopulatedField = $(this);
16 |
17 | const populate = function() {
18 | // Bail if the field's value has been changed by the user
19 | if (prepopulatedField.data('_changed')) {
20 | return;
21 | }
22 |
23 | const values = [];
24 | $.each(dependencies, function(i, field) {
25 | field = $(field);
26 | if (field.val().length > 0) {
27 | values.push(field.val());
28 | }
29 | });
30 | prepopulatedField.val(URLify(values.join(' '), maxLength, allowUnicode));
31 | };
32 |
33 | prepopulatedField.data('_changed', false);
34 | prepopulatedField.on('change', function() {
35 | prepopulatedField.data('_changed', true);
36 | });
37 |
38 | if (!prepopulatedField.val()) {
39 | $(dependencies.join(',')).on('keyup change focus', populate);
40 | }
41 | });
42 | };
43 | }
44 |
--------------------------------------------------------------------------------
/staticfiles/admin/js/prepopulate_init.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 | {
3 | const $ = django.jQuery;
4 | const fields = $('#django-admin-prepopulated-fields-constants').data('prepopulatedFields');
5 | $.each(fields, function(index, field) {
6 | $(
7 | '.empty-form .form-row .field-' + field.name +
8 | ', .empty-form.form-row .field-' + field.name +
9 | ', .empty-form .form-row.field-' + field.name
10 | ).addClass('prepopulated_field');
11 | $(field.id).data('dependency_list', field.dependency_list).prepopulate(
12 | field.dependency_ids, field.maxLength, field.allowUnicode
13 | );
14 | });
15 | }
16 |
--------------------------------------------------------------------------------
/staticfiles/admin/js/theme.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 | {
3 | function setTheme(mode) {
4 | if (mode !== "light" && mode !== "dark" && mode !== "auto") {
5 | console.error(`Got invalid theme mode: ${mode}. Resetting to auto.`);
6 | mode = "auto";
7 | }
8 | document.documentElement.dataset.theme = mode;
9 | localStorage.setItem("theme", mode);
10 | }
11 |
12 | function cycleTheme() {
13 | const currentTheme = localStorage.getItem("theme") || "auto";
14 | const prefersDark = window.matchMedia("(prefers-color-scheme: dark)").matches;
15 |
16 | if (prefersDark) {
17 | // Auto (dark) -> Light -> Dark
18 | if (currentTheme === "auto") {
19 | setTheme("light");
20 | } else if (currentTheme === "light") {
21 | setTheme("dark");
22 | } else {
23 | setTheme("auto");
24 | }
25 | } else {
26 | // Auto (light) -> Dark -> Light
27 | if (currentTheme === "auto") {
28 | setTheme("dark");
29 | } else if (currentTheme === "dark") {
30 | setTheme("light");
31 | } else {
32 | setTheme("auto");
33 | }
34 | }
35 | }
36 |
37 | function initTheme() {
38 | // set theme defined in localStorage if there is one, or fallback to auto mode
39 | const currentTheme = localStorage.getItem("theme");
40 | currentTheme ? setTheme(currentTheme) : setTheme("auto");
41 | }
42 |
43 | window.addEventListener('load', function(_) {
44 | const buttons = document.getElementsByClassName("theme-toggle");
45 | Array.from(buttons).forEach((btn) => {
46 | btn.addEventListener("click", cycleTheme);
47 | });
48 | });
49 |
50 | initTheme();
51 | }
52 |
--------------------------------------------------------------------------------
/staticfiles/admin/js/unusable_password_field.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | // Fallback JS for browsers which do not support :has selector used in
3 | // admin/css/unusable_password_fields.css
4 | // Remove file once all supported browsers support :has selector
5 | try {
6 | // If browser does not support :has selector this will raise an error
7 | document.querySelector("form:has(input)");
8 | } catch (error) {
9 | console.log("Defaulting to javascript for usable password form management: " + error);
10 | // JS replacement for unsupported :has selector
11 | document.querySelectorAll('input[name="usable_password"]').forEach(option => {
12 | option.addEventListener('change', function() {
13 | const usablePassword = (this.value === "true" ? this.checked : !this.checked);
14 | const submit1 = document.querySelector('input[type="submit"].set-password');
15 | const submit2 = document.querySelector('input[type="submit"].unset-password');
16 | const messages = document.querySelector('#id_unusable_warning');
17 | document.getElementById('id_password1').closest('.form-row').hidden = !usablePassword;
18 | document.getElementById('id_password2').closest('.form-row').hidden = !usablePassword;
19 | if (messages) {
20 | messages.hidden = usablePassword;
21 | }
22 | if (submit1 && submit2) {
23 | submit1.hidden = !usablePassword;
24 | submit2.hidden = usablePassword;
25 | }
26 | });
27 | option.dispatchEvent(new Event('change'));
28 | });
29 | }
30 |
--------------------------------------------------------------------------------
/staticfiles/admin/js/vendor/jquery/LICENSE.txt:
--------------------------------------------------------------------------------
1 | Copyright OpenJS Foundation and other contributors, https://openjsf.org/
2 |
3 | Permission is hereby granted, free of charge, to any person obtaining
4 | a copy of this software and associated documentation files (the
5 | "Software"), to deal in the Software without restriction, including
6 | without limitation the rights to use, copy, modify, merge, publish,
7 | distribute, sublicense, and/or sell copies of the Software, and to
8 | permit persons to whom the Software is furnished to do so, subject to
9 | the following conditions:
10 |
11 | The above copyright notice and this permission notice shall be
12 | included in all copies or substantial portions of the Software.
13 |
14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18 | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21 |
--------------------------------------------------------------------------------
/staticfiles/admin/js/vendor/select2/LICENSE.md:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) 2012-2017 Kevin Brown, Igor Vaynberg, and Select2 contributors
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
13 | all 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
21 | THE SOFTWARE.
22 |
--------------------------------------------------------------------------------
/staticfiles/admin/js/vendor/select2/i18n/af.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/af",[],function(){return{errorLoading:function(){return"Die resultate kon nie gelaai word nie."},inputTooLong:function(e){var n=e.input.length-e.maximum,r="Verwyders asseblief "+n+" character";return 1!=n&&(r+="s"),r},inputTooShort:function(e){return"Voer asseblief "+(e.minimum-e.input.length)+" of meer karakters"},loadingMore:function(){return"Meer resultate word gelaai…"},maximumSelected:function(e){var n="Kies asseblief net "+e.maximum+" item";return 1!=e.maximum&&(n+="s"),n},noResults:function(){return"Geen resultate gevind"},searching:function(){return"Besig…"},removeAllItems:function(){return"Verwyder alle items"}}}),e.define,e.require}();
--------------------------------------------------------------------------------
/staticfiles/admin/js/vendor/select2/i18n/ar.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/ar",[],function(){return{errorLoading:function(){return"لا يمكن تحميل النتائج"},inputTooLong:function(n){return"الرجاء حذف "+(n.input.length-n.maximum)+" عناصر"},inputTooShort:function(n){return"الرجاء إضافة "+(n.minimum-n.input.length)+" عناصر"},loadingMore:function(){return"جاري تحميل نتائج إضافية..."},maximumSelected:function(n){return"تستطيع إختيار "+n.maximum+" بنود فقط"},noResults:function(){return"لم يتم العثور على أي نتائج"},searching:function(){return"جاري البحث…"},removeAllItems:function(){return"قم بإزالة كل العناصر"}}}),n.define,n.require}();
--------------------------------------------------------------------------------
/staticfiles/admin/js/vendor/select2/i18n/az.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/az",[],function(){return{inputTooLong:function(n){return n.input.length-n.maximum+" simvol silin"},inputTooShort:function(n){return n.minimum-n.input.length+" simvol daxil edin"},loadingMore:function(){return"Daha çox nəticə yüklənir…"},maximumSelected:function(n){return"Sadəcə "+n.maximum+" element seçə bilərsiniz"},noResults:function(){return"Nəticə tapılmadı"},searching:function(){return"Axtarılır…"},removeAllItems:function(){return"Bütün elementləri sil"}}}),n.define,n.require}();
--------------------------------------------------------------------------------
/staticfiles/admin/js/vendor/select2/i18n/bg.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/bg",[],function(){return{inputTooLong:function(n){var e=n.input.length-n.maximum,u="Моля въведете с "+e+" по-малко символ";return e>1&&(u+="a"),u},inputTooShort:function(n){var e=n.minimum-n.input.length,u="Моля въведете още "+e+" символ";return e>1&&(u+="a"),u},loadingMore:function(){return"Зареждат се още…"},maximumSelected:function(n){var e="Можете да направите до "+n.maximum+" ";return n.maximum>1?e+="избора":e+="избор",e},noResults:function(){return"Няма намерени съвпадения"},searching:function(){return"Търсене…"},removeAllItems:function(){return"Премахнете всички елементи"}}}),n.define,n.require}();
--------------------------------------------------------------------------------
/staticfiles/admin/js/vendor/select2/i18n/bn.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/bn",[],function(){return{errorLoading:function(){return"ফলাফলগুলি লোড করা যায়নি।"},inputTooLong:function(n){var e=n.input.length-n.maximum,u="অনুগ্রহ করে "+e+" টি অক্ষর মুছে দিন।";return 1!=e&&(u="অনুগ্রহ করে "+e+" টি অক্ষর মুছে দিন।"),u},inputTooShort:function(n){return n.minimum-n.input.length+" টি অক্ষর অথবা অধিক অক্ষর লিখুন।"},loadingMore:function(){return"আরো ফলাফল লোড হচ্ছে ..."},maximumSelected:function(n){var e=n.maximum+" টি আইটেম নির্বাচন করতে পারবেন।";return 1!=n.maximum&&(e=n.maximum+" টি আইটেম নির্বাচন করতে পারবেন।"),e},noResults:function(){return"কোন ফলাফল পাওয়া যায়নি।"},searching:function(){return"অনুসন্ধান করা হচ্ছে ..."}}}),n.define,n.require}();
--------------------------------------------------------------------------------
/staticfiles/admin/js/vendor/select2/i18n/bs.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/bs",[],function(){function e(e,n,r,t){return e%10==1&&e%100!=11?n:e%10>=2&&e%10<=4&&(e%100<12||e%100>14)?r:t}return{errorLoading:function(){return"Preuzimanje nije uspijelo."},inputTooLong:function(n){var r=n.input.length-n.maximum,t="Obrišite "+r+" simbol";return t+=e(r,"","a","a")},inputTooShort:function(n){var r=n.minimum-n.input.length,t="Ukucajte bar još "+r+" simbol";return t+=e(r,"","a","a")},loadingMore:function(){return"Preuzimanje još rezultata…"},maximumSelected:function(n){var r="Možete izabrati samo "+n.maximum+" stavk";return r+=e(n.maximum,"u","e","i")},noResults:function(){return"Ništa nije pronađeno"},searching:function(){return"Pretraga…"},removeAllItems:function(){return"Uklonite sve stavke"}}}),e.define,e.require}();
--------------------------------------------------------------------------------
/staticfiles/admin/js/vendor/select2/i18n/ca.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/ca",[],function(){return{errorLoading:function(){return"La càrrega ha fallat"},inputTooLong:function(e){var n=e.input.length-e.maximum,r="Si us plau, elimina "+n+" car";return r+=1==n?"àcter":"àcters"},inputTooShort:function(e){var n=e.minimum-e.input.length,r="Si us plau, introdueix "+n+" car";return r+=1==n?"àcter":"àcters"},loadingMore:function(){return"Carregant més resultats…"},maximumSelected:function(e){var n="Només es pot seleccionar "+e.maximum+" element";return 1!=e.maximum&&(n+="s"),n},noResults:function(){return"No s'han trobat resultats"},searching:function(){return"Cercant…"},removeAllItems:function(){return"Treu tots els elements"}}}),e.define,e.require}();
--------------------------------------------------------------------------------
/staticfiles/admin/js/vendor/select2/i18n/cs.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/cs",[],function(){function e(e,n){switch(e){case 2:return n?"dva":"dvě";case 3:return"tři";case 4:return"čtyři"}return""}return{errorLoading:function(){return"Výsledky nemohly být načteny."},inputTooLong:function(n){var t=n.input.length-n.maximum;return 1==t?"Prosím, zadejte o jeden znak méně.":t<=4?"Prosím, zadejte o "+e(t,!0)+" znaky méně.":"Prosím, zadejte o "+t+" znaků méně."},inputTooShort:function(n){var t=n.minimum-n.input.length;return 1==t?"Prosím, zadejte ještě jeden znak.":t<=4?"Prosím, zadejte ještě další "+e(t,!0)+" znaky.":"Prosím, zadejte ještě dalších "+t+" znaků."},loadingMore:function(){return"Načítají se další výsledky…"},maximumSelected:function(n){var t=n.maximum;return 1==t?"Můžete zvolit jen jednu položku.":t<=4?"Můžete zvolit maximálně "+e(t,!1)+" položky.":"Můžete zvolit maximálně "+t+" položek."},noResults:function(){return"Nenalezeny žádné položky."},searching:function(){return"Vyhledávání…"},removeAllItems:function(){return"Odstraňte všechny položky"}}}),e.define,e.require}();
--------------------------------------------------------------------------------
/staticfiles/admin/js/vendor/select2/i18n/da.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/da",[],function(){return{errorLoading:function(){return"Resultaterne kunne ikke indlæses."},inputTooLong:function(e){return"Angiv venligst "+(e.input.length-e.maximum)+" tegn mindre"},inputTooShort:function(e){return"Angiv venligst "+(e.minimum-e.input.length)+" tegn mere"},loadingMore:function(){return"Indlæser flere resultater…"},maximumSelected:function(e){var n="Du kan kun vælge "+e.maximum+" emne";return 1!=e.maximum&&(n+="r"),n},noResults:function(){return"Ingen resultater fundet"},searching:function(){return"Søger…"},removeAllItems:function(){return"Fjern alle elementer"}}}),e.define,e.require}();
--------------------------------------------------------------------------------
/staticfiles/admin/js/vendor/select2/i18n/de.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/de",[],function(){return{errorLoading:function(){return"Die Ergebnisse konnten nicht geladen werden."},inputTooLong:function(e){return"Bitte "+(e.input.length-e.maximum)+" Zeichen weniger eingeben"},inputTooShort:function(e){return"Bitte "+(e.minimum-e.input.length)+" Zeichen mehr eingeben"},loadingMore:function(){return"Lade mehr Ergebnisse…"},maximumSelected:function(e){var n="Sie können nur "+e.maximum+" Element";return 1!=e.maximum&&(n+="e"),n+=" auswählen"},noResults:function(){return"Keine Übereinstimmungen gefunden"},searching:function(){return"Suche…"},removeAllItems:function(){return"Entferne alle Elemente"}}}),e.define,e.require}();
--------------------------------------------------------------------------------
/staticfiles/admin/js/vendor/select2/i18n/dsb.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/dsb",[],function(){var n=["znamuško","znamušce","znamuška","znamuškow"],e=["zapisk","zapiska","zapiski","zapiskow"],u=function(n,e){return 1===n?e[0]:2===n?e[1]:n>2&&n<=4?e[2]:n>=5?e[3]:void 0};return{errorLoading:function(){return"Wuslědki njejsu se dali zacytaś."},inputTooLong:function(e){var a=e.input.length-e.maximum;return"Pšosym lašuj "+a+" "+u(a,n)},inputTooShort:function(e){var a=e.minimum-e.input.length;return"Pšosym zapódaj nanejmjenjej "+a+" "+u(a,n)},loadingMore:function(){return"Dalšne wuslědki se zacytaju…"},maximumSelected:function(n){return"Móžoš jano "+n.maximum+" "+u(n.maximum,e)+"wubraś."},noResults:function(){return"Žedne wuslědki namakane"},searching:function(){return"Pyta se…"},removeAllItems:function(){return"Remove all items"}}}),n.define,n.require}();
--------------------------------------------------------------------------------
/staticfiles/admin/js/vendor/select2/i18n/el.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/el",[],function(){return{errorLoading:function(){return"Τα αποτελέσματα δεν μπόρεσαν να φορτώσουν."},inputTooLong:function(n){var e=n.input.length-n.maximum,u="Παρακαλώ διαγράψτε "+e+" χαρακτήρ";return 1==e&&(u+="α"),1!=e&&(u+="ες"),u},inputTooShort:function(n){return"Παρακαλώ συμπληρώστε "+(n.minimum-n.input.length)+" ή περισσότερους χαρακτήρες"},loadingMore:function(){return"Φόρτωση περισσότερων αποτελεσμάτων…"},maximumSelected:function(n){var e="Μπορείτε να επιλέξετε μόνο "+n.maximum+" επιλογ";return 1==n.maximum&&(e+="ή"),1!=n.maximum&&(e+="ές"),e},noResults:function(){return"Δεν βρέθηκαν αποτελέσματα"},searching:function(){return"Αναζήτηση…"},removeAllItems:function(){return"Καταργήστε όλα τα στοιχεία"}}}),n.define,n.require}();
--------------------------------------------------------------------------------
/staticfiles/admin/js/vendor/select2/i18n/en.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/en",[],function(){return{errorLoading:function(){return"The results could not be loaded."},inputTooLong:function(e){var n=e.input.length-e.maximum,r="Please delete "+n+" character";return 1!=n&&(r+="s"),r},inputTooShort:function(e){return"Please enter "+(e.minimum-e.input.length)+" or more characters"},loadingMore:function(){return"Loading more results…"},maximumSelected:function(e){var n="You can only select "+e.maximum+" item";return 1!=e.maximum&&(n+="s"),n},noResults:function(){return"No results found"},searching:function(){return"Searching…"},removeAllItems:function(){return"Remove all items"}}}),e.define,e.require}();
--------------------------------------------------------------------------------
/staticfiles/admin/js/vendor/select2/i18n/es.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/es",[],function(){return{errorLoading:function(){return"No se pudieron cargar los resultados"},inputTooLong:function(e){var n=e.input.length-e.maximum,r="Por favor, elimine "+n+" car";return r+=1==n?"ácter":"acteres"},inputTooShort:function(e){var n=e.minimum-e.input.length,r="Por favor, introduzca "+n+" car";return r+=1==n?"ácter":"acteres"},loadingMore:function(){return"Cargando más resultados…"},maximumSelected:function(e){var n="Sólo puede seleccionar "+e.maximum+" elemento";return 1!=e.maximum&&(n+="s"),n},noResults:function(){return"No se encontraron resultados"},searching:function(){return"Buscando…"},removeAllItems:function(){return"Eliminar todos los elementos"}}}),e.define,e.require}();
--------------------------------------------------------------------------------
/staticfiles/admin/js/vendor/select2/i18n/et.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/et",[],function(){return{inputTooLong:function(e){var n=e.input.length-e.maximum,t="Sisesta "+n+" täht";return 1!=n&&(t+="e"),t+=" vähem"},inputTooShort:function(e){var n=e.minimum-e.input.length,t="Sisesta "+n+" täht";return 1!=n&&(t+="e"),t+=" rohkem"},loadingMore:function(){return"Laen tulemusi…"},maximumSelected:function(e){var n="Saad vaid "+e.maximum+" tulemus";return 1==e.maximum?n+="e":n+="t",n+=" valida"},noResults:function(){return"Tulemused puuduvad"},searching:function(){return"Otsin…"},removeAllItems:function(){return"Eemalda kõik esemed"}}}),e.define,e.require}();
--------------------------------------------------------------------------------
/staticfiles/admin/js/vendor/select2/i18n/eu.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/eu",[],function(){return{inputTooLong:function(e){var t=e.input.length-e.maximum,n="Idatzi ";return n+=1==t?"karaktere bat":t+" karaktere",n+=" gutxiago"},inputTooShort:function(e){var t=e.minimum-e.input.length,n="Idatzi ";return n+=1==t?"karaktere bat":t+" karaktere",n+=" gehiago"},loadingMore:function(){return"Emaitza gehiago kargatzen…"},maximumSelected:function(e){return 1===e.maximum?"Elementu bakarra hauta dezakezu":e.maximum+" elementu hauta ditzakezu soilik"},noResults:function(){return"Ez da bat datorrenik aurkitu"},searching:function(){return"Bilatzen…"},removeAllItems:function(){return"Kendu elementu guztiak"}}}),e.define,e.require}();
--------------------------------------------------------------------------------
/staticfiles/admin/js/vendor/select2/i18n/fa.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/fa",[],function(){return{errorLoading:function(){return"امکان بارگذاری نتایج وجود ندارد."},inputTooLong:function(n){return"لطفاً "+(n.input.length-n.maximum)+" کاراکتر را حذف نمایید"},inputTooShort:function(n){return"لطفاً تعداد "+(n.minimum-n.input.length)+" کاراکتر یا بیشتر وارد نمایید"},loadingMore:function(){return"در حال بارگذاری نتایج بیشتر..."},maximumSelected:function(n){return"شما تنها میتوانید "+n.maximum+" آیتم را انتخاب نمایید"},noResults:function(){return"هیچ نتیجهای یافت نشد"},searching:function(){return"در حال جستجو..."},removeAllItems:function(){return"همه موارد را حذف کنید"}}}),n.define,n.require}();
--------------------------------------------------------------------------------
/staticfiles/admin/js/vendor/select2/i18n/fi.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/fi",[],function(){return{errorLoading:function(){return"Tuloksia ei saatu ladattua."},inputTooLong:function(n){return"Ole hyvä ja anna "+(n.input.length-n.maximum)+" merkkiä vähemmän"},inputTooShort:function(n){return"Ole hyvä ja anna "+(n.minimum-n.input.length)+" merkkiä lisää"},loadingMore:function(){return"Ladataan lisää tuloksia…"},maximumSelected:function(n){return"Voit valita ainoastaan "+n.maximum+" kpl"},noResults:function(){return"Ei tuloksia"},searching:function(){return"Haetaan…"},removeAllItems:function(){return"Poista kaikki kohteet"}}}),n.define,n.require}();
--------------------------------------------------------------------------------
/staticfiles/admin/js/vendor/select2/i18n/fr.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/fr",[],function(){return{errorLoading:function(){return"Les résultats ne peuvent pas être chargés."},inputTooLong:function(e){var n=e.input.length-e.maximum;return"Supprimez "+n+" caractère"+(n>1?"s":"")},inputTooShort:function(e){var n=e.minimum-e.input.length;return"Saisissez au moins "+n+" caractère"+(n>1?"s":"")},loadingMore:function(){return"Chargement de résultats supplémentaires…"},maximumSelected:function(e){return"Vous pouvez seulement sélectionner "+e.maximum+" élément"+(e.maximum>1?"s":"")},noResults:function(){return"Aucun résultat trouvé"},searching:function(){return"Recherche en cours…"},removeAllItems:function(){return"Supprimer tous les éléments"}}}),e.define,e.require}();
--------------------------------------------------------------------------------
/staticfiles/admin/js/vendor/select2/i18n/gl.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/gl",[],function(){return{errorLoading:function(){return"Non foi posíbel cargar os resultados."},inputTooLong:function(e){var n=e.input.length-e.maximum;return 1===n?"Elimine un carácter":"Elimine "+n+" caracteres"},inputTooShort:function(e){var n=e.minimum-e.input.length;return 1===n?"Engada un carácter":"Engada "+n+" caracteres"},loadingMore:function(){return"Cargando máis resultados…"},maximumSelected:function(e){return 1===e.maximum?"Só pode seleccionar un elemento":"Só pode seleccionar "+e.maximum+" elementos"},noResults:function(){return"Non se atoparon resultados"},searching:function(){return"Buscando…"},removeAllItems:function(){return"Elimina todos os elementos"}}}),e.define,e.require}();
--------------------------------------------------------------------------------
/staticfiles/admin/js/vendor/select2/i18n/he.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/he",[],function(){return{errorLoading:function(){return"שגיאה בטעינת התוצאות"},inputTooLong:function(n){var e=n.input.length-n.maximum,r="נא למחוק ";return r+=1===e?"תו אחד":e+" תווים"},inputTooShort:function(n){var e=n.minimum-n.input.length,r="נא להכניס ";return r+=1===e?"תו אחד":e+" תווים",r+=" או יותר"},loadingMore:function(){return"טוען תוצאות נוספות…"},maximumSelected:function(n){var e="באפשרותך לבחור עד ";return 1===n.maximum?e+="פריט אחד":e+=n.maximum+" פריטים",e},noResults:function(){return"לא נמצאו תוצאות"},searching:function(){return"מחפש…"},removeAllItems:function(){return"הסר את כל הפריטים"}}}),n.define,n.require}();
--------------------------------------------------------------------------------
/staticfiles/admin/js/vendor/select2/i18n/hi.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/hi",[],function(){return{errorLoading:function(){return"परिणामों को लोड नहीं किया जा सका।"},inputTooLong:function(n){var e=n.input.length-n.maximum,r=e+" अक्षर को हटा दें";return e>1&&(r=e+" अक्षरों को हटा दें "),r},inputTooShort:function(n){return"कृपया "+(n.minimum-n.input.length)+" या अधिक अक्षर दर्ज करें"},loadingMore:function(){return"अधिक परिणाम लोड हो रहे है..."},maximumSelected:function(n){return"आप केवल "+n.maximum+" आइटम का चयन कर सकते हैं"},noResults:function(){return"कोई परिणाम नहीं मिला"},searching:function(){return"खोज रहा है..."},removeAllItems:function(){return"सभी वस्तुओं को हटा दें"}}}),n.define,n.require}();
--------------------------------------------------------------------------------
/staticfiles/admin/js/vendor/select2/i18n/hr.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/hr",[],function(){function n(n){var e=" "+n+" znak";return n%10<5&&n%10>0&&(n%100<5||n%100>19)?n%10>1&&(e+="a"):e+="ova",e}return{errorLoading:function(){return"Preuzimanje nije uspjelo."},inputTooLong:function(e){return"Unesite "+n(e.input.length-e.maximum)},inputTooShort:function(e){return"Unesite još "+n(e.minimum-e.input.length)},loadingMore:function(){return"Učitavanje rezultata…"},maximumSelected:function(n){return"Maksimalan broj odabranih stavki je "+n.maximum},noResults:function(){return"Nema rezultata"},searching:function(){return"Pretraga…"},removeAllItems:function(){return"Ukloni sve stavke"}}}),n.define,n.require}();
--------------------------------------------------------------------------------
/staticfiles/admin/js/vendor/select2/i18n/hsb.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/hsb",[],function(){var n=["znamješko","znamješce","znamješka","znamješkow"],e=["zapisk","zapiskaj","zapiski","zapiskow"],u=function(n,e){return 1===n?e[0]:2===n?e[1]:n>2&&n<=4?e[2]:n>=5?e[3]:void 0};return{errorLoading:function(){return"Wuslědki njedachu so začitać."},inputTooLong:function(e){var a=e.input.length-e.maximum;return"Prošu zhašej "+a+" "+u(a,n)},inputTooShort:function(e){var a=e.minimum-e.input.length;return"Prošu zapodaj znajmjeńša "+a+" "+u(a,n)},loadingMore:function(){return"Dalše wuslědki so začitaja…"},maximumSelected:function(n){return"Móžeš jenož "+n.maximum+" "+u(n.maximum,e)+"wubrać"},noResults:function(){return"Žane wuslědki namakane"},searching:function(){return"Pyta so…"},removeAllItems:function(){return"Remove all items"}}}),n.define,n.require}();
--------------------------------------------------------------------------------
/staticfiles/admin/js/vendor/select2/i18n/hu.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/hu",[],function(){return{errorLoading:function(){return"Az eredmények betöltése nem sikerült."},inputTooLong:function(e){return"Túl hosszú. "+(e.input.length-e.maximum)+" karakterrel több, mint kellene."},inputTooShort:function(e){return"Túl rövid. Még "+(e.minimum-e.input.length)+" karakter hiányzik."},loadingMore:function(){return"Töltés…"},maximumSelected:function(e){return"Csak "+e.maximum+" elemet lehet kiválasztani."},noResults:function(){return"Nincs találat."},searching:function(){return"Keresés…"},removeAllItems:function(){return"Távolítson el minden elemet"}}}),e.define,e.require}();
--------------------------------------------------------------------------------
/staticfiles/admin/js/vendor/select2/i18n/hy.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/hy",[],function(){return{errorLoading:function(){return"Արդյունքները հնարավոր չէ բեռնել։"},inputTooLong:function(n){return"Խնդրում ենք հեռացնել "+(n.input.length-n.maximum)+" նշան"},inputTooShort:function(n){return"Խնդրում ենք մուտքագրել "+(n.minimum-n.input.length)+" կամ ավել նշաններ"},loadingMore:function(){return"Բեռնվում են նոր արդյունքներ․․․"},maximumSelected:function(n){return"Դուք կարող եք ընտրել առավելագույնը "+n.maximum+" կետ"},noResults:function(){return"Արդյունքներ չեն գտնվել"},searching:function(){return"Որոնում․․․"},removeAllItems:function(){return"Հեռացնել բոլոր տարրերը"}}}),n.define,n.require}();
--------------------------------------------------------------------------------
/staticfiles/admin/js/vendor/select2/i18n/id.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/id",[],function(){return{errorLoading:function(){return"Data tidak boleh diambil."},inputTooLong:function(n){return"Hapuskan "+(n.input.length-n.maximum)+" huruf"},inputTooShort:function(n){return"Masukkan "+(n.minimum-n.input.length)+" huruf lagi"},loadingMore:function(){return"Mengambil data…"},maximumSelected:function(n){return"Anda hanya dapat memilih "+n.maximum+" pilihan"},noResults:function(){return"Tidak ada data yang sesuai"},searching:function(){return"Mencari…"},removeAllItems:function(){return"Hapus semua item"}}}),n.define,n.require}();
--------------------------------------------------------------------------------
/staticfiles/admin/js/vendor/select2/i18n/is.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/is",[],function(){return{inputTooLong:function(n){var t=n.input.length-n.maximum,e="Vinsamlegast styttið texta um "+t+" staf";return t<=1?e:e+"i"},inputTooShort:function(n){var t=n.minimum-n.input.length,e="Vinsamlegast skrifið "+t+" staf";return t>1&&(e+="i"),e+=" í viðbót"},loadingMore:function(){return"Sæki fleiri niðurstöður…"},maximumSelected:function(n){return"Þú getur aðeins valið "+n.maximum+" atriði"},noResults:function(){return"Ekkert fannst"},searching:function(){return"Leita…"},removeAllItems:function(){return"Fjarlægðu öll atriði"}}}),n.define,n.require}();
--------------------------------------------------------------------------------
/staticfiles/admin/js/vendor/select2/i18n/it.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/it",[],function(){return{errorLoading:function(){return"I risultati non possono essere caricati."},inputTooLong:function(e){var n=e.input.length-e.maximum,t="Per favore cancella "+n+" caratter";return t+=1!==n?"i":"e"},inputTooShort:function(e){return"Per favore inserisci "+(e.minimum-e.input.length)+" o più caratteri"},loadingMore:function(){return"Caricando più risultati…"},maximumSelected:function(e){var n="Puoi selezionare solo "+e.maximum+" element";return 1!==e.maximum?n+="i":n+="o",n},noResults:function(){return"Nessun risultato trovato"},searching:function(){return"Sto cercando…"},removeAllItems:function(){return"Rimuovi tutti gli oggetti"}}}),e.define,e.require}();
--------------------------------------------------------------------------------
/staticfiles/admin/js/vendor/select2/i18n/ja.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/ja",[],function(){return{errorLoading:function(){return"結果が読み込まれませんでした"},inputTooLong:function(n){return n.input.length-n.maximum+" 文字を削除してください"},inputTooShort:function(n){return"少なくとも "+(n.minimum-n.input.length)+" 文字を入力してください"},loadingMore:function(){return"読み込み中…"},maximumSelected:function(n){return n.maximum+" 件しか選択できません"},noResults:function(){return"対象が見つかりません"},searching:function(){return"検索しています…"},removeAllItems:function(){return"すべてのアイテムを削除"}}}),n.define,n.require}();
--------------------------------------------------------------------------------
/staticfiles/admin/js/vendor/select2/i18n/ka.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/ka",[],function(){return{errorLoading:function(){return"მონაცემების ჩატვირთვა შეუძლებელია."},inputTooLong:function(n){return"გთხოვთ აკრიფეთ "+(n.input.length-n.maximum)+" სიმბოლოთი ნაკლები"},inputTooShort:function(n){return"გთხოვთ აკრიფეთ "+(n.minimum-n.input.length)+" სიმბოლო ან მეტი"},loadingMore:function(){return"მონაცემების ჩატვირთვა…"},maximumSelected:function(n){return"თქვენ შეგიძლიათ აირჩიოთ არაუმეტეს "+n.maximum+" ელემენტი"},noResults:function(){return"რეზულტატი არ მოიძებნა"},searching:function(){return"ძიება…"},removeAllItems:function(){return"ამოიღე ყველა ელემენტი"}}}),n.define,n.require}();
--------------------------------------------------------------------------------
/staticfiles/admin/js/vendor/select2/i18n/km.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/km",[],function(){return{errorLoading:function(){return"មិនអាចទាញយកទិន្នន័យ"},inputTooLong:function(n){return"សូមលុបចេញ "+(n.input.length-n.maximum)+" អក្សរ"},inputTooShort:function(n){return"សូមបញ្ចូល"+(n.minimum-n.input.length)+" អក្សរ រឺ ច្រើនជាងនេះ"},loadingMore:function(){return"កំពុងទាញយកទិន្នន័យបន្ថែម..."},maximumSelected:function(n){return"អ្នកអាចជ្រើសរើសបានតែ "+n.maximum+" ជម្រើសប៉ុណ្ណោះ"},noResults:function(){return"មិនមានលទ្ធផល"},searching:function(){return"កំពុងស្វែងរក..."},removeAllItems:function(){return"លុបធាតុទាំងអស់"}}}),n.define,n.require}();
--------------------------------------------------------------------------------
/staticfiles/admin/js/vendor/select2/i18n/ko.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/ko",[],function(){return{errorLoading:function(){return"결과를 불러올 수 없습니다."},inputTooLong:function(n){return"너무 깁니다. "+(n.input.length-n.maximum)+" 글자 지워주세요."},inputTooShort:function(n){return"너무 짧습니다. "+(n.minimum-n.input.length)+" 글자 더 입력해주세요."},loadingMore:function(){return"불러오는 중…"},maximumSelected:function(n){return"최대 "+n.maximum+"개까지만 선택 가능합니다."},noResults:function(){return"결과가 없습니다."},searching:function(){return"검색 중…"},removeAllItems:function(){return"모든 항목 삭제"}}}),n.define,n.require}();
--------------------------------------------------------------------------------
/staticfiles/admin/js/vendor/select2/i18n/lt.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/lt",[],function(){function n(n,e,i,t){return n%10==1&&(n%100<11||n%100>19)?e:n%10>=2&&n%10<=9&&(n%100<11||n%100>19)?i:t}return{inputTooLong:function(e){var i=e.input.length-e.maximum,t="Pašalinkite "+i+" simbol";return t+=n(i,"į","ius","ių")},inputTooShort:function(e){var i=e.minimum-e.input.length,t="Įrašykite dar "+i+" simbol";return t+=n(i,"į","ius","ių")},loadingMore:function(){return"Kraunama daugiau rezultatų…"},maximumSelected:function(e){var i="Jūs galite pasirinkti tik "+e.maximum+" element";return i+=n(e.maximum,"ą","us","ų")},noResults:function(){return"Atitikmenų nerasta"},searching:function(){return"Ieškoma…"},removeAllItems:function(){return"Pašalinti visus elementus"}}}),n.define,n.require}();
--------------------------------------------------------------------------------
/staticfiles/admin/js/vendor/select2/i18n/lv.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/lv",[],function(){function e(e,n,u,i){return 11===e?n:e%10==1?u:i}return{inputTooLong:function(n){var u=n.input.length-n.maximum,i="Lūdzu ievadiet par "+u;return(i+=" simbol"+e(u,"iem","u","iem"))+" mazāk"},inputTooShort:function(n){var u=n.minimum-n.input.length,i="Lūdzu ievadiet vēl "+u;return i+=" simbol"+e(u,"us","u","us")},loadingMore:function(){return"Datu ielāde…"},maximumSelected:function(n){var u="Jūs varat izvēlēties ne vairāk kā "+n.maximum;return u+=" element"+e(n.maximum,"us","u","us")},noResults:function(){return"Sakritību nav"},searching:function(){return"Meklēšana…"},removeAllItems:function(){return"Noņemt visus vienumus"}}}),e.define,e.require}();
--------------------------------------------------------------------------------
/staticfiles/admin/js/vendor/select2/i18n/mk.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/mk",[],function(){return{inputTooLong:function(n){var e=(n.input.length,n.maximum,"Ве молиме внесете "+n.maximum+" помалку карактер");return 1!==n.maximum&&(e+="и"),e},inputTooShort:function(n){var e=(n.minimum,n.input.length,"Ве молиме внесете уште "+n.maximum+" карактер");return 1!==n.maximum&&(e+="и"),e},loadingMore:function(){return"Вчитување резултати…"},maximumSelected:function(n){var e="Можете да изберете само "+n.maximum+" ставк";return 1===n.maximum?e+="а":e+="и",e},noResults:function(){return"Нема пронајдено совпаѓања"},searching:function(){return"Пребарување…"},removeAllItems:function(){return"Отстрани ги сите предмети"}}}),n.define,n.require}();
--------------------------------------------------------------------------------
/staticfiles/admin/js/vendor/select2/i18n/ms.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/ms",[],function(){return{errorLoading:function(){return"Keputusan tidak berjaya dimuatkan."},inputTooLong:function(n){return"Sila hapuskan "+(n.input.length-n.maximum)+" aksara"},inputTooShort:function(n){return"Sila masukkan "+(n.minimum-n.input.length)+" atau lebih aksara"},loadingMore:function(){return"Sedang memuatkan keputusan…"},maximumSelected:function(n){return"Anda hanya boleh memilih "+n.maximum+" pilihan"},noResults:function(){return"Tiada padanan yang ditemui"},searching:function(){return"Mencari…"},removeAllItems:function(){return"Keluarkan semua item"}}}),n.define,n.require}();
--------------------------------------------------------------------------------
/staticfiles/admin/js/vendor/select2/i18n/nb.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/nb",[],function(){return{errorLoading:function(){return"Kunne ikke hente resultater."},inputTooLong:function(e){return"Vennligst fjern "+(e.input.length-e.maximum)+" tegn"},inputTooShort:function(e){return"Vennligst skriv inn "+(e.minimum-e.input.length)+" tegn til"},loadingMore:function(){return"Laster flere resultater…"},maximumSelected:function(e){return"Du kan velge maks "+e.maximum+" elementer"},noResults:function(){return"Ingen treff"},searching:function(){return"Søker…"},removeAllItems:function(){return"Fjern alle elementer"}}}),e.define,e.require}();
--------------------------------------------------------------------------------
/staticfiles/admin/js/vendor/select2/i18n/ne.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/ne",[],function(){return{errorLoading:function(){return"नतिजाहरु देखाउन सकिएन।"},inputTooLong:function(n){var e=n.input.length-n.maximum,u="कृपया "+e+" अक्षर मेटाउनुहोस्।";return 1!=e&&(u+="कृपया "+e+" अक्षरहरु मेटाउनुहोस्।"),u},inputTooShort:function(n){return"कृपया बाँकी रहेका "+(n.minimum-n.input.length)+" वा अरु धेरै अक्षरहरु भर्नुहोस्।"},loadingMore:function(){return"अरु नतिजाहरु भरिँदैछन् …"},maximumSelected:function(n){var e="तँपाई "+n.maximum+" वस्तु मात्र छान्न पाउँनुहुन्छ।";return 1!=n.maximum&&(e="तँपाई "+n.maximum+" वस्तुहरु मात्र छान्न पाउँनुहुन्छ।"),e},noResults:function(){return"कुनै पनि नतिजा भेटिएन।"},searching:function(){return"खोजि हुँदैछ…"}}}),n.define,n.require}();
--------------------------------------------------------------------------------
/staticfiles/admin/js/vendor/select2/i18n/nl.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/nl",[],function(){return{errorLoading:function(){return"De resultaten konden niet worden geladen."},inputTooLong:function(e){return"Gelieve "+(e.input.length-e.maximum)+" karakters te verwijderen"},inputTooShort:function(e){return"Gelieve "+(e.minimum-e.input.length)+" of meer karakters in te voeren"},loadingMore:function(){return"Meer resultaten laden…"},maximumSelected:function(e){var n=1==e.maximum?"kan":"kunnen",r="Er "+n+" maar "+e.maximum+" item";return 1!=e.maximum&&(r+="s"),r+=" worden geselecteerd"},noResults:function(){return"Geen resultaten gevonden…"},searching:function(){return"Zoeken…"},removeAllItems:function(){return"Verwijder alle items"}}}),e.define,e.require}();
--------------------------------------------------------------------------------
/staticfiles/admin/js/vendor/select2/i18n/pl.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/pl",[],function(){var n=["znak","znaki","znaków"],e=["element","elementy","elementów"],r=function(n,e){return 1===n?e[0]:n>1&&n<=4?e[1]:n>=5?e[2]:void 0};return{errorLoading:function(){return"Nie można załadować wyników."},inputTooLong:function(e){var t=e.input.length-e.maximum;return"Usuń "+t+" "+r(t,n)},inputTooShort:function(e){var t=e.minimum-e.input.length;return"Podaj przynajmniej "+t+" "+r(t,n)},loadingMore:function(){return"Trwa ładowanie…"},maximumSelected:function(n){return"Możesz zaznaczyć tylko "+n.maximum+" "+r(n.maximum,e)},noResults:function(){return"Brak wyników"},searching:function(){return"Trwa wyszukiwanie…"},removeAllItems:function(){return"Usuń wszystkie przedmioty"}}}),n.define,n.require}();
--------------------------------------------------------------------------------
/staticfiles/admin/js/vendor/select2/i18n/ps.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/ps",[],function(){return{errorLoading:function(){return"پايلي نه سي ترلاسه کېدای"},inputTooLong:function(n){var e=n.input.length-n.maximum,r="د مهربانۍ لمخي "+e+" توری ړنګ کړئ";return 1!=e&&(r=r.replace("توری","توري")),r},inputTooShort:function(n){return"لږ تر لږه "+(n.minimum-n.input.length)+" يا ډېر توري وليکئ"},loadingMore:function(){return"نوري پايلي ترلاسه کيږي..."},maximumSelected:function(n){var e="تاسو يوازي "+n.maximum+" قلم په نښه کولای سی";return 1!=n.maximum&&(e=e.replace("قلم","قلمونه")),e},noResults:function(){return"پايلي و نه موندل سوې"},searching:function(){return"لټول کيږي..."},removeAllItems:function(){return"ټول توکي لرې کړئ"}}}),n.define,n.require}();
--------------------------------------------------------------------------------
/staticfiles/admin/js/vendor/select2/i18n/pt-BR.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/pt-BR",[],function(){return{errorLoading:function(){return"Os resultados não puderam ser carregados."},inputTooLong:function(e){var n=e.input.length-e.maximum,r="Apague "+n+" caracter";return 1!=n&&(r+="es"),r},inputTooShort:function(e){return"Digite "+(e.minimum-e.input.length)+" ou mais caracteres"},loadingMore:function(){return"Carregando mais resultados…"},maximumSelected:function(e){var n="Você só pode selecionar "+e.maximum+" ite";return 1==e.maximum?n+="m":n+="ns",n},noResults:function(){return"Nenhum resultado encontrado"},searching:function(){return"Buscando…"},removeAllItems:function(){return"Remover todos os itens"}}}),e.define,e.require}();
--------------------------------------------------------------------------------
/staticfiles/admin/js/vendor/select2/i18n/pt.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/pt",[],function(){return{errorLoading:function(){return"Os resultados não puderam ser carregados."},inputTooLong:function(e){var r=e.input.length-e.maximum,n="Por favor apague "+r+" ";return n+=1!=r?"caracteres":"caractere"},inputTooShort:function(e){return"Introduza "+(e.minimum-e.input.length)+" ou mais caracteres"},loadingMore:function(){return"A carregar mais resultados…"},maximumSelected:function(e){var r="Apenas pode seleccionar "+e.maximum+" ";return r+=1!=e.maximum?"itens":"item"},noResults:function(){return"Sem resultados"},searching:function(){return"A procurar…"},removeAllItems:function(){return"Remover todos os itens"}}}),e.define,e.require}();
--------------------------------------------------------------------------------
/staticfiles/admin/js/vendor/select2/i18n/ro.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/ro",[],function(){return{errorLoading:function(){return"Rezultatele nu au putut fi incărcate."},inputTooLong:function(e){var t=e.input.length-e.maximum,n="Vă rugăm să ștergeți"+t+" caracter";return 1!==t&&(n+="e"),n},inputTooShort:function(e){return"Vă rugăm să introduceți "+(e.minimum-e.input.length)+" sau mai multe caractere"},loadingMore:function(){return"Se încarcă mai multe rezultate…"},maximumSelected:function(e){var t="Aveți voie să selectați cel mult "+e.maximum;return t+=" element",1!==e.maximum&&(t+="e"),t},noResults:function(){return"Nu au fost găsite rezultate"},searching:function(){return"Căutare…"},removeAllItems:function(){return"Eliminați toate elementele"}}}),e.define,e.require}();
--------------------------------------------------------------------------------
/staticfiles/admin/js/vendor/select2/i18n/ru.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/ru",[],function(){function n(n,e,r,u){return n%10<5&&n%10>0&&n%100<5||n%100>20?n%10>1?r:e:u}return{errorLoading:function(){return"Невозможно загрузить результаты"},inputTooLong:function(e){var r=e.input.length-e.maximum,u="Пожалуйста, введите на "+r+" символ";return u+=n(r,"","a","ов"),u+=" меньше"},inputTooShort:function(e){var r=e.minimum-e.input.length,u="Пожалуйста, введите ещё хотя бы "+r+" символ";return u+=n(r,"","a","ов")},loadingMore:function(){return"Загрузка данных…"},maximumSelected:function(e){var r="Вы можете выбрать не более "+e.maximum+" элемент";return r+=n(e.maximum,"","a","ов")},noResults:function(){return"Совпадений не найдено"},searching:function(){return"Поиск…"},removeAllItems:function(){return"Удалить все элементы"}}}),n.define,n.require}();
--------------------------------------------------------------------------------
/staticfiles/admin/js/vendor/select2/i18n/sk.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/sk",[],function(){var e={2:function(e){return e?"dva":"dve"},3:function(){return"tri"},4:function(){return"štyri"}};return{errorLoading:function(){return"Výsledky sa nepodarilo načítať."},inputTooLong:function(n){var t=n.input.length-n.maximum;return 1==t?"Prosím, zadajte o jeden znak menej":t>=2&&t<=4?"Prosím, zadajte o "+e[t](!0)+" znaky menej":"Prosím, zadajte o "+t+" znakov menej"},inputTooShort:function(n){var t=n.minimum-n.input.length;return 1==t?"Prosím, zadajte ešte jeden znak":t<=4?"Prosím, zadajte ešte ďalšie "+e[t](!0)+" znaky":"Prosím, zadajte ešte ďalších "+t+" znakov"},loadingMore:function(){return"Načítanie ďalších výsledkov…"},maximumSelected:function(n){return 1==n.maximum?"Môžete zvoliť len jednu položku":n.maximum>=2&&n.maximum<=4?"Môžete zvoliť najviac "+e[n.maximum](!1)+" položky":"Môžete zvoliť najviac "+n.maximum+" položiek"},noResults:function(){return"Nenašli sa žiadne položky"},searching:function(){return"Vyhľadávanie…"},removeAllItems:function(){return"Odstráňte všetky položky"}}}),e.define,e.require}();
--------------------------------------------------------------------------------
/staticfiles/admin/js/vendor/select2/i18n/sl.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/sl",[],function(){return{errorLoading:function(){return"Zadetkov iskanja ni bilo mogoče naložiti."},inputTooLong:function(e){var n=e.input.length-e.maximum,t="Prosim zbrišite "+n+" znak";return 2==n?t+="a":1!=n&&(t+="e"),t},inputTooShort:function(e){var n=e.minimum-e.input.length,t="Prosim vpišite še "+n+" znak";return 2==n?t+="a":1!=n&&(t+="e"),t},loadingMore:function(){return"Nalagam več zadetkov…"},maximumSelected:function(e){var n="Označite lahko največ "+e.maximum+" predmet";return 2==e.maximum?n+="a":1!=e.maximum&&(n+="e"),n},noResults:function(){return"Ni zadetkov."},searching:function(){return"Iščem…"},removeAllItems:function(){return"Odstranite vse elemente"}}}),e.define,e.require}();
--------------------------------------------------------------------------------
/staticfiles/admin/js/vendor/select2/i18n/sq.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/sq",[],function(){return{errorLoading:function(){return"Rezultatet nuk mund të ngarkoheshin."},inputTooLong:function(e){var n=e.input.length-e.maximum,t="Të lutem fshi "+n+" karakter";return 1!=n&&(t+="e"),t},inputTooShort:function(e){return"Të lutem shkruaj "+(e.minimum-e.input.length)+" ose më shumë karaktere"},loadingMore:function(){return"Duke ngarkuar më shumë rezultate…"},maximumSelected:function(e){var n="Mund të zgjedhësh vetëm "+e.maximum+" element";return 1!=e.maximum&&(n+="e"),n},noResults:function(){return"Nuk u gjet asnjë rezultat"},searching:function(){return"Duke kërkuar…"},removeAllItems:function(){return"Hiq të gjitha sendet"}}}),e.define,e.require}();
--------------------------------------------------------------------------------
/staticfiles/admin/js/vendor/select2/i18n/sr-Cyrl.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/sr-Cyrl",[],function(){function n(n,e,r,u){return n%10==1&&n%100!=11?e:n%10>=2&&n%10<=4&&(n%100<12||n%100>14)?r:u}return{errorLoading:function(){return"Преузимање није успело."},inputTooLong:function(e){var r=e.input.length-e.maximum,u="Обришите "+r+" симбол";return u+=n(r,"","а","а")},inputTooShort:function(e){var r=e.minimum-e.input.length,u="Укуцајте бар још "+r+" симбол";return u+=n(r,"","а","а")},loadingMore:function(){return"Преузимање још резултата…"},maximumSelected:function(e){var r="Можете изабрати само "+e.maximum+" ставк";return r+=n(e.maximum,"у","е","и")},noResults:function(){return"Ништа није пронађено"},searching:function(){return"Претрага…"},removeAllItems:function(){return"Уклоните све ставке"}}}),n.define,n.require}();
--------------------------------------------------------------------------------
/staticfiles/admin/js/vendor/select2/i18n/sr.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/sr",[],function(){function n(n,e,r,t){return n%10==1&&n%100!=11?e:n%10>=2&&n%10<=4&&(n%100<12||n%100>14)?r:t}return{errorLoading:function(){return"Preuzimanje nije uspelo."},inputTooLong:function(e){var r=e.input.length-e.maximum,t="Obrišite "+r+" simbol";return t+=n(r,"","a","a")},inputTooShort:function(e){var r=e.minimum-e.input.length,t="Ukucajte bar još "+r+" simbol";return t+=n(r,"","a","a")},loadingMore:function(){return"Preuzimanje još rezultata…"},maximumSelected:function(e){var r="Možete izabrati samo "+e.maximum+" stavk";return r+=n(e.maximum,"u","e","i")},noResults:function(){return"Ništa nije pronađeno"},searching:function(){return"Pretraga…"},removeAllItems:function(){return"Уклоните све ставке"}}}),n.define,n.require}();
--------------------------------------------------------------------------------
/staticfiles/admin/js/vendor/select2/i18n/sv.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/sv",[],function(){return{errorLoading:function(){return"Resultat kunde inte laddas."},inputTooLong:function(n){return"Vänligen sudda ut "+(n.input.length-n.maximum)+" tecken"},inputTooShort:function(n){return"Vänligen skriv in "+(n.minimum-n.input.length)+" eller fler tecken"},loadingMore:function(){return"Laddar fler resultat…"},maximumSelected:function(n){return"Du kan max välja "+n.maximum+" element"},noResults:function(){return"Inga träffar"},searching:function(){return"Söker…"},removeAllItems:function(){return"Ta bort alla objekt"}}}),n.define,n.require}();
--------------------------------------------------------------------------------
/staticfiles/admin/js/vendor/select2/i18n/th.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/th",[],function(){return{errorLoading:function(){return"ไม่สามารถค้นข้อมูลได้"},inputTooLong:function(n){return"โปรดลบออก "+(n.input.length-n.maximum)+" ตัวอักษร"},inputTooShort:function(n){return"โปรดพิมพ์เพิ่มอีก "+(n.minimum-n.input.length)+" ตัวอักษร"},loadingMore:function(){return"กำลังค้นข้อมูลเพิ่ม…"},maximumSelected:function(n){return"คุณสามารถเลือกได้ไม่เกิน "+n.maximum+" รายการ"},noResults:function(){return"ไม่พบข้อมูล"},searching:function(){return"กำลังค้นข้อมูล…"},removeAllItems:function(){return"ลบรายการทั้งหมด"}}}),n.define,n.require}();
--------------------------------------------------------------------------------
/staticfiles/admin/js/vendor/select2/i18n/tk.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var e=jQuery.fn.select2.amd;e.define("select2/i18n/tk",[],function(){return{errorLoading:function(){return"Netije ýüklenmedi."},inputTooLong:function(e){return e.input.length-e.maximum+" harp bozuň."},inputTooShort:function(e){return"Ýene-de iň az "+(e.minimum-e.input.length)+" harp ýazyň."},loadingMore:function(){return"Köpräk netije görkezilýär…"},maximumSelected:function(e){return"Diňe "+e.maximum+" sanysyny saýlaň."},noResults:function(){return"Netije tapylmady."},searching:function(){return"Gözlenýär…"},removeAllItems:function(){return"Remove all items"}}}),e.define,e.require}();
--------------------------------------------------------------------------------
/staticfiles/admin/js/vendor/select2/i18n/tr.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/tr",[],function(){return{errorLoading:function(){return"Sonuç yüklenemedi"},inputTooLong:function(n){return n.input.length-n.maximum+" karakter daha girmelisiniz"},inputTooShort:function(n){return"En az "+(n.minimum-n.input.length)+" karakter daha girmelisiniz"},loadingMore:function(){return"Daha fazla…"},maximumSelected:function(n){return"Sadece "+n.maximum+" seçim yapabilirsiniz"},noResults:function(){return"Sonuç bulunamadı"},searching:function(){return"Aranıyor…"},removeAllItems:function(){return"Tüm öğeleri kaldır"}}}),n.define,n.require}();
--------------------------------------------------------------------------------
/staticfiles/admin/js/vendor/select2/i18n/uk.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/uk",[],function(){function n(n,e,u,r){return n%100>10&&n%100<15?r:n%10==1?e:n%10>1&&n%10<5?u:r}return{errorLoading:function(){return"Неможливо завантажити результати"},inputTooLong:function(e){return"Будь ласка, видаліть "+(e.input.length-e.maximum)+" "+n(e.maximum,"літеру","літери","літер")},inputTooShort:function(n){return"Будь ласка, введіть "+(n.minimum-n.input.length)+" або більше літер"},loadingMore:function(){return"Завантаження інших результатів…"},maximumSelected:function(e){return"Ви можете вибрати лише "+e.maximum+" "+n(e.maximum,"пункт","пункти","пунктів")},noResults:function(){return"Нічого не знайдено"},searching:function(){return"Пошук…"},removeAllItems:function(){return"Видалити всі елементи"}}}),n.define,n.require}();
--------------------------------------------------------------------------------
/staticfiles/admin/js/vendor/select2/i18n/vi.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/vi",[],function(){return{inputTooLong:function(n){return"Vui lòng xóa bớt "+(n.input.length-n.maximum)+" ký tự"},inputTooShort:function(n){return"Vui lòng nhập thêm từ "+(n.minimum-n.input.length)+" ký tự trở lên"},loadingMore:function(){return"Đang lấy thêm kết quả…"},maximumSelected:function(n){return"Chỉ có thể chọn được "+n.maximum+" lựa chọn"},noResults:function(){return"Không tìm thấy kết quả"},searching:function(){return"Đang tìm…"},removeAllItems:function(){return"Xóa tất cả các mục"}}}),n.define,n.require}();
--------------------------------------------------------------------------------
/staticfiles/admin/js/vendor/select2/i18n/zh-CN.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/zh-CN",[],function(){return{errorLoading:function(){return"无法载入结果。"},inputTooLong:function(n){return"请删除"+(n.input.length-n.maximum)+"个字符"},inputTooShort:function(n){return"请再输入至少"+(n.minimum-n.input.length)+"个字符"},loadingMore:function(){return"载入更多结果…"},maximumSelected:function(n){return"最多只能选择"+n.maximum+"个项目"},noResults:function(){return"未找到结果"},searching:function(){return"搜索中…"},removeAllItems:function(){return"删除所有项目"}}}),n.define,n.require}();
--------------------------------------------------------------------------------
/staticfiles/admin/js/vendor/select2/i18n/zh-TW.js:
--------------------------------------------------------------------------------
1 | /*! Select2 4.0.13 | https://github.com/select2/select2/blob/master/LICENSE.md */
2 |
3 | !function(){if(jQuery&&jQuery.fn&&jQuery.fn.select2&&jQuery.fn.select2.amd)var n=jQuery.fn.select2.amd;n.define("select2/i18n/zh-TW",[],function(){return{inputTooLong:function(n){return"請刪掉"+(n.input.length-n.maximum)+"個字元"},inputTooShort:function(n){return"請再輸入"+(n.minimum-n.input.length)+"個字元"},loadingMore:function(){return"載入中…"},maximumSelected:function(n){return"你只能選擇最多"+n.maximum+"項"},noResults:function(){return"沒有找到相符的項目"},searching:function(){return"搜尋中…"},removeAllItems:function(){return"刪除所有項目"}}}),n.define,n.require}();
--------------------------------------------------------------------------------
/staticfiles/admin/js/vendor/xregexp/LICENSE.txt:
--------------------------------------------------------------------------------
1 | The MIT License
2 |
3 | Copyright (c) 2007-present Steven Levithan
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
13 | all 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
21 | THE SOFTWARE.
22 |
--------------------------------------------------------------------------------
/staticfiles/css/base.css:
--------------------------------------------------------------------------------
1 | .watermark {
2 | position: fixed;
3 | opacity: 0.1;
4 | font-size: 128px;
5 | width: 100%;
6 | text-align: center;
7 | z-index: 1000;
8 | pointer-events: none;
9 | }
10 |
11 | .reveal .katex {
12 | font-size: 100%;
13 | }
14 |
15 | red { color: red; }
16 | green { color: green; }
17 | blue { color: blue; }
18 |
19 | .codehilite .hll { background-color: #ffffcc }
20 | .codehilite .c { color: #408080; font-style: italic } /* Comment */
21 | .codehilite .err { border: 1px solid #FF0000 } /* Error */
22 | .codehilite .k { color: #008000; font-weight: bold } /* Keyword */
23 | .codehilite .o { color: #666666 } /* Operator */
24 | .codehilite .ch { color: #408080; font-style: italic } /* Comment.Hashbang */
25 | .codehilite .cm { color: #408080; font-style: italic } /* Comment.Multiline */
26 | .codehilite .cp { color: #BC7A00 } /* Comment.Preproc */
27 | .codehilite .cpf { color: #408080; font-style: italic } /* Comment.PreprocFile */
28 | .codehilite .c1 { color: #408080; font-style: italic } /* Comment.Single */
29 | .codehilite .cs { color: #408080; font-style: italic } /* Comment.Special */
30 | .codehilite .gd { color: #A00000 } /* Generic.Deleted */
31 | .codehilite .ge { font-style: italic } /* Generic.Emph */
32 | .codehilite .gr { color: #FF0000 } /* Generic.Error */
33 | .codehilite .gh { color: #000080; font-weight: bold } /* Generic.Heading */
34 | .codehilite .gi { color: #00A000 } /* Generic.Inserted */
35 | .codehilite .go { color: #888888 } /* Generic.Output */
36 | .codehilite .gp { color: #000080; font-weight: bold } /* Generic.Prompt */
37 | .codehilite .gs { font-weight: bold } /* Generic.Strong */
38 | .codehilite .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
39 | .codehilite .gt { color: #0044DD } /* Generic.Traceback */
40 | .codehilite .kc { color: #008000; font-weight: bold } /* Keyword.Constant */
41 | .codehilite .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */
42 | .codehilite .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */
43 | .codehilite .kp { color: #008000 } /* Keyword.Pseudo */
44 | .codehilite .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */
45 | .codehilite .kt { color: #B00040 } /* Keyword.Type */
46 | .codehilite .m { color: #666666 } /* Literal.Number */
47 | .codehilite .s { color: #BA2121 } /* Literal.String */
48 | .codehilite .na { color: #7D9029 } /* Name.Attribute */
49 | .codehilite .nb { color: #008000 } /* Name.Builtin */
50 | .codehilite .nc { color: #0000FF; font-weight: bold } /* Name.Class */
51 | .codehilite .no { color: #880000 } /* Name.Constant */
52 | .codehilite .nd { color: #AA22FF } /* Name.Decorator */
53 | .codehilite .ni { color: #999999; font-weight: bold } /* Name.Entity */
54 | .codehilite .ne { color: #D2413A; font-weight: bold } /* Name.Exception */
55 | .codehilite .nf { color: #0000FF } /* Name.Function */
56 | .codehilite .nl { color: #A0A000 } /* Name.Label */
57 | .codehilite .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */
58 | .codehilite .nt { color: #008000; font-weight: bold } /* Name.Tag */
59 | .codehilite .nv { color: #19177C } /* Name.Variable */
60 | .codehilite .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */
61 | .codehilite .w { color: #bbbbbb } /* Text.Whitespace */
62 | .codehilite .mb { color: #666666 } /* Literal.Number.Bin */
63 | .codehilite .mf { color: #666666 } /* Literal.Number.Float */
64 | .codehilite .mh { color: #666666 } /* Literal.Number.Hex */
65 | .codehilite .mi { color: #666666 } /* Literal.Number.Integer */
66 | .codehilite .mo { color: #666666 } /* Literal.Number.Oct */
67 | .codehilite .sa { color: #BA2121 } /* Literal.String.Affix */
68 | .codehilite .sb { color: #BA2121 } /* Literal.String.Backtick */
69 | .codehilite .sc { color: #BA2121 } /* Literal.String.Char */
70 | .codehilite .dl { color: #BA2121 } /* Literal.String.Delimiter */
71 | .codehilite .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */
72 | .codehilite .s2 { color: #BA2121 } /* Literal.String.Double */
73 | .codehilite .se { color: #BB6622; font-weight: bold } /* Literal.String.Escape */
74 | .codehilite .sh { color: #BA2121 } /* Literal.String.Heredoc */
75 | .codehilite .si { color: #BB6688; font-weight: bold } /* Literal.String.Interpol */
76 | .codehilite .sx { color: #008000 } /* Literal.String.Other */
77 | .codehilite .sr { color: #BB6688 } /* Literal.String.Regex */
78 | .codehilite .s1 { color: #BA2121 } /* Literal.String.Single */
79 | .codehilite .ss { color: #19177C } /* Literal.String.Symbol */
80 | .codehilite .bp { color: #008000 } /* Name.Builtin.Pseudo */
81 | .codehilite .fm { color: #0000FF } /* Name.Function.Magic */
82 | .codehilite .vc { color: #19177C } /* Name.Variable.Class */
83 | .codehilite .vg { color: #19177C } /* Name.Variable.Global */
84 | .codehilite .vi { color: #19177C } /* Name.Variable.Instance */
85 | .codehilite .vm { color: #19177C } /* Name.Variable.Magic */
86 | .codehilite .il { color: #666666 } /* Literal.Number.Integer.Long */
87 |
--------------------------------------------------------------------------------
/staticfiles/img/GitHub-Mark.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xieyumc/jyySlideWeb/8e7653ac0e97e5910750dd9780c6e9dab25b0a2f/staticfiles/img/GitHub-Mark.png
--------------------------------------------------------------------------------
/staticfiles/img/auto-save.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xieyumc/jyySlideWeb/8e7653ac0e97e5910750dd9780c6e9dab25b0a2f/staticfiles/img/auto-save.png
--------------------------------------------------------------------------------
/staticfiles/img/auto-title.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xieyumc/jyySlideWeb/8e7653ac0e97e5910750dd9780c6e9dab25b0a2f/staticfiles/img/auto-title.jpg
--------------------------------------------------------------------------------
/staticfiles/img/auto-upload-img.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xieyumc/jyySlideWeb/8e7653ac0e97e5910750dd9780c6e9dab25b0a2f/staticfiles/img/auto-upload-img.gif
--------------------------------------------------------------------------------
/staticfiles/img/favicon.avif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xieyumc/jyySlideWeb/8e7653ac0e97e5910750dd9780c6e9dab25b0a2f/staticfiles/img/favicon.avif
--------------------------------------------------------------------------------
/staticfiles/img/fufu.avif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xieyumc/jyySlideWeb/8e7653ac0e97e5910750dd9780c6e9dab25b0a2f/staticfiles/img/fufu.avif
--------------------------------------------------------------------------------
/staticfiles/img/fufu.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xieyumc/jyySlideWeb/8e7653ac0e97e5910750dd9780c6e9dab25b0a2f/staticfiles/img/fufu.jpg
--------------------------------------------------------------------------------
/staticfiles/img/index.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xieyumc/jyySlideWeb/8e7653ac0e97e5910750dd9780c6e9dab25b0a2f/staticfiles/img/index.png
--------------------------------------------------------------------------------
/staticfiles/img/jyySlideWeb.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xieyumc/jyySlideWeb/8e7653ac0e97e5910750dd9780c6e9dab25b0a2f/staticfiles/img/jyySlideWeb.png
--------------------------------------------------------------------------------
/staticfiles/img/public-mode.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xieyumc/jyySlideWeb/8e7653ac0e97e5910750dd9780c6e9dab25b0a2f/staticfiles/img/public-mode.png
--------------------------------------------------------------------------------
/staticfiles/img/realtime-converter.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xieyumc/jyySlideWeb/8e7653ac0e97e5910750dd9780c6e9dab25b0a2f/staticfiles/img/realtime-converter.gif
--------------------------------------------------------------------------------
/staticfiles/img/realtime-preview.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xieyumc/jyySlideWeb/8e7653ac0e97e5910750dd9780c6e9dab25b0a2f/staticfiles/img/realtime-preview.gif
--------------------------------------------------------------------------------
/staticfiles/img/slide-lock.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xieyumc/jyySlideWeb/8e7653ac0e97e5910750dd9780c6e9dab25b0a2f/staticfiles/img/slide-lock.png
--------------------------------------------------------------------------------
/staticfiles/img/yuyupub_analyze1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xieyumc/jyySlideWeb/8e7653ac0e97e5910750dd9780c6e9dab25b0a2f/staticfiles/img/yuyupub_analyze1.png
--------------------------------------------------------------------------------
/staticfiles/img/yuyupub_analyze2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/xieyumc/jyySlideWeb/8e7653ac0e97e5910750dd9780c6e9dab25b0a2f/staticfiles/img/yuyupub_analyze2.png
--------------------------------------------------------------------------------
/staticfiles/jyy/jyy.css:
--------------------------------------------------------------------------------
1 | .reveal .slide-number {
2 | font-size: 26px;
3 | border-radius: 5px;
4 | background-color: rgba(0, 0, 0, .3);
5 | }
6 |
7 | .reveal .slides {
8 | border: 1.5px #ddd solid;
9 | border-radius: 7px;
10 | text-align: left;
11 | font-weight: 300;
12 | }
13 |
14 | .reveal h1,
15 | .reveal h2,
16 | .reveal h3,
17 | .reveal h4 {
18 | font-family: 'Lato', 'SimHei', 'STXihei', 'Sans Serif';
19 | font-weight: 400;
20 | }
21 |
22 | .reveal p,
23 | .reveal li,
24 | .reveal center {
25 | font-size: 32px;
26 | font-family: 'Lato', 'STHeiti', 'SimHei', 'Sans Serif';
27 | }
28 |
29 | .reveal li+li {
30 | margin-top: 10px;
31 | }
32 |
33 | .reveal ul {
34 | display: block;
35 | margin-right: 15px;
36 | }
37 |
38 | .reveal p,
39 | .reveal h1,
40 | .reveal h2,
41 | .reveal h3,
42 | .reveal h4,
43 | .reveal h5 {
44 | padding: 0 25px 0 25px;
45 | }
46 |
47 | .reveal table {
48 | font-size: 32px;
49 | font-family: 'Lato', 'STHeiti', 'SimHei', 'Sans Serif';
50 | margin-top: 15px;
51 | margin-bottom: 15px;
52 | }
53 |
54 | .reveal th {
55 | background-color: #eee;
56 | }
57 |
58 | .reveal tr:nth-child(even) {
59 | background-color: #efffff;
60 | }
61 |
62 | .reveal h1,
63 | .reveal h2,
64 | .reveal h3,
65 | .reveal h4,
66 | .reveal h5,
67 | .reveal h6 {
68 | text-align: left;
69 | margin: 0 0 20px 0;
70 | color: #222;
71 | font-weight: 400;
72 | line-height: 1.2;
73 | letter-spacing: normal;
74 | }
75 |
76 | .reveal h1 {
77 | margin: 0 10 0 10;
78 | font-size: 60px;
79 | }
80 |
81 | .reveal .middle h1 {
82 | text-align: center;
83 | }
84 |
85 | .reveal h2 {
86 | font-size: 48px;
87 | border-bottom: 2px solid rgb(106, 0, 95);
88 | padding-bottom: 5px;
89 | }
90 |
91 | .reveal h3 {
92 | font-size: 1.15em;
93 | }
94 |
95 | .reveal h4 {
96 | font-size: 1.05em;
97 | }
98 |
99 | .reveal .center {
100 | text-align: center;
101 | }
102 |
103 | .reveal .middle {
104 | height: 728px;
105 | display: flex;
106 | align-items: center;
107 | width: 100%;
108 | }
109 |
110 | .reveal pre {
111 | font-size: 28px;
112 |
113 | background-color: #eee;
114 |
115 | border-radius: 3mm;
116 | padding: 10px 10px 10px 10px;
117 | }
118 |
119 | .reveal pre code {
120 | max-height: none;
121 | }
122 |
123 | .reveal code {
124 | font-family: 'Inconsolata', 'STKaiti', 'KaiTi', 'Sans Serif', Monospace;
125 | }
126 |
127 | .reveal .middle blockquote {
128 | text-align: center;
129 | color: rgb(106, 0, 95);
130 | background: none;
131 | box-shadow: none;
132 | }
133 |
134 | .reveal .middle blockquote a {
135 | color: inherit;
136 | }
137 |
138 | .reveal blockquote p,
139 | .reveal blockquote li {
140 | font-family: 'Lato', 'STKaiti', 'KaiTi', 'Sans Serif';
141 | }
142 |
143 | section .center {
144 | display: block;
145 | margin-left: auto;
146 | margin-right: auto;
147 | }
148 |
149 | .reveal .author-block {
150 | margin: 75px 0 35px 0;
151 | }
152 |
153 | .reveal .author-affiliation img {
154 | margin: 15px 0 0 0;
155 | }
156 |
157 | .reveal .author-block p,
158 | .reveal .author-affiliation p {
159 | font-family: 'Kaiti', 'STKaiti', 'Serif', 'Times', 'Times New Roman';
160 | margin-block-start: 0em;
161 | margin-block-end: 0em;
162 | }
163 |
164 | .reveal .author-affiliation {
165 | display: inline-block;
166 | font-size: 90%;
167 | }
168 |
169 | .reveal hr {
170 | border: 10px solid rgba(0, 0, 0, 0);
171 | }
172 |
173 | .reveal li {
174 | margin-top: 10px;
175 | }
--------------------------------------------------------------------------------
/staticfiles/katex/auto-render.min.js:
--------------------------------------------------------------------------------
1 | !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("katex")):"function"==typeof define&&define.amd?define(["katex"],t):"object"==typeof exports?exports.renderMathInElement=t(require("katex")):e.renderMathInElement=t(e.katex)}("undefined"!=typeof self?self:this,(function(e){return function(){"use strict";var t={771:function(t){t.exports=e}},r={};function n(e){var i=r[e];if(void 0!==i)return i.exports;var a=r[e]={exports:{}};return t[e](a,a.exports,n),a.exports}n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,{a:t}),t},n.d=function(e,t){for(var r in t)n.o(t,r)&&!n.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)};var i={};return function(){n.d(i,{default:function(){return s}});var e=n(771),t=n.n(e),r=function(e,t,r){for(var n=r,i=0,a=e.length;n0&&(i.push({type:"text",data:e.slice(0,n)}),e=e.slice(n));var l=t.findIndex((function(t){return e.startsWith(t.left)}));if(-1===(n=r(t[l].right,e,t[l].left.length)))break;var d=e.slice(0,n+t[l].right.length),s=a.test(d)?d:e.slice(t[l].left.length,n);i.push({type:"math",data:s,rawData:d,display:t[l].display}),e=e.slice(n+t[l].right.length)}return""!==e&&i.push({type:"text",data:e}),i},l=function(e,r){var n=o(e,r.delimiters);if(1===n.length&&"text"===n[0].type)return null;for(var i=document.createDocumentFragment(),a=0;a