├── .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 | 6 | -------------------------------------------------------------------------------- /.idea/jyy_slide_web.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 27 | 28 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 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 | 15 | 34 | 36 | 38 | 41 | 42 | 44 | 47 | 48 | 49 | 56 | 63 | 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 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /staticfiles/admin/img/icon-alert.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /staticfiles/admin/img/icon-calendar.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /staticfiles/admin/img/icon-changelink.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /staticfiles/admin/img/icon-clock.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /staticfiles/admin/img/icon-deletelink.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /staticfiles/admin/img/icon-hidelink.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /staticfiles/admin/img/icon-no.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /staticfiles/admin/img/icon-unknown-alt.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /staticfiles/admin/img/icon-unknown.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /staticfiles/admin/img/icon-viewlink.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /staticfiles/admin/img/icon-yes.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /staticfiles/admin/img/inline-delete.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /staticfiles/admin/img/search.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /staticfiles/admin/img/selector-icons.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /staticfiles/admin/img/sorting-icons.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /staticfiles/admin/img/tooltag-add.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /staticfiles/admin/img/tooltag-arrowright.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 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