├── .github └── workflows │ └── docker-image.yml ├── .gitignore ├── Dockerfile ├── LICENSE ├── README.md ├── build.sh ├── docker-compose.yml ├── images ├── 1.png ├── 2.png ├── 3.png ├── 4.png ├── 5.png └── qrcode.jpg ├── nginx.conf ├── server ├── db.sqlite3 ├── manage.py ├── note │ ├── __init__.py │ ├── admin.py │ ├── apps.py │ ├── migrations │ │ ├── 0001_initial.py │ │ ├── 0002_alter_note_creator_alter_notegroup_creator.py │ │ ├── 0003_alter_notegroup_name.py │ │ ├── 0004_alter_note_id_alter_notegroup_id.py │ │ └── __init__.py │ ├── models.py │ ├── serializers.py │ ├── tests.py │ ├── urls.py │ ├── utils.py │ └── views.py ├── oAuth │ ├── __init__.py │ ├── admin.py │ ├── apps.py │ ├── middleware.py │ ├── migrations │ │ ├── 0001_initial.py │ │ ├── 0002_user_last_active_at_user_last_login_at.py │ │ ├── 0003_remove_user_last_login_at.py │ │ ├── 0004_user_note_user_note_group.py │ │ ├── 0005_alter_user_id_alter_user_last_active_at_and_more.py │ │ ├── 0006_alter_user_note_alter_user_note_group.py │ │ ├── 0007_dingtalkconfig_feishuconfig_wechatworkconfig_and_more.py │ │ ├── 0008_rename_wechatworkconfig_wecomconfig_and_more.py │ │ ├── 0009_rename_open_id_wecomuser_wecom_user_id_and_more.py │ │ ├── 0010_alter_user_options_alter_dingtalkconfig_table_and_more.py │ │ ├── 0011_alter_user_role.py │ │ ├── 0012_remove_feishuuser_department_and_more.py │ │ ├── 0013_user_avatar.py │ │ ├── 0014_alter_feishuuser_user.py │ │ ├── 0015_alter_dingtalkuser_user_alter_wecomuser_user.py │ │ ├── 0016_remove_dingtalkconfig_agent_id_and_more.py │ │ ├── 0017_dingtalkconfig_redirect_uri_and_more.py │ │ ├── 0018_githubconfig_githubuser.py │ │ ├── 0019_remove_githubuser_access_token_githubuser_bio_and_more.py │ │ ├── 0020_googleconfig_googleuser_oauthconfig.py │ │ ├── 0021_gitlabconfig_gitlabuser.py │ │ ├── 0022_alter_gitlabconfig_options_and_more.py │ │ ├── 0023_giteeconfig_giteeuser.py │ │ ├── 0024_alter_giteeuser_email.py │ │ └── __init__.py │ ├── models.py │ ├── serializers.py │ ├── tests.py │ ├── urls.py │ ├── utils.py │ ├── utils │ │ ├── __init__.py │ │ ├── dingtalk.py │ │ ├── feishu.py │ │ ├── gitee.py │ │ ├── github.py │ │ ├── gitlab.py │ │ ├── google.py │ │ ├── qrcode.py │ │ └── wecom.py │ └── views.py ├── requirements.txt └── server │ ├── __init__.py │ ├── asgi.py │ ├── settings.py │ ├── urls.py │ └── wsgi.py ├── start.sh └── web ├── .env ├── .env.production ├── .eslintrc.json ├── .gitignore ├── .prettierrc.json ├── dist ├── assets │ ├── Dashboard-C504Kkq_.css │ ├── Dashboard-Cich04gd.js │ ├── Groups-B8-9Ltlc.css │ ├── Groups-BVhdO-V4.js │ ├── Layout-CI0pLUNE.css │ ├── Layout-Cr0tOoz2.js │ ├── Login-C9QUGTxp.js │ ├── Login-DLAaQbDh.css │ ├── NoteEdit-C-i8Hbkk.js │ ├── NoteEdit-pZVGAJdr.css │ ├── NoteView-BNzl7X6j.css │ ├── NoteView-Qajf4pKz.js │ ├── Notes-BE1BEC9W.css │ ├── Notes-BivkNE-X.js │ ├── OAuthCallback-Bkvp4fg4.css │ ├── OAuthCallback-DtNbQLhY.js │ ├── OAuthConfig-DT7JPV2e.css │ ├── OAuthConfig-JJKtRAzl.js │ ├── Users-BO2auTyz.js │ ├── Users-Bakk32z7.css │ ├── apl-B4CMkyY2.js │ ├── asciiarmor-Df11BRmG.js │ ├── asn1-EdZsLKOL.js │ ├── asterisk-B-8jnY81.js │ ├── brainfuck-C4LP7Hcl.js │ ├── clike-Cr_nJiF2.js │ ├── clojure-BMjYHr_A.js │ ├── cmake-BQqOBYOt.js │ ├── cobol-CWcv1MsR.js │ ├── coffeescript-S37ZYGWr.js │ ├── commonlisp-DBKNyK5s.js │ ├── crystal-SjHAIU92.js │ ├── css-BnMrqG3P.js │ ├── cypher-C_CwsFkJ.js │ ├── d-pRatUO7H.js │ ├── diff-DbItnlRl.js │ ├── dingtalk-Bty8SPLc.png │ ├── dockerfile-BU1Ap__c.js │ ├── dtd-DF_7sFjM.js │ ├── dylan-DwRh75JA.js │ ├── ebnf-CDyGwa7X.js │ ├── ecl-Cabwm37j.js │ ├── eiffel-CnydiIhH.js │ ├── elm-vLlmbW-K.js │ ├── erlang-BNw1qcRV.js │ ├── factor-BPndPnYX.js │ ├── fcl-Kvtd6kyn.js │ ├── forth-Ffai-XNe.js │ ├── fortran-DYz_wnZ1.js │ ├── gas-Bneqetm1.js │ ├── gherkin-heZmZLOM.js │ ├── github-BxkoHGo4.js │ ├── groovy-D9Dt4D0W.js │ ├── haskell-BWDZoCOh.js │ ├── haxe-H-WmDvRZ.js │ ├── http-DBlCnlav.js │ ├── idl-BEugSyMb.js │ ├── index-3sg4Vsm0.js │ ├── index-B0F0Xvb5.js │ ├── index-B5aXjft8.js │ ├── index-BCZP89dg.js │ ├── index-BE2vtubI.js │ ├── index-BGbMkkFE.js │ ├── index-BLidx2CW.js │ ├── index-BQnrSvw8.js │ ├── index-BUL7-L5W.js │ ├── index-C9fcZ_Ng.js │ ├── index-Cwc0pJY5.js │ ├── index-DKjOyILR.js │ ├── index-Dd6BTbyf.js │ ├── index-Dm9Fk2tE.js │ ├── index-Oe2EjEMq.js │ ├── index-PZA8vciS.js │ ├── index-cRdoeNWV.css │ ├── index-eUzq-SGh.js │ ├── index-mfA-uD9g.js │ ├── javascript-qCveANmP.js │ ├── jinja2-C4DGRd-O.js │ ├── julia-DuME0IfC.js │ ├── livescript-BwQOo05w.js │ ├── logo-CYe3-jOy.png │ ├── lua-BgMRiT3U.js │ ├── mathematica-DTrFuWx2.js │ ├── mbox-CNhZ1qSd.js │ ├── mirc-CjQqDB4T.js │ ├── mllike-CXdrOF99.js │ ├── modelica-Dc1JOy9r.js │ ├── mscgen-BA5vi2Kp.js │ ├── mumps-BT43cFF4.js │ ├── nginx-DdIZxoE0.js │ ├── nsis-ClDXqMnM.js │ ├── ntriples-BfvgReVJ.js │ ├── octave-Ck1zUtKM.js │ ├── oz-BzwKVEFT.js │ ├── pascal--L3eBynH.js │ ├── perl-CdXCOZ3F.js │ ├── pig-CevX1Tat.js │ ├── powershell-CFHJl5sT.js │ ├── properties-C78fOPTZ.js │ ├── protobuf-ChK-085T.js │ ├── pug-DukmZTjD.js │ ├── puppet-DMA9R1ak.js │ ├── python-BuPzkPfP.js │ ├── q-ZnEupP5q.js │ ├── r-B6wPVr8A.js │ ├── relativeTime-Dd6TU8RK.js │ ├── rpm-CTu-6PCP.js │ ├── ruby-B2Rjki9n.js │ ├── sas-B4kiWyti.js │ ├── scheme-C41bIUwD.js │ ├── shell-CjFT_Tl9.js │ ├── sieve-C3Gn_uJK.js │ ├── simple-mode-CKxFYdZi.js │ ├── smalltalk-CnHTOXQT.js │ ├── solr-DehyRSwq.js │ ├── sparql-DkYu6x3z.js │ ├── spreadsheet-BCZA_wO0.js │ ├── sql-D0XecflT.js │ ├── stex-C3f8Ysf7.js │ ├── style-IFfT69lj.js │ ├── style-zUgFBIlv.css │ ├── stylus-BdAi1jBa.js │ ├── swift-BzpIVaGY.js │ ├── tcl-DVfN8rqt.js │ ├── textile-CnDTJFAw.js │ ├── tiddlywiki-DO-Gjzrf.js │ ├── tiki-DGYXhP31.js │ ├── toml-BXUEaScT.js │ ├── troff-wAsdV37c.js │ ├── ttcn-CfJYG6tj.js │ ├── ttcn-cfg-B9xdYoR4.js │ ├── turtle-B1tBg_DP.js │ ├── vb-CmGdzxic.js │ ├── vbscript-BuJXcnF6.js │ ├── velocity-D8B20fx6.js │ ├── verilog-C6RDOZhf.js │ ├── vhdl-lSbBsy5d.js │ ├── webidl-ZXfAyPTL.js │ ├── wecom-CrDM2Kh5.png │ ├── xquery-CQfU5ijd.js │ ├── yacas-BJ4BC0dw.js │ └── z80-Hz9HOZM7.js ├── favicon.ico ├── index.html ├── logo.png └── note.svg ├── env.d.ts ├── index.html ├── package-lock.json ├── package.json ├── public ├── favicon.ico ├── logo.png └── note.svg ├── src ├── App.vue ├── api │ ├── config.ts │ ├── index.ts │ ├── request.ts │ ├── types.ts │ └── users.ts ├── assets │ ├── dingtalk.png │ ├── feishu.png │ ├── gitee.png │ ├── github.png │ ├── gitlab.png │ ├── google.png │ ├── logo.png │ ├── main.css │ ├── qq.png │ └── wecom.png ├── components │ ├── BaseChart.vue │ ├── NoteDialog.vue │ └── TagNav.vue ├── main.ts ├── router │ └── index.ts ├── store │ └── user.ts ├── types │ └── index.ts └── views │ ├── Dashboard.vue │ ├── Groups.vue │ ├── Layout.vue │ ├── Login.vue │ ├── NoteEdit.vue │ ├── NoteView.vue │ ├── Notes.vue │ └── auth │ ├── Groups.vue │ ├── OAuthCallback.vue │ ├── OAuthConfig.vue │ └── Users.vue ├── tsconfig.json ├── tsconfig.node.json └── vite.config.ts /.github/workflows/docker-image.yml: -------------------------------------------------------------------------------- 1 | name: Build and Push Docker Image 2 | 3 | on: 4 | push: 5 | branches: 6 | - master 7 | pull_request: 8 | branches: 9 | - master 10 | 11 | jobs: 12 | build-and-push: 13 | runs-on: ubuntu-latest 14 | 15 | steps: 16 | - name: Checkout code 17 | uses: actions/checkout@v4 18 | 19 | # 设置 QEMU 以支持多架构 20 | - name: Set up QEMU 21 | uses: docker/setup-qemu-action@v3 22 | 23 | # 设置 Docker Buildx 24 | - name: Set up Docker Buildx 25 | uses: docker/setup-buildx-action@v3 26 | 27 | # 登录 Docker Hub 28 | - name: Log in to Docker Hub 29 | uses: docker/login-action@v3 30 | with: 31 | username: ${{ secrets.DOCKERHUB_USERNAME }} 32 | password: ${{ secrets.DOCKERHUB_TOKEN }} 33 | 34 | # 生成北京时间时间戳 35 | - name: Generate timestamp 36 | id: timestamp 37 | run: echo "TIMESTAMP=$(TZ='Asia/Shanghai' date +%Y%m%d-%H%M%S)" >> $GITHUB_ENV 38 | 39 | # 构建并推送 Docker 镜像(支持 arm64 和 amd64) 40 | - name: Build and push Docker image 41 | uses: docker/build-push-action@v5 42 | with: 43 | context: . 44 | file: ./Dockerfile 45 | platforms: linux/amd64,linux/arm64 # 指定构建 arm64 和 amd64 架构 46 | push: true 47 | tags: | 48 | ${{ secrets.DOCKERHUB_USERNAME }}/beenote:latest 49 | ${{ secrets.DOCKERHUB_USERNAME }}/beenote:${{ env.TIMESTAMP }} 50 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.pyc 2 | beenote/bee/migrations/00* 3 | beenote/oauth/migrations/00* 4 | beenote/.idea/ 5 | beenote/venv/ 6 | node_modules/ 7 | .idea/ -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | # 使用 Python 3.12 基础镜像 2 | FROM python:3.12-slim 3 | 4 | # 设置工作目录 5 | WORKDIR /app 6 | 7 | # 设置环境变量 8 | ENV PYTHONUNBUFFERED=1 \ 9 | PYTHONDONTWRITEBYTECODE=1 \ 10 | TZ=Asia/Shanghai \ 11 | PIP_INDEX_URL=https://mirrors.aliyun.com/pypi/simple/ \ 12 | PIP_TRUSTED_HOST=mirrors.aliyun.com 13 | 14 | # 安装系统依赖和 nginx 15 | RUN apt update && \ 16 | apt install -y --no-install-recommends \ 17 | nginx \ 18 | && rm -rf /var/lib/apt/lists/* 19 | 20 | # 配置 nginx 21 | COPY nginx.conf /etc/nginx/conf.d/default.conf 22 | RUN rm /etc/nginx/sites-enabled/default 23 | RUN ln -sf /dev/stdout /var/log/nginx/access.log \ 24 | && ln -sf /dev/stderr /var/log/nginx/error.log 25 | 26 | # 复制前端构建产物 27 | COPY web/dist/ /app/web/dist/ 28 | 29 | # 复制并安装后端依赖 30 | COPY server/requirements.txt . 31 | RUN pip install --no-cache-dir -r requirements.txt 32 | 33 | # 复制后端代码 34 | COPY server/ . 35 | 36 | # 复制启动脚本 37 | COPY start.sh /start.sh 38 | RUN chmod +x /start.sh 39 | 40 | # 暴露端口 41 | EXPOSE 80 8000 42 | 43 | # 启动命令 44 | ENTRYPOINT ["/start.sh"] -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2 | 3 | 996 License Version 1.0 (Draft) 4 | 5 | Permission is hereby granted to any individual or legal entity 6 | obtaining a copy of this licensed work (including the source code, 7 | documentation and/or related items, hereinafter collectively referred 8 | to as the "licensed work"), free of charge, to deal with the licensed 9 | work for any purpose, including without limitation, the rights to use, 10 | reproduce, prepare derivative works of, distribute and sublicense the 11 | licensed work, subject to the following conditions: 12 | 13 | 1. The individual or the legal entity must conspicuously display, 14 | without modification, this License on each redistributed or derivative 15 | copy of the Licensed Work. 16 | 17 | 2. The individual or the legal entity must strictly comply with all 18 | applicable laws, regulations, rules and standards of the jurisdiction 19 | relating to labor and employment where the individual is physically 20 | located or where the individual was born or naturalized; or where the 21 | legal entity is registered or is operating (whichever is stricter). In 22 | case that the jurisdiction has no such laws, regulations, rules and 23 | standards or its laws, regulations, rules and standards are 24 | unenforceable, the individual or the legal entity are required to 25 | comply with Core International Labor Standards. 26 | 27 | 3. The individual or the legal entity shall not induce or force its 28 | employee(s), whether full-time or part-time, or its independent 29 | contractor(s), in any methods, to agree in oral or written form, to 30 | directly or indirectly restrict, weaken or relinquish his or her 31 | rights or remedies under such laws, regulations, rules and standards 32 | relating to labor and employment as mentioned above, no matter whether 33 | such written or oral agreement are enforceable under the laws of the 34 | said jurisdiction, nor shall such individual or the legal entity 35 | limit, in any methods, the rights of its employee(s) or independent 36 | contractor(s) from reporting or complaining to the copyright holder or 37 | relevant authorities monitoring the compliance of the license about 38 | its violation(s) of the said license. 39 | 40 | THE LICENSED WORK IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 41 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 42 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 43 | IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, 44 | DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 45 | OTHERWISE, ARISING FROM, OUT OF OR IN ANY WAY CONNECTION WITH THE 46 | LICENSED WORK OR THE USE OR OTHER DEALINGS IN THE LICENSED WORK. 47 | -------------------------------------------------------------------------------- /build.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # 设置镜像名称和标签 4 | IMAGE_NAME="beenote" 5 | DOCKER_HUB_USER="xtlyk" 6 | 7 | # 生成时间戳标签 (格式: YYYYMMDD-HHMMSS) 8 | TIMESTAMP_TAG=$(date '+%Y%m%d-%H%M%S') 9 | 10 | # 创建 buildx 构建器 11 | docker buildx create --use --name multi-arch-builder || true 12 | 13 | # 启动构建器 14 | docker buildx inspect multi-arch-builder --bootstrap 15 | 16 | echo "开始构建多架构镜像..." 17 | docker buildx build \ 18 | --platform linux/amd64,linux/arm64 \ 19 | -t ${DOCKER_HUB_USER}/${IMAGE_NAME}:${TIMESTAMP_TAG} \ 20 | -t ${DOCKER_HUB_USER}/${IMAGE_NAME}:latest \ 21 | --push \ 22 | . 23 | 24 | echo "镜像构建完成!" 25 | echo "镜像标签:" 26 | echo "- ${DOCKER_HUB_USER}/${IMAGE_NAME}:${TIMESTAMP_TAG}" 27 | echo "- ${DOCKER_HUB_USER}/${IMAGE_NAME}:latest" 28 | echo "支持的架构: amd64, arm64" 29 | 30 | # 删除构建器 31 | docker buildx rm multi-arch-builder 32 | -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3' 2 | 3 | services: 4 | beenote: 5 | image: xtlyk/beenote:latest 6 | container_name: beenote 7 | # pull_policy: never # 不自动拉取镜像 8 | ports: 9 | - "80:80" # 前端端口 10 | - "8000:8000" # 后端端口 11 | environment: 12 | - TZ=Asia/Shanghai 13 | - DEBUG=0 14 | - DJANGO_SETTINGS_MODULE=server.settings 15 | - BEENOTE_SECRET_KEY=G2afcZy1EZwKIqZ61uV3Nhp1RInSTKZYiVXm5IzF 16 | volumes: 17 | - /data/:/app/data/ # 数据库文件持久化,如开启数据库为初始空状态,需手动创建superuser 18 | restart: always 19 | healthcheck: 20 | test: ["CMD", "curl", "-f", "http://localhost:8000/api/auth/health/?format=json"] 21 | interval: 30s 22 | timeout: 10s 23 | retries: 3 24 | start_period: 40s 25 | -------------------------------------------------------------------------------- /images/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/X-Mars/beenote/0aa5f3743597a6a8345b542cc547f3a6431de647/images/1.png -------------------------------------------------------------------------------- /images/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/X-Mars/beenote/0aa5f3743597a6a8345b542cc547f3a6431de647/images/2.png -------------------------------------------------------------------------------- /images/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/X-Mars/beenote/0aa5f3743597a6a8345b542cc547f3a6431de647/images/3.png -------------------------------------------------------------------------------- /images/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/X-Mars/beenote/0aa5f3743597a6a8345b542cc547f3a6431de647/images/4.png -------------------------------------------------------------------------------- /images/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/X-Mars/beenote/0aa5f3743597a6a8345b542cc547f3a6431de647/images/5.png -------------------------------------------------------------------------------- /images/qrcode.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/X-Mars/beenote/0aa5f3743597a6a8345b542cc547f3a6431de647/images/qrcode.jpg -------------------------------------------------------------------------------- /nginx.conf: -------------------------------------------------------------------------------- 1 | server { 2 | listen 80; 3 | server_name localhost; 4 | 5 | root /app/web/dist; 6 | index index.html; 7 | 8 | # API 代理 9 | location /api/ { 10 | proxy_pass http://localhost:8000/api/; 11 | proxy_set_header Host $host; 12 | proxy_set_header X-Real-IP $remote_addr; 13 | proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 14 | proxy_set_header X-Forwarded-Proto $scheme; 15 | } 16 | 17 | # 静态文件 18 | location / { 19 | try_files $uri $uri/ /index.html; 20 | } 21 | } -------------------------------------------------------------------------------- /server/db.sqlite3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/X-Mars/beenote/0aa5f3743597a6a8345b542cc547f3a6431de647/server/db.sqlite3 -------------------------------------------------------------------------------- /server/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', 'server.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 | -------------------------------------------------------------------------------- /server/note/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/X-Mars/beenote/0aa5f3743597a6a8345b542cc547f3a6431de647/server/note/__init__.py -------------------------------------------------------------------------------- /server/note/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | from .models import Note, NoteGroup 3 | 4 | @admin.register(NoteGroup) 5 | class NoteGroupAdmin(admin.ModelAdmin): 6 | list_display = ('name', 'description', 'creator', 'created_at', 'updated_at') 7 | search_fields = ('name', 'description') 8 | list_filter = ('created_at', 'updated_at') 9 | 10 | @admin.register(Note) 11 | class NoteAdmin(admin.ModelAdmin): 12 | list_display = ('title', 'group', 'creator', 'created_at', 'updated_at') 13 | search_fields = ('title', 'content') 14 | list_filter = ('group', 'created_at', 'updated_at') 15 | -------------------------------------------------------------------------------- /server/note/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class NoteConfig(AppConfig): 5 | default_auto_field = 'django.db.models.BigAutoField' 6 | name = 'note' 7 | -------------------------------------------------------------------------------- /server/note/migrations/0001_initial.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 5.1.4 on 2024-12-29 10:38 2 | 3 | import django.db.models.deletion 4 | from django.conf import settings 5 | from django.db import migrations, models 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | initial = True 11 | 12 | dependencies = [ 13 | migrations.swappable_dependency(settings.AUTH_USER_MODEL), 14 | ] 15 | 16 | operations = [ 17 | migrations.CreateModel( 18 | name='NoteGroup', 19 | fields=[ 20 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 21 | ('name', models.CharField(max_length=100, verbose_name='名称')), 22 | ('description', models.TextField(blank=True, null=True, verbose_name='描述')), 23 | ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), 24 | ('updated_at', models.DateTimeField(auto_now=True, verbose_name='更新时间')), 25 | ('creator', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='created_groups', to=settings.AUTH_USER_MODEL, verbose_name='创建者')), 26 | ], 27 | options={ 28 | 'verbose_name': '笔记分组', 29 | 'verbose_name_plural': '笔记分组', 30 | 'db_table': 'note_group', 31 | 'ordering': ['-created_at'], 32 | }, 33 | ), 34 | migrations.CreateModel( 35 | name='Note', 36 | fields=[ 37 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 38 | ('title', models.CharField(max_length=200, verbose_name='标题')), 39 | ('content', models.TextField(verbose_name='内容')), 40 | ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), 41 | ('updated_at', models.DateTimeField(auto_now=True, verbose_name='更新时间')), 42 | ('creator', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='notes', to=settings.AUTH_USER_MODEL, verbose_name='创建者')), 43 | ('group', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='notes', to='note.notegroup', verbose_name='所属分组')), 44 | ], 45 | options={ 46 | 'verbose_name': '笔记', 47 | 'verbose_name_plural': '笔记', 48 | 'db_table': 'note', 49 | 'ordering': ['-updated_at'], 50 | }, 51 | ), 52 | ] 53 | -------------------------------------------------------------------------------- /server/note/migrations/0002_alter_note_creator_alter_notegroup_creator.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 5.1.4 on 2024-12-30 07:57 2 | 3 | import django.db.models.deletion 4 | from django.conf import settings 5 | from django.db import migrations, models 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ('note', '0001_initial'), 12 | migrations.swappable_dependency(settings.AUTH_USER_MODEL), 13 | ] 14 | 15 | operations = [ 16 | migrations.AlterField( 17 | model_name='note', 18 | name='creator', 19 | field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='notes', to=settings.AUTH_USER_MODEL, verbose_name='创建者'), 20 | ), 21 | migrations.AlterField( 22 | model_name='notegroup', 23 | name='creator', 24 | field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='created_groups', to=settings.AUTH_USER_MODEL, verbose_name='创建者'), 25 | ), 26 | ] 27 | -------------------------------------------------------------------------------- /server/note/migrations/0003_alter_notegroup_name.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 5.1.4 on 2024-12-31 00:35 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('note', '0002_alter_note_creator_alter_notegroup_creator'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='notegroup', 15 | name='name', 16 | field=models.CharField(max_length=100, unique=True, verbose_name='名称'), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /server/note/migrations/0004_alter_note_id_alter_notegroup_id.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 5.1.4 on 2024-12-31 05:30 2 | 3 | import uuid 4 | from django.db import migrations, models 5 | 6 | 7 | class Migration(migrations.Migration): 8 | 9 | dependencies = [ 10 | ('note', '0003_alter_notegroup_name'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AlterField( 15 | model_name='note', 16 | name='id', 17 | field=models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False), 18 | ), 19 | migrations.AlterField( 20 | model_name='notegroup', 21 | name='id', 22 | field=models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False), 23 | ), 24 | ] 25 | -------------------------------------------------------------------------------- /server/note/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/X-Mars/beenote/0aa5f3743597a6a8345b542cc547f3a6431de647/server/note/migrations/__init__.py -------------------------------------------------------------------------------- /server/note/models.py: -------------------------------------------------------------------------------- 1 | import uuid 2 | from django.db import models 3 | from django.conf import settings 4 | 5 | 6 | class NoteGroup(models.Model): 7 | id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) 8 | name = models.CharField('名称', max_length=100, unique=True) 9 | description = models.TextField('描述', blank=True, null=True) 10 | created_at = models.DateTimeField('创建时间', auto_now_add=True) 11 | updated_at = models.DateTimeField('更新时间', auto_now=True) 12 | creator = models.ForeignKey( 13 | settings.AUTH_USER_MODEL, 14 | on_delete=models.SET_NULL, 15 | related_name='created_groups', 16 | verbose_name='创建者', 17 | blank=True, 18 | null=True 19 | ) 20 | 21 | class Meta: 22 | db_table = 'note_group' 23 | verbose_name = '笔记分组' 24 | verbose_name_plural = verbose_name 25 | ordering = ['-created_at'] 26 | 27 | def __str__(self): 28 | return self.name 29 | 30 | 31 | class Note(models.Model): 32 | id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) 33 | title = models.CharField('标题', max_length=200) 34 | content = models.TextField('内容') 35 | group = models.ForeignKey( 36 | NoteGroup, 37 | on_delete=models.CASCADE, 38 | related_name='notes', 39 | verbose_name='所属分组' 40 | ) 41 | creator = models.ForeignKey( 42 | settings.AUTH_USER_MODEL, 43 | on_delete=models.SET_NULL, 44 | related_name='notes', 45 | verbose_name='创建者', 46 | blank=True, 47 | null=True 48 | ) 49 | created_at = models.DateTimeField('创建时间', auto_now_add=True) 50 | updated_at = models.DateTimeField('更新时间', auto_now=True) 51 | 52 | class Meta: 53 | db_table = 'note' 54 | verbose_name = '笔记' 55 | verbose_name_plural = verbose_name 56 | ordering = ['-updated_at'] 57 | 58 | def __str__(self): 59 | return self.title 60 | -------------------------------------------------------------------------------- /server/note/serializers.py: -------------------------------------------------------------------------------- 1 | from rest_framework import serializers 2 | from .models import Note, NoteGroup 3 | from oAuth.serializers import UserSerializer 4 | 5 | class NoteGroupSerializer(serializers.ModelSerializer): 6 | note_count = serializers.SerializerMethodField() 7 | member_count = serializers.SerializerMethodField() 8 | created_at = serializers.DateTimeField(format='%Y-%m-%d %H:%M:%S', read_only=True) 9 | updated_at = serializers.DateTimeField(format='%Y-%m-%d %H:%M:%S', read_only=True) 10 | creator = UserSerializer(read_only=True) 11 | 12 | class Meta: 13 | model = NoteGroup 14 | fields = ['id', 'name', 'description', 'created_at', 'updated_at', 15 | 'note_count', 'member_count', 'creator'] 16 | read_only_fields = ['created_at', 'updated_at', 'creator'] 17 | 18 | def get_note_count(self, obj): 19 | return obj.notes.count() 20 | 21 | def get_member_count(self, obj): 22 | # 暂时返回固定值,后续可以根据实际需求实现 23 | return 1 24 | 25 | class NoteSerializer(serializers.ModelSerializer): 26 | group_detail = NoteGroupSerializer(source='group', read_only=True) 27 | creator = UserSerializer(read_only=True) 28 | created_at = serializers.DateTimeField(format='%Y-%m-%d %H:%M:%S', read_only=True) 29 | updated_at = serializers.DateTimeField(format='%Y-%m-%d %H:%M:%S', read_only=True) 30 | 31 | class Meta: 32 | model = Note 33 | fields = ['id', 'title', 'content', 'group', 'group_detail', 34 | 'creator', 'created_at', 'updated_at'] 35 | read_only_fields = ['created_at', 'updated_at'] -------------------------------------------------------------------------------- /server/note/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /server/note/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path, include 2 | from rest_framework.routers import DefaultRouter 3 | from .views import NoteViewSet, NoteGroupViewSet 4 | 5 | router = DefaultRouter() 6 | router.register('notes', NoteViewSet, basename='note') 7 | router.register('groups', NoteGroupViewSet, basename='group') 8 | 9 | urlpatterns = [ 10 | path('', include(router.urls)), 11 | ] -------------------------------------------------------------------------------- /server/note/utils.py: -------------------------------------------------------------------------------- 1 | from rest_framework.views import exception_handler 2 | from django.core.exceptions import ObjectDoesNotExist 3 | from django.http import Http404 4 | from rest_framework.exceptions import NotFound 5 | 6 | def custom_exception_handler(exc, context): 7 | # 先调用REST framework默认的异常处理 8 | response = exception_handler(exc, context) 9 | 10 | # 如果是404错误,自定义错误消息 11 | if isinstance(exc, (Http404, ObjectDoesNotExist, NotFound)): 12 | response.data = {'detail': '未找到该笔记'} 13 | 14 | return response -------------------------------------------------------------------------------- /server/oAuth/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/X-Mars/beenote/0aa5f3743597a6a8345b542cc547f3a6431de647/server/oAuth/__init__.py -------------------------------------------------------------------------------- /server/oAuth/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class OauthConfig(AppConfig): 5 | default_auto_field = 'django.db.models.BigAutoField' 6 | name = 'oAuth' 7 | -------------------------------------------------------------------------------- /server/oAuth/middleware.py: -------------------------------------------------------------------------------- 1 | from django.utils import timezone 2 | from rest_framework_simplejwt.authentication import JWTAuthentication 3 | 4 | class UserActivityMiddleware: 5 | def __init__(self, get_response): 6 | self.get_response = get_response 7 | self.jwt_auth = JWTAuthentication() 8 | 9 | def __call__(self, request): 10 | try: 11 | # 尝试获取认证用户 12 | auth_result = self.jwt_auth.authenticate(request) 13 | if auth_result: 14 | user, _ = auth_result 15 | # 更新最近活跃时间 16 | user.last_active_at = timezone.now() 17 | user.save(update_fields=['last_active_at']) 18 | except: 19 | pass 20 | 21 | response = self.get_response(request) 22 | return response -------------------------------------------------------------------------------- /server/oAuth/migrations/0001_initial.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 5.1.4 on 2024-12-29 10:06 2 | 3 | import django.contrib.auth.models 4 | import django.contrib.auth.validators 5 | import django.utils.timezone 6 | from django.db import migrations, models 7 | 8 | 9 | class Migration(migrations.Migration): 10 | 11 | initial = True 12 | 13 | dependencies = [ 14 | ('auth', '0012_alter_user_first_name_max_length'), 15 | ] 16 | 17 | operations = [ 18 | migrations.CreateModel( 19 | name='User', 20 | fields=[ 21 | ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 22 | ('password', models.CharField(max_length=128, verbose_name='password')), 23 | ('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')), 24 | ('is_superuser', models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')), 25 | ('username', models.CharField(error_messages={'unique': 'A user with that username already exists.'}, help_text='Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.', max_length=150, unique=True, validators=[django.contrib.auth.validators.UnicodeUsernameValidator()], verbose_name='username')), 26 | ('first_name', models.CharField(blank=True, max_length=150, verbose_name='first name')), 27 | ('last_name', models.CharField(blank=True, max_length=150, verbose_name='last name')), 28 | ('email', models.EmailField(blank=True, max_length=254, verbose_name='email address')), 29 | ('is_staff', models.BooleanField(default=False, help_text='Designates whether the user can log into this admin site.', verbose_name='staff status')), 30 | ('is_active', models.BooleanField(default=True, help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.', verbose_name='active')), 31 | ('date_joined', models.DateTimeField(default=django.utils.timezone.now, verbose_name='date joined')), 32 | ('role', models.CharField(default='user', max_length=20)), 33 | ('created_at', models.DateTimeField(auto_now_add=True)), 34 | ('updated_at', models.DateTimeField(auto_now=True)), 35 | ('groups', models.ManyToManyField(blank=True, help_text='The groups this user belongs to.', related_name='oauth_user_set', related_query_name='oauth_user', to='auth.group', verbose_name='groups')), 36 | ('user_permissions', models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='oauth_user_set', related_query_name='oauth_user', to='auth.permission', verbose_name='user permissions')), 37 | ], 38 | options={ 39 | 'db_table': 'user', 40 | }, 41 | managers=[ 42 | ('objects', django.contrib.auth.models.UserManager()), 43 | ], 44 | ), 45 | ] 46 | -------------------------------------------------------------------------------- /server/oAuth/migrations/0002_user_last_active_at_user_last_login_at.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 5.1.4 on 2024-12-29 11:34 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('oAuth', '0001_initial'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name='user', 15 | name='last_active_at', 16 | field=models.DateTimeField(blank=True, null=True, verbose_name='最近活跃时间'), 17 | ), 18 | migrations.AddField( 19 | model_name='user', 20 | name='last_login_at', 21 | field=models.DateTimeField(blank=True, null=True, verbose_name='最后登录时间'), 22 | ), 23 | ] 24 | -------------------------------------------------------------------------------- /server/oAuth/migrations/0003_remove_user_last_login_at.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 5.1.4 on 2024-12-29 12:28 2 | 3 | from django.db import migrations 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('oAuth', '0002_user_last_active_at_user_last_login_at'), 10 | ] 11 | 12 | operations = [ 13 | migrations.RemoveField( 14 | model_name='user', 15 | name='last_login_at', 16 | ), 17 | ] 18 | -------------------------------------------------------------------------------- /server/oAuth/migrations/0004_user_note_user_note_group.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 5.1.4 on 2024-12-30 05:50 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('note', '0001_initial'), 10 | ('oAuth', '0003_remove_user_last_login_at'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AddField( 15 | model_name='user', 16 | name='note', 17 | field=models.ManyToManyField(blank=True, related_name='note_users', to='note.note', verbose_name='授权笔记'), 18 | ), 19 | migrations.AddField( 20 | model_name='user', 21 | name='note_group', 22 | field=models.ManyToManyField(blank=True, related_name='note_group_users', to='note.notegroup', verbose_name='授权笔记分组'), 23 | ), 24 | ] 25 | -------------------------------------------------------------------------------- /server/oAuth/migrations/0005_alter_user_id_alter_user_last_active_at_and_more.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 5.1.4 on 2024-12-31 05:30 2 | 3 | import django.utils.timezone 4 | import uuid 5 | from django.db import migrations, models 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ('note', '0004_alter_note_id_alter_notegroup_id'), 12 | ('oAuth', '0004_user_note_user_note_group'), 13 | ] 14 | 15 | operations = [ 16 | migrations.AlterField( 17 | model_name='user', 18 | name='id', 19 | field=models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False), 20 | ), 21 | migrations.AlterField( 22 | model_name='user', 23 | name='last_active_at', 24 | field=models.DateTimeField(default=django.utils.timezone.now, verbose_name='最后活跃时间'), 25 | ), 26 | migrations.AlterField( 27 | model_name='user', 28 | name='note', 29 | field=models.ManyToManyField(blank=True, related_name='authorized_users', to='note.note', verbose_name='授权笔记'), 30 | ), 31 | migrations.AlterField( 32 | model_name='user', 33 | name='note_group', 34 | field=models.ManyToManyField(blank=True, related_name='authorized_users', to='note.notegroup', verbose_name='授权分组'), 35 | ), 36 | migrations.AlterField( 37 | model_name='user', 38 | name='role', 39 | field=models.CharField(default='user', max_length=20, verbose_name='角色'), 40 | ), 41 | ] 42 | -------------------------------------------------------------------------------- /server/oAuth/migrations/0006_alter_user_note_alter_user_note_group.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 5.1.4 on 2024-12-31 05:39 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('note', '0004_alter_note_id_alter_notegroup_id'), 10 | ('oAuth', '0005_alter_user_id_alter_user_last_active_at_and_more'), 11 | ] 12 | 13 | operations = [ 14 | migrations.AlterField( 15 | model_name='user', 16 | name='note', 17 | field=models.ManyToManyField(blank=True, related_name='note_users', to='note.note', verbose_name='授权笔记'), 18 | ), 19 | migrations.AlterField( 20 | model_name='user', 21 | name='note_group', 22 | field=models.ManyToManyField(blank=True, related_name='note_group_users', to='note.notegroup', verbose_name='授权分组'), 23 | ), 24 | ] 25 | -------------------------------------------------------------------------------- /server/oAuth/migrations/0009_rename_open_id_wecomuser_wecom_user_id_and_more.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 5.1.4 on 2025-01-02 08:55 2 | 3 | from django.db import migrations 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('oAuth', '0008_rename_wechatworkconfig_wecomconfig_and_more'), 10 | ] 11 | 12 | operations = [ 13 | migrations.RenameField( 14 | model_name='wecomuser', 15 | old_name='open_id', 16 | new_name='wecom_user_id', 17 | ), 18 | migrations.AlterUniqueTogether( 19 | name='wecomuser', 20 | unique_together={('wecom_user_id',)}, 21 | ), 22 | migrations.RemoveField( 23 | model_name='wecomuser', 24 | name='union_id', 25 | ), 26 | ] 27 | -------------------------------------------------------------------------------- /server/oAuth/migrations/0010_alter_user_options_alter_dingtalkconfig_table_and_more.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 5.1.4 on 2025-01-03 00:19 2 | 3 | from django.db import migrations 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('oAuth', '0009_rename_open_id_wecomuser_wecom_user_id_and_more'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterModelOptions( 14 | name='user', 15 | options={'verbose_name': '用户', 'verbose_name_plural': '用户'}, 16 | ), 17 | migrations.AlterModelTable( 18 | name='dingtalkconfig', 19 | table=None, 20 | ), 21 | migrations.AlterModelTable( 22 | name='dingtalkuser', 23 | table=None, 24 | ), 25 | migrations.AlterModelTable( 26 | name='feishuconfig', 27 | table=None, 28 | ), 29 | migrations.AlterModelTable( 30 | name='feishuuser', 31 | table=None, 32 | ), 33 | migrations.AlterModelTable( 34 | name='user', 35 | table=None, 36 | ), 37 | migrations.AlterModelTable( 38 | name='wecomconfig', 39 | table=None, 40 | ), 41 | migrations.AlterModelTable( 42 | name='wecomuser', 43 | table=None, 44 | ), 45 | ] 46 | -------------------------------------------------------------------------------- /server/oAuth/migrations/0011_alter_user_role.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 5.1.4 on 2025-01-03 00:23 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('oAuth', '0010_alter_user_options_alter_dingtalkconfig_table_and_more'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='user', 15 | name='role', 16 | field=models.CharField(choices=[('user', '普通用户'), ('admin', '管理员'), ('superuser', '超级管理员')], default='user', max_length=20, verbose_name='角色'), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /server/oAuth/migrations/0012_remove_feishuuser_department_and_more.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 5.1.4 on 2025-01-03 00:38 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('oAuth', '0011_alter_user_role'), 10 | ] 11 | 12 | operations = [ 13 | migrations.RemoveField( 14 | model_name='feishuuser', 15 | name='department', 16 | ), 17 | migrations.RemoveField( 18 | model_name='feishuuser', 19 | name='employee_id', 20 | ), 21 | migrations.RemoveField( 22 | model_name='feishuuser', 23 | name='gender', 24 | ), 25 | migrations.RemoveField( 26 | model_name='feishuuser', 27 | name='position', 28 | ), 29 | migrations.RemoveField( 30 | model_name='feishuuser', 31 | name='status', 32 | ), 33 | migrations.AddField( 34 | model_name='feishuuser', 35 | name='tenant_key', 36 | field=models.CharField(blank=True, max_length=100, null=True, verbose_name='企业标识'), 37 | ), 38 | ] 39 | -------------------------------------------------------------------------------- /server/oAuth/migrations/0013_user_avatar.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 5.1.4 on 2025-01-03 00:58 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('oAuth', '0012_remove_feishuuser_department_and_more'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name='user', 15 | name='avatar', 16 | field=models.URLField(blank=True, max_length=500, null=True, verbose_name='头像'), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /server/oAuth/migrations/0014_alter_feishuuser_user.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 5.1.4 on 2025-01-03 01:35 2 | 3 | import django.db.models.deletion 4 | from django.conf import settings 5 | from django.db import migrations, models 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ('oAuth', '0013_user_avatar'), 12 | ] 13 | 14 | operations = [ 15 | migrations.AlterField( 16 | model_name='feishuuser', 17 | name='user', 18 | field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='feishu_info', to=settings.AUTH_USER_MODEL), 19 | ), 20 | ] 21 | -------------------------------------------------------------------------------- /server/oAuth/migrations/0015_alter_dingtalkuser_user_alter_wecomuser_user.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 5.1.4 on 2025-01-03 03:57 2 | 3 | import django.db.models.deletion 4 | from django.conf import settings 5 | from django.db import migrations, models 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ('oAuth', '0014_alter_feishuuser_user'), 12 | ] 13 | 14 | operations = [ 15 | migrations.AlterField( 16 | model_name='dingtalkuser', 17 | name='user', 18 | field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='dingtalk_info', to=settings.AUTH_USER_MODEL), 19 | ), 20 | migrations.AlterField( 21 | model_name='wecomuser', 22 | name='user', 23 | field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='wecom_info', to=settings.AUTH_USER_MODEL), 24 | ), 25 | ] 26 | -------------------------------------------------------------------------------- /server/oAuth/migrations/0016_remove_dingtalkconfig_agent_id_and_more.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 5.1.4 on 2025-01-03 05:42 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('oAuth', '0015_alter_dingtalkuser_user_alter_wecomuser_user'), 10 | ] 11 | 12 | operations = [ 13 | migrations.RemoveField( 14 | model_name='dingtalkconfig', 15 | name='agent_id', 16 | ), 17 | migrations.RemoveField( 18 | model_name='dingtalkconfig', 19 | name='app_key', 20 | ), 21 | migrations.RemoveField( 22 | model_name='dingtalkconfig', 23 | name='app_secret', 24 | ), 25 | migrations.AddField( 26 | model_name='dingtalkconfig', 27 | name='app_id', 28 | field=models.CharField(blank=True, max_length=100, null=True, verbose_name='APP ID'), 29 | ), 30 | migrations.AddField( 31 | model_name='dingtalkconfig', 32 | name='client_id', 33 | field=models.CharField(blank=True, max_length=100, null=True, verbose_name='Client ID'), 34 | ), 35 | migrations.AddField( 36 | model_name='dingtalkconfig', 37 | name='client_secret', 38 | field=models.CharField(blank=True, max_length=200, null=True, verbose_name='Client Secret'), 39 | ), 40 | ] 41 | -------------------------------------------------------------------------------- /server/oAuth/migrations/0017_dingtalkconfig_redirect_uri_and_more.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 5.1.4 on 2025-01-03 07:34 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('oAuth', '0016_remove_dingtalkconfig_agent_id_and_more'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AddField( 14 | model_name='dingtalkconfig', 15 | name='redirect_uri', 16 | field=models.URLField(blank=True, max_length=500, null=True, verbose_name='回调域名'), 17 | ), 18 | migrations.AddField( 19 | model_name='feishuconfig', 20 | name='redirect_uri', 21 | field=models.URLField(blank=True, max_length=500, null=True, verbose_name='回调域名'), 22 | ), 23 | migrations.AddField( 24 | model_name='wecomconfig', 25 | name='redirect_uri', 26 | field=models.URLField(blank=True, max_length=500, null=True, verbose_name='回调域名'), 27 | ), 28 | migrations.AlterField( 29 | model_name='dingtalkconfig', 30 | name='app_id', 31 | field=models.CharField(max_length=100, verbose_name='APP ID'), 32 | ), 33 | migrations.AlterField( 34 | model_name='dingtalkconfig', 35 | name='client_id', 36 | field=models.CharField(default='ddd', max_length=100, verbose_name='Client ID'), 37 | preserve_default=False, 38 | ), 39 | migrations.AlterField( 40 | model_name='dingtalkconfig', 41 | name='client_secret', 42 | field=models.CharField(default='dd', max_length=100, verbose_name='Client Secret'), 43 | preserve_default=False, 44 | ), 45 | migrations.AlterField( 46 | model_name='dingtalkconfig', 47 | name='enabled', 48 | field=models.BooleanField(default=True, verbose_name='是否启用'), 49 | ), 50 | migrations.AlterField( 51 | model_name='feishuconfig', 52 | name='app_secret', 53 | field=models.CharField(max_length=100, verbose_name='应用密钥'), 54 | ), 55 | migrations.AlterField( 56 | model_name='feishuconfig', 57 | name='enabled', 58 | field=models.BooleanField(default=True, verbose_name='是否启用'), 59 | ), 60 | migrations.AlterField( 61 | model_name='wecomconfig', 62 | name='enabled', 63 | field=models.BooleanField(default=True, verbose_name='是否启用'), 64 | ), 65 | migrations.AlterField( 66 | model_name='wecomconfig', 67 | name='secret', 68 | field=models.CharField(max_length=100, verbose_name='应用密钥'), 69 | ), 70 | ] 71 | -------------------------------------------------------------------------------- /server/oAuth/migrations/0018_githubconfig_githubuser.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 5.1.4 on 2025-01-03 09:43 2 | 3 | import django.db.models.deletion 4 | import uuid 5 | from django.conf import settings 6 | from django.db import migrations, models 7 | 8 | 9 | class Migration(migrations.Migration): 10 | 11 | dependencies = [ 12 | ('oAuth', '0017_dingtalkconfig_redirect_uri_and_more'), 13 | ] 14 | 15 | operations = [ 16 | migrations.CreateModel( 17 | name='GitHubConfig', 18 | fields=[ 19 | ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)), 20 | ('client_id', models.CharField(max_length=100, verbose_name='Client ID')), 21 | ('client_secret', models.CharField(max_length=100, verbose_name='Client Secret')), 22 | ('redirect_uri', models.URLField(blank=True, max_length=500, null=True, verbose_name='回调域名')), 23 | ('enabled', models.BooleanField(default=True, verbose_name='是否启用')), 24 | ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), 25 | ('updated_at', models.DateTimeField(auto_now=True, verbose_name='更新时间')), 26 | ], 27 | options={ 28 | 'verbose_name': 'GitHub配置', 29 | 'verbose_name_plural': 'GitHub配置', 30 | }, 31 | ), 32 | migrations.CreateModel( 33 | name='GitHubUser', 34 | fields=[ 35 | ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)), 36 | ('github_id', models.CharField(max_length=100, unique=True, verbose_name='GitHub ID')), 37 | ('login', models.CharField(max_length=100, verbose_name='GitHub用户名')), 38 | ('name', models.CharField(blank=True, max_length=100, null=True, verbose_name='GitHub昵称')), 39 | ('email', models.EmailField(blank=True, max_length=254, null=True, verbose_name='GitHub邮箱')), 40 | ('avatar_url', models.URLField(blank=True, null=True, verbose_name='头像URL')), 41 | ('access_token', models.CharField(max_length=100, verbose_name='访问令牌')), 42 | ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), 43 | ('updated_at', models.DateTimeField(auto_now=True, verbose_name='更新时间')), 44 | ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='github_user', to=settings.AUTH_USER_MODEL, verbose_name='关联用户')), 45 | ], 46 | options={ 47 | 'verbose_name': 'GitHub用户', 48 | 'verbose_name_plural': 'GitHub用户', 49 | }, 50 | ), 51 | ] 52 | -------------------------------------------------------------------------------- /server/oAuth/migrations/0019_remove_githubuser_access_token_githubuser_bio_and_more.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 5.1.4 on 2025-01-03 09:57 2 | 3 | import django.db.models.deletion 4 | from django.conf import settings 5 | from django.db import migrations, models 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | dependencies = [ 11 | ('oAuth', '0018_githubconfig_githubuser'), 12 | ] 13 | 14 | operations = [ 15 | migrations.RemoveField( 16 | model_name='githubuser', 17 | name='access_token', 18 | ), 19 | migrations.AddField( 20 | model_name='githubuser', 21 | name='bio', 22 | field=models.TextField(blank=True, null=True, verbose_name='个人简介'), 23 | ), 24 | migrations.AddField( 25 | model_name='githubuser', 26 | name='location', 27 | field=models.CharField(blank=True, max_length=100, null=True, verbose_name='所在地'), 28 | ), 29 | migrations.AlterField( 30 | model_name='githubuser', 31 | name='user', 32 | field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='github_user', to=settings.AUTH_USER_MODEL, verbose_name='关联用户'), 33 | ), 34 | ] 35 | -------------------------------------------------------------------------------- /server/oAuth/migrations/0021_gitlabconfig_gitlabuser.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 5.1.7 on 2025-03-21 15:00 2 | 3 | import django.db.models.deletion 4 | import uuid 5 | from django.conf import settings 6 | from django.db import migrations, models 7 | 8 | 9 | class Migration(migrations.Migration): 10 | 11 | dependencies = [ 12 | ('oAuth', '0020_googleconfig_googleuser_oauthconfig'), 13 | ] 14 | 15 | operations = [ 16 | migrations.CreateModel( 17 | name='GitLabConfig', 18 | fields=[ 19 | ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)), 20 | ('client_id', models.CharField(max_length=100, verbose_name='Client ID')), 21 | ('client_secret', models.CharField(max_length=100, verbose_name='Client Secret')), 22 | ('redirect_uri', models.URLField(blank=True, max_length=500, null=True, verbose_name='回调域名')), 23 | ('enabled', models.BooleanField(default=True, verbose_name='是否启用')), 24 | ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), 25 | ('updated_at', models.DateTimeField(auto_now=True, verbose_name='更新时间')), 26 | ], 27 | options={ 28 | 'verbose_name': 'GitLab配置', 29 | 'verbose_name_plural': 'GitLab配置', 30 | }, 31 | ), 32 | migrations.CreateModel( 33 | name='GitLabUser', 34 | fields=[ 35 | ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)), 36 | ('gitlab_id', models.CharField(max_length=100, unique=True, verbose_name='GitLab ID')), 37 | ('username', models.CharField(max_length=100, verbose_name='用户名')), 38 | ('email', models.EmailField(blank=True, max_length=100, null=True, verbose_name='邮箱')), 39 | ('name', models.CharField(blank=True, max_length=100, null=True, verbose_name='姓名')), 40 | ('avatar_url', models.URLField(blank=True, null=True, verbose_name='头像URL')), 41 | ('web_url', models.URLField(blank=True, null=True, verbose_name='个人主页')), 42 | ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), 43 | ('updated_at', models.DateTimeField(auto_now=True, verbose_name='更新时间')), 44 | ('user', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='gitlab_user', to=settings.AUTH_USER_MODEL, verbose_name='关联用户')), 45 | ], 46 | options={ 47 | 'verbose_name': 'GitLab用户', 48 | 'verbose_name_plural': 'GitLab用户', 49 | }, 50 | ), 51 | ] 52 | -------------------------------------------------------------------------------- /server/oAuth/migrations/0022_alter_gitlabconfig_options_and_more.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 5.1.7 on 2025-03-21 15:25 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('oAuth', '0021_gitlabconfig_gitlabuser'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterModelOptions( 14 | name='gitlabconfig', 15 | options={'ordering': ['-created_at'], 'verbose_name': 'GitLab 配置', 'verbose_name_plural': 'GitLab 配置'}, 16 | ), 17 | migrations.AddField( 18 | model_name='gitlabconfig', 19 | name='gitlab_server', 20 | field=models.CharField(default='https://gitlab.com', max_length=255, verbose_name='GitLab 服务器地址'), 21 | ), 22 | migrations.AlterField( 23 | model_name='gitlabconfig', 24 | name='client_id', 25 | field=models.CharField(max_length=255, verbose_name='Client ID'), 26 | ), 27 | migrations.AlterField( 28 | model_name='gitlabconfig', 29 | name='client_secret', 30 | field=models.CharField(max_length=255, verbose_name='Client Secret'), 31 | ), 32 | migrations.AlterField( 33 | model_name='gitlabconfig', 34 | name='redirect_uri', 35 | field=models.CharField(blank=True, default='1', max_length=255, verbose_name='重定向URI'), 36 | preserve_default=False, 37 | ), 38 | ] 39 | -------------------------------------------------------------------------------- /server/oAuth/migrations/0023_giteeconfig_giteeuser.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 5.1.7 on 2025-03-21 23:46 2 | 3 | import django.db.models.deletion 4 | import uuid 5 | from django.conf import settings 6 | from django.db import migrations, models 7 | 8 | 9 | class Migration(migrations.Migration): 10 | 11 | dependencies = [ 12 | ('oAuth', '0022_alter_gitlabconfig_options_and_more'), 13 | ] 14 | 15 | operations = [ 16 | migrations.CreateModel( 17 | name='GiteeConfig', 18 | fields=[ 19 | ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)), 20 | ('client_id', models.CharField(max_length=255, verbose_name='Client ID')), 21 | ('client_secret', models.CharField(max_length=255, verbose_name='Client Secret')), 22 | ('redirect_uri', models.CharField(blank=True, max_length=255, verbose_name='重定向URI')), 23 | ('enabled', models.BooleanField(default=True, verbose_name='是否启用')), 24 | ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), 25 | ('updated_at', models.DateTimeField(auto_now=True, verbose_name='更新时间')), 26 | ], 27 | options={ 28 | 'verbose_name': 'Gitee 配置', 29 | 'verbose_name_plural': 'Gitee 配置', 30 | 'ordering': ['-created_at'], 31 | }, 32 | ), 33 | migrations.CreateModel( 34 | name='GiteeUser', 35 | fields=[ 36 | ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)), 37 | ('gitee_id', models.CharField(max_length=50, unique=True, verbose_name='Gitee ID')), 38 | ('name', models.CharField(blank=True, max_length=100, verbose_name='姓名')), 39 | ('username', models.CharField(blank=True, max_length=100, verbose_name='用户名')), 40 | ('email', models.EmailField(blank=True, max_length=254, verbose_name='邮箱')), 41 | ('avatar_url', models.URLField(blank=True, verbose_name='头像')), 42 | ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), 43 | ('updated_at', models.DateTimeField(auto_now=True, verbose_name='更新时间')), 44 | ('user', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='gitee_user', to=settings.AUTH_USER_MODEL)), 45 | ], 46 | options={ 47 | 'verbose_name': 'Gitee 用户', 48 | 'verbose_name_plural': 'Gitee 用户', 49 | 'ordering': ['-created_at'], 50 | }, 51 | ), 52 | ] 53 | -------------------------------------------------------------------------------- /server/oAuth/migrations/0024_alter_giteeuser_email.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 5.1.7 on 2025-03-21 23:53 2 | 3 | from django.db import migrations, models 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('oAuth', '0023_giteeconfig_giteeuser'), 10 | ] 11 | 12 | operations = [ 13 | migrations.AlterField( 14 | model_name='giteeuser', 15 | name='email', 16 | field=models.EmailField(blank=True, max_length=254, null=True, verbose_name='邮箱'), 17 | ), 18 | ] 19 | -------------------------------------------------------------------------------- /server/oAuth/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/X-Mars/beenote/0aa5f3743597a6a8345b542cc547f3a6431de647/server/oAuth/migrations/__init__.py -------------------------------------------------------------------------------- /server/oAuth/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /server/oAuth/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path, include 2 | from rest_framework.routers import DefaultRouter 3 | from .views import ( 4 | LoginView, UserInfoView, UserViewSet, GroupViewSet, 5 | WeComConfigViewSet, FeiShuConfigViewSet, DingTalkConfigViewSet, 6 | GitHubConfigViewSet, GoogleConfigViewSet, GitLabConfigViewSet, 7 | GiteeConfigViewSet, health_check 8 | ) 9 | from .utils import WeComLoginView, FeiShuLoginView, DingTalkLoginView, LoginQRCodeView, GitHubLoginView 10 | from .utils.google import GoogleLoginView 11 | from .utils.gitlab import GitLabLoginView 12 | from .utils.gitee import GiteeLoginView 13 | from rest_framework_simplejwt.views import TokenRefreshView 14 | from . import views 15 | 16 | # 创建路由器 17 | router = DefaultRouter() 18 | router.register(r'users', UserViewSet) 19 | router.register(r'groups', GroupViewSet) 20 | router.register(r'wecom-config', WeComConfigViewSet) 21 | router.register(r'feishu-config', FeiShuConfigViewSet) 22 | router.register(r'dingtalk-config', DingTalkConfigViewSet) 23 | router.register(r'github-config', GitHubConfigViewSet) 24 | router.register(r'google-config', GoogleConfigViewSet) 25 | router.register(r'gitlab-config', GitLabConfigViewSet) 26 | router.register(r'gitee-config', GiteeConfigViewSet) 27 | 28 | urlpatterns = [ 29 | # 包含路由器生成的URL 30 | path('', include(router.urls)), 31 | 32 | # 其他URL保持不变 33 | path('login/', LoginView.as_view(), name='login'), 34 | path('wecom/login/', WeComLoginView.as_view(), name='wecom_login'), 35 | path('feishu/login/', FeiShuLoginView.as_view(), name='feishu_login'), 36 | path('dingtalk/login/', DingTalkLoginView.as_view(), name='dingtalk_login'), 37 | path('github/login/', GitHubLoginView.as_view(), name='github_login'), 38 | path('google/login/', GoogleLoginView.as_view(), name='google_login'), 39 | path('gitlab/login/', GitLabLoginView.as_view(), name='gitlab_login'), 40 | path('gitee/login/', GiteeLoginView.as_view(), name='gitee_login'), 41 | path('login/qrcode/', LoginQRCodeView.as_view(), name='login_qrcode'), 42 | path('refresh/', TokenRefreshView.as_view(), name='token_refresh'), 43 | path('me/', UserInfoView.as_view(), name='user_info'), 44 | path('stats/', views.get_stats, name='user-stats'), 45 | path('health/', health_check, name='health_check'), 46 | ] 47 | -------------------------------------------------------------------------------- /server/oAuth/utils.py: -------------------------------------------------------------------------------- 1 | from rest_framework.views import APIView 2 | from rest_framework.response import Response 3 | from rest_framework.permissions import AllowAny 4 | from .models import WeComConfig, FeiShuConfig, DingTalkConfig, GitHubConfig, GoogleConfig 5 | 6 | class LoginQRCodeView(APIView): 7 | """获取第三方登录二维码""" 8 | permission_classes = [AllowAny] 9 | 10 | def get(self, request): 11 | try: 12 | # 获取各个第三方登录配置 13 | wecom_config = WeComConfig.objects.filter(enabled=True).first() 14 | feishu_config = FeiShuConfig.objects.filter(enabled=True).first() 15 | dingtalk_config = DingTalkConfig.objects.filter(enabled=True).first() 16 | github_config = GitHubConfig.objects.filter(enabled=True).first() 17 | google_config = GoogleConfig.objects.filter(enabled=True).first() 18 | 19 | # 构建返回数据 20 | response_data = { 21 | 'wecom_url': None, 22 | 'feishu_url': None, 23 | 'dingtalk_url': None, 24 | 'github_url': None, 25 | 'google_url': None 26 | } 27 | 28 | # 企业微信登录URL 29 | if wecom_config: 30 | response_data['wecom_url'] = ( 31 | 'https://open.work.weixin.qq.com/wwopen/sso/qrConnect?' 32 | f'appid={wecom_config.corp_id}&' 33 | f'agentid={wecom_config.agent_id}&' 34 | f'redirect_uri={wecom_config.redirect_uri}' 35 | ) 36 | 37 | # 飞书登录URL 38 | if feishu_config: 39 | response_data['feishu_url'] = ( 40 | 'https://open.feishu.cn/open-apis/authen/v1/index?' 41 | f'app_id={feishu_config.app_id}&' 42 | f'redirect_uri={feishu_config.redirect_uri}' 43 | ) 44 | 45 | # 钉钉登录URL 46 | if dingtalk_config: 47 | response_data['dingtalk_url'] = ( 48 | 'https://login.dingtalk.com/oauth2/auth?' 49 | f'client_id={dingtalk_config.client_id}&' 50 | 'response_type=code&' 51 | 'scope=openid&' 52 | f'redirect_uri={dingtalk_config.redirect_uri}' 53 | ) 54 | 55 | # GitHub登录URL 56 | if github_config: 57 | response_data['github_url'] = ( 58 | 'https://github.com/login/oauth/authorize?' 59 | f'client_id={github_config.client_id}&' 60 | f'redirect_uri={github_config.redirect_uri}' 61 | ) 62 | 63 | # Google登录URL 64 | if google_config: 65 | response_data['google_url'] = ( 66 | 'https://accounts.google.com/o/oauth2/v2/auth?' 67 | f'client_id={google_config.client_id}&' 68 | 'response_type=code&' 69 | f'redirect_uri={google_config.redirect_uri}&' 70 | 'scope=openid email profile&' 71 | 'access_type=offline' 72 | ) 73 | 74 | return Response(response_data) 75 | except Exception as e: 76 | return Response({'error': str(e)}, status=500) -------------------------------------------------------------------------------- /server/oAuth/utils/__init__.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | # @Time : 2025/1/2 11:47 4 | # @Author : X-Mars 5 | # @Site : https://github.com/X-Mars 6 | # @File : oAuth/utils/__init__.py 7 | # @Software : Pycharm 8 | 9 | from .wecom import WeComLoginView 10 | from .feishu import FeiShuLoginView 11 | from .dingtalk import DingTalkLoginView 12 | from .qrcode import LoginQRCodeView 13 | from .github import GitHubLoginView 14 | from .google import GoogleLoginView 15 | from .gitlab import GitLabLoginView 16 | from .gitee import GiteeLoginView 17 | 18 | __all__ = [ 19 | 'WeComLoginView', 20 | 'FeiShuLoginView', 21 | 'DingTalkLoginView', 22 | 'LoginQRCodeView', 23 | 'GitHubLoginView', 24 | 'GoogleLoginView', 25 | 'GitLabLoginView', 26 | 'GiteeLoginView' 27 | ] 28 | -------------------------------------------------------------------------------- /server/requirements.txt: -------------------------------------------------------------------------------- 1 | APScheduler==3.11.0 2 | asgiref==3.8.1 3 | cachetools==5.5.2 4 | certifi==2025.1.31 5 | charset-normalizer==3.4.1 6 | Django==5.2 7 | django-filter==25.1 8 | djangorestframework==3.16.0 9 | djangorestframework_simplejwt==5.5.0 10 | google-auth==2.38.0 11 | google-auth-httplib2==0.2.0 12 | google-auth-oauthlib==1.2.1 13 | gunicorn==23.0.0 14 | httplib2==0.22.0 15 | idna==3.10 16 | Jinja2==3.1.6 17 | ldap3==2.9.1 18 | Markdown==3.7 19 | MarkupSafe==3.0.2 20 | oauthlib==3.2.2 21 | packaging==24.2 22 | pyasn1==0.6.1 23 | pyasn1_modules==0.4.2 24 | PyJWT==2.9.0 25 | pyparsing==3.2.3 26 | python-dateutil==2.9.0.post0 27 | requests==2.32.3 28 | requests-oauthlib==2.0.0 29 | rsa==4.9 30 | schedule==1.2.2 31 | six==1.17.0 32 | sqlparse==0.5.3 33 | tzlocal==5.3.1 34 | urllib3==2.3.0 35 | -------------------------------------------------------------------------------- /server/server/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/X-Mars/beenote/0aa5f3743597a6a8345b542cc547f3a6431de647/server/server/__init__.py -------------------------------------------------------------------------------- /server/server/asgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | ASGI config for server project. 3 | 4 | It exposes the ASGI 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/asgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.asgi import get_asgi_application 13 | 14 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'server.settings') 15 | 16 | application = get_asgi_application() 17 | -------------------------------------------------------------------------------- /server/server/urls.py: -------------------------------------------------------------------------------- 1 | """ 2 | URL configuration for server 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 | from django.contrib import admin 18 | from django.urls import path, include 19 | 20 | urlpatterns = [ 21 | path('admin/', admin.site.urls), 22 | path('api/auth/', include('oAuth.urls')), 23 | path('api/', include('note.urls')), 24 | ] 25 | -------------------------------------------------------------------------------- /server/server/wsgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | WSGI config for server 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', 'server.settings') 15 | 16 | application = get_wsgi_application() 17 | -------------------------------------------------------------------------------- /start.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # 检查必需的环境变量 4 | if [ -z "$BEENOTE_SECRET_KEY" ]; then 5 | echo "错误: 环境变量 BEENOTE_SECRET_KEY 未设置" 6 | echo "请设置环境变量 BEENOTE_SECRET_KEY 后再运行程序" 7 | exit 1 8 | fi 9 | 10 | # 启动 nginx 11 | service nginx start 12 | 13 | # 同步数据库,并启动 Django 后端 14 | cd /app && python manage.py migrate && python manage.py runserver 0.0.0.0:8000 15 | -------------------------------------------------------------------------------- /web/.env: -------------------------------------------------------------------------------- 1 | VITE_API_BASE_URL=http://localhost:8000/api -------------------------------------------------------------------------------- /web/.env.production: -------------------------------------------------------------------------------- 1 | VITE_API_BASE_URL=/api -------------------------------------------------------------------------------- /web/.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "root": true, 3 | "extends": [ 4 | "plugin:vue/vue3-essential", 5 | "eslint:recommended", 6 | "@vue/eslint-config-typescript", 7 | "@vue/eslint-config-prettier/skip-formatting" 8 | ], 9 | "parserOptions": { 10 | "ecmaVersion": "latest" 11 | }, 12 | "rules": { 13 | "vue/multi-word-component-names": "off" 14 | } 15 | } -------------------------------------------------------------------------------- /web/.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | pnpm-debug.log* 8 | lerna-debug.log* 9 | 10 | node_modules 11 | .DS_Store 12 | dist-ssr 13 | coverage 14 | *.local 15 | 16 | /cypress/videos/ 17 | /cypress/screenshots/ 18 | 19 | # Editor directories and files 20 | .vscode/* 21 | !.vscode/extensions.json 22 | .idea 23 | *.suo 24 | *.ntvs* 25 | *.njsproj 26 | *.sln 27 | *.sw? -------------------------------------------------------------------------------- /web/.prettierrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "semi": false, 3 | "tabWidth": 2, 4 | "singleQuote": true, 5 | "printWidth": 100, 6 | "trailingComma": "none" 7 | } -------------------------------------------------------------------------------- /web/dist/assets/Dashboard-C504Kkq_.css: -------------------------------------------------------------------------------- 1 | .dashboard[data-v-448b2917]{padding:10px;background-color:#f5f7fa;min-height:calc(100vh - 130px)}.data-card[data-v-448b2917]{margin-bottom:20px;border-radius:15px;border:none;transition:transform .3s}.data-card[data-v-448b2917]:hover{transform:translateY(-5px)}.card-content[data-v-448b2917]{display:flex;align-items:center;padding:10px;justify-content:space-between}.card-icon[data-v-448b2917]{width:48px;height:48px;border-radius:12px;display:flex;align-items:center;justify-content:center;font-size:24px}.primary .card-icon[data-v-448b2917]{background-color:#409eff1a;color:#409eff}.success .card-icon[data-v-448b2917]{background-color:#67c23a1a;color:#67c23a}.warning .card-icon[data-v-448b2917]{background-color:#e6a23c1a;color:#e6a23c}.info .card-icon[data-v-448b2917]{background-color:#9093991a;color:#909399}.card-info[data-v-448b2917]{text-align:right}.card-info .value[data-v-448b2917]{font-size:24px;font-weight:700;margin-top:5px}.card-info .title[data-v-448b2917]{font-size:14px;color:#909399}.chart-row[data-v-448b2917]{margin-bottom:20px}.chart-card[data-v-448b2917]{border-radius:15px;border:none}.chart-header[data-v-448b2917]{display:flex;justify-content:space-between;align-items:center;padding:15px 20px;border-bottom:1px solid #eee}.chart-header h3[data-v-448b2917]{margin:0;font-size:16px;font-weight:600;color:#303133}[data-v-448b2917] .el-radio-button__inner{border-radius:20px!important}[data-v-448b2917] .el-button{border-radius:25px}[data-v-448b2917] .el-input__wrapper{border-radius:8px}[data-v-448b2917] .el-card__body{padding:20px}.user-info[data-v-448b2917]{position:absolute;top:20px;right:20px;z-index:100}.user-dropdown-link[data-v-448b2917]{display:flex;align-items:center;cursor:pointer}.username[data-v-448b2917]{margin-right:10px;font-size:14px;color:#606266}.avatar[data-v-448b2917]{background-color:#409eff;color:#fff;font-weight:700}[data-v-448b2917] .el-dropdown-menu__item{display:flex;align-items:center;gap:8px}[data-v-448b2917] .el-dropdown-menu__item .el-icon{margin-right:4px} 2 | -------------------------------------------------------------------------------- /web/dist/assets/Groups-B8-9Ltlc.css: -------------------------------------------------------------------------------- 1 | .groups-container[data-v-df3c3f89]{padding:20px}.header[data-v-df3c3f89]{margin-bottom:20px;display:flex;justify-content:space-between;align-items:center}.left[data-v-df3c3f89],.right[data-v-df3c3f89]{display:flex;gap:15px;align-items:center}.group-card[data-v-df3c3f89]{margin-bottom:20px;transition:all .3s;height:100%}.group-card[data-v-df3c3f89]:hover{transform:translateY(-5px);box-shadow:0 6px 16px #0000001a;border-color:var(--el-color-primary-light-7)}.group-header[data-v-df3c3f89]{display:flex;justify-content:space-between;align-items:center;margin-bottom:15px;padding-bottom:10px;border-bottom:1px solid #ebeef5}.group-header .title[data-v-df3c3f89]{font-weight:700;font-size:16px;flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.group-content[data-v-df3c3f89]{color:var(--el-text-color-regular);margin-bottom:15px;min-height:40px;max-height:60px;overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical}.group-footer[data-v-df3c3f89]{display:flex;justify-content:space-between;align-items:center}.time[data-v-df3c3f89]{color:var(--el-text-color-secondary);font-size:13px}[data-v-df3c3f89] .danger{color:var(--el-color-danger)}[data-v-df3c3f89] .el-dropdown-menu__item i{margin-right:8px}[data-v-df3c3f89] .el-card__body{padding:15px!important}.search-input[data-v-df3c3f89]{width:300px}.left[data-v-df3c3f89]{display:flex;gap:15px;align-items:center}.group-footer .el-button[data-v-df3c3f89]{padding:0;height:auto} 2 | -------------------------------------------------------------------------------- /web/dist/assets/NoteEdit-pZVGAJdr.css: -------------------------------------------------------------------------------- 1 | .note-edit-container[data-v-9a8b7079]{padding:20px;height:100%}.header[data-v-9a8b7079]{margin-bottom:20px}.header-row[data-v-9a8b7079]{display:flex;align-items:center;gap:15px}.title-input[data-v-9a8b7079]{width:500px}.title-input[data-v-9a8b7079] .el-input__wrapper{padding:8px 15px}.title-input[data-v-9a8b7079] .el-input__inner{font-weight:700;height:100%;line-height:34px}.group-select[data-v-9a8b7079]{width:200px;margin-right:15px}[data-v-9a8b7079] .el-button{padding:0 20px;font-size:16px}.editor-container[data-v-9a8b7079]{border:1px solid #dcdfe6;border-radius:4px;background-color:#fff} 2 | -------------------------------------------------------------------------------- /web/dist/assets/NoteView-BNzl7X6j.css: -------------------------------------------------------------------------------- 1 | .note-view-container[data-v-f0720ffc]{padding:10px;max-width:1000px;margin:0 auto}.header[data-v-f0720ffc]{margin-bottom:20px;padding-bottom:15px;border-bottom:1px solid #dcdfe6}.title-row[data-v-f0720ffc]{display:flex;justify-content:space-between;align-items:center;margin-bottom:10px}.title[data-v-f0720ffc]{margin:0;font-size:28px;color:var(--el-text-color-primary)}.meta[data-v-f0720ffc]{display:flex;align-items:center;gap:15px;margin-bottom:0;color:var(--el-text-color-secondary)}.time[data-v-f0720ffc]{font-size:14px}.content[data-v-f0720ffc]{background-color:#fff;border-radius:4px}[data-v-f0720ffc] .md-editor{border:none}[data-v-f0720ffc] .md-preview{background-color:#fff;padding:0}[data-v-f0720ffc] .el-skeleton__h1{height:36px!important}[data-v-f0720ffc] .el-skeleton__text{margin-top:16px} 2 | -------------------------------------------------------------------------------- /web/dist/assets/NoteView-Qajf4pKz.js: -------------------------------------------------------------------------------- 1 | import{d as C,r as v,a3 as B,a4 as E,c as M,f as o,w as n,g as l,e as t,x as d,p as g,t as Y,A as b,k as D,C as R,i as j,b as H,j as w,E as T,_ as z}from"./index-BQnrSvw8.js";import{M as A}from"./style-IFfT69lj.js";import{g as I}from"./index-DKjOyILR.js";const P={class:"note-view-container"},S={class:"header"},U={class:"meta"},$={class:"header"},q={class:"title-row"},F={class:"title"},G={class:"meta"},J={class:"time"},K={class:"content"},L=C({__name:"NoteView",setup(O){const i=H(),_=j(),a=v(null),r=v(!1),y=e=>e?R(e).format("YYYY-MM-DD HH:mm:ss"):"",m=async e=>{r.value=!0;try{const s=await I(e);a.value=s.data}catch(s){console.error("获取笔记失败:",s),T.error("获取笔记失败"),_.push("/notes")}finally{r.value=!1}},k=()=>{_.push(`/notes/edit/${i.params.id}`)};return B(async e=>{e.params.id&&await m(e.params.id)}),E(async()=>{i.params.id&&await m(i.params.id)}),(e,s)=>{const c=l("el-skeleton-item"),x=l("el-button"),N=l("el-tag"),V=l("el-skeleton");return w(),M("div",P,[o(V,{loading:r.value,animated:""},{template:n(()=>[t("div",S,[o(c,{variant:"h1",style:{width:"50%"}}),t("div",U,[o(c,{variant:"text",style:{width:"100px"}})])]),o(c,{variant:"p",style:{height:"400px"}})]),default:n(()=>{var u,p,f,h;return[t("div",$,[t("div",q,[t("h1",F,d((u=a.value)==null?void 0:u.title),1),o(x,{type:"primary",onClick:k},{default:n(()=>s[0]||(s[0]=[g("编辑文章")])),_:1})]),t("div",G,[(p=a.value)!=null&&p.group_detail?(w(),Y(N,{key:0,size:"small"},{default:n(()=>[g(d(a.value.group_detail.name),1)]),_:1})):b("",!0),t("span",J,"更新于 "+d(y(((f=a.value)==null?void 0:f.updated_at)||"")),1)])]),t("div",K,[o(D(A),{modelValue:((h=a.value)==null?void 0:h.content)||""},null,8,["modelValue"])])]}),_:1},8,["loading"])])}}}),Z=z(L,[["__scopeId","data-v-f0720ffc"]]);export{Z as default}; 2 | -------------------------------------------------------------------------------- /web/dist/assets/Notes-BE1BEC9W.css: -------------------------------------------------------------------------------- 1 | .notes-container[data-v-66020628]{padding:20px}.header[data-v-66020628]{margin-bottom:20px;display:flex;justify-content:space-between;align-items:center}.left[data-v-66020628],.right[data-v-66020628]{display:flex;gap:15px;align-items:center}.group-select[data-v-66020628]{width:200px}.search-input[data-v-66020628]{width:300px}.note-title[data-v-66020628]{display:flex;align-items:center;gap:8px}[data-v-66020628] .recent-row{background-color:var(--el-color-primary-light-9)}.note-card[data-v-66020628]{margin-bottom:20px;transition:all .3s;border:1px solid #e4e7ed}.note-card[data-v-66020628]:hover{transform:translateY(-5px);box-shadow:0 6px 16px #0000001a;border-color:var(--el-color-primary-light-7)}.note-card[data-v-66020628] .el-card__body{padding:15px;border-radius:4px}.note-card-header[data-v-66020628]{display:flex;justify-content:space-between;align-items:center;margin-bottom:10px;padding-bottom:10px;border-bottom:1px solid #ebeef5}.note-card-header .title[data-v-66020628]{font-weight:700;font-size:16px}.note-card-content[data-v-66020628]{color:var(--el-text-color-regular);margin-bottom:15px;height:150px;overflow:hidden}.note-card-content[data-v-66020628] .md-preview{background-color:transparent;padding:0;font-size:13px}.note-card-content[data-v-66020628] .md-preview img{max-height:100px}.note-card-content[data-v-66020628] .md-preview h1{font-size:16px}.note-card-content[data-v-66020628] .md-preview h2{font-size:15px}.note-card-content[data-v-66020628] .md-preview h3{font-size:14px}.note-card-footer[data-v-66020628]{display:flex;justify-content:space-between;align-items:center}.note-card-footer .time[data-v-66020628]{color:var(--el-text-color-secondary);font-size:13px}[data-v-66020628] .danger{color:var(--el-color-danger)}.pagination-container[data-v-66020628]{margin-top:20px;display:flex;justify-content:flex-end}.clickable[data-v-66020628]{cursor:pointer}.clickable[data-v-66020628]:hover{color:var(--el-color-primary)}.note-card[data-v-66020628]{cursor:pointer}.card-header[data-v-66020628]{display:flex;align-items:center;justify-content:space-between}.header-right[data-v-66020628]{display:flex;align-items:center;gap:8px}.creator-tag[data-v-66020628]{font-size:12px} 2 | -------------------------------------------------------------------------------- /web/dist/assets/OAuthCallback-Bkvp4fg4.css: -------------------------------------------------------------------------------- 1 | .oauth-callback[data-v-9f9d3a63]{display:flex;justify-content:center;align-items:center;min-height:100vh;background-color:#f5f7fa}.callback-card[data-v-9f9d3a63]{width:100%;max-width:600px;margin:20px}.card-header[data-v-9f9d3a63]{display:flex;justify-content:center;align-items:center}.callback-content[data-v-9f9d3a63]{padding:20px 0} 2 | -------------------------------------------------------------------------------- /web/dist/assets/OAuthCallback-DtNbQLhY.js: -------------------------------------------------------------------------------- 1 | import{d as y,u as C,r,y as m,b as L,o as x,c as E,f as g,w as u,g as b,i as M,E as q,e as _,p as G,x as N,j as B,_ as S}from"./index-BQnrSvw8.js";const T={class:"oauth-callback"},V={class:"card-header"},A={class:"callback-content"},H=y({__name:"OAuthCallback",setup(O){const l=L(),h=M(),a=C(),c=r(!0),p=r(!1),i=r("正在处理登录请求..."),d=r("请稍候"),f=m(()=>({wecom:"企业微信",feishu:"飞书",dingtalk:"钉钉",github:"GitHub",google:"Google",gitlab:"GitLab",gitee:"Gitee"})[l.query.state]||"未知平台"),k=m(()=>`${f.value}登录`),v=async()=>{var n;try{const e=l.query.code,s=l.query.authCode,o=(n=l.query.state)==null?void 0:n.toLowerCase();if(console.log("code:",e),console.log("authCode:",s),console.log("state:",o),!e||!o||!s&&o==="dingtalk"&&o!=="github")throw new Error("缺少必要的参数");let t;switch(o){case"wecom":t=await a.wecomLogin(e);break;case"feishu":t=await a.feishuLogin(e);break;case"dingtalk":t=await a.dingtalkLogin(s);break;case"github":t=await a.githubLogin(e);break;case"google":t=await a.googleLogin(e);break;case"gitlab":t=await a.gitlabLogin(e);break;case"gitee":t=await a.giteeLogin(e);break;default:throw new Error("未知的登录类型")}c.value=!1,i.value="登录成功",d.value="正在跳转...",setTimeout(()=>{h.push("/")},1e3)}catch(e){c.value=!1,p.value=!0,i.value="登录失败",d.value=e.message||"请稍后重试",q.error(e.message||"登录失败")}},w=()=>{h.push("/")};return x(()=>{v()}),(n,e)=>{const s=b("el-button"),o=b("el-result"),t=b("el-card");return B(),E("div",T,[g(t,{class:"callback-card"},{header:u(()=>[_("div",V,[_("h2",null,N(k.value),1)])]),default:u(()=>[_("div",A,[g(o,{icon:c.value?"info":p.value?"error":"success",title:i.value,"sub-title":d.value},{extra:u(()=>[g(s,{type:"primary",onClick:w,disabled:c.value},{default:u(()=>e[0]||(e[0]=[G(" 返回首页 ")])),_:1},8,["disabled"])]),_:1},8,["icon","title","sub-title"])])]),_:1})])}}}),j=S(H,[["__scopeId","data-v-9f9d3a63"]]);export{j as default}; 2 | -------------------------------------------------------------------------------- /web/dist/assets/OAuthConfig-DT7JPV2e.css: -------------------------------------------------------------------------------- 1 | .oauth-config-container[data-v-c19d9240]{padding:20px}.config-tips[data-v-c19d9240]{margin-bottom:20px;padding:15px;background-color:#f5f7fa;border-radius:4px}.config-tips p[data-v-c19d9240]{margin:8px 0;color:#606266;font-size:14px}.config-tips[data-v-c19d9240] .el-link{font-weight:700}.tab-header[data-v-c19d9240]{margin-bottom:20px}[data-v-c19d9240] .el-switch{--el-switch-on-color: var(--el-color-success)} 2 | -------------------------------------------------------------------------------- /web/dist/assets/Users-Bakk32z7.css: -------------------------------------------------------------------------------- 1 | .users-container[data-v-5b934de0]{padding:20px}.header[data-v-5b934de0]{margin-bottom:20px}[data-v-5b934de0] .el-switch{--el-switch-on-color: var(--el-color-success)}.el-tabs[data-v-5b934de0]{margin:-20px}.el-tab-pane[data-v-5b934de0]{padding:20px} 2 | -------------------------------------------------------------------------------- /web/dist/assets/apl-B4CMkyY2.js: -------------------------------------------------------------------------------- 1 | var l={"+":["conjugate","add"],"−":["negate","subtract"],"×":["signOf","multiply"],"÷":["reciprocal","divide"],"⌈":["ceiling","greaterOf"],"⌊":["floor","lesserOf"],"∣":["absolute","residue"],"⍳":["indexGenerate","indexOf"],"?":["roll","deal"],"⋆":["exponentiate","toThePowerOf"],"⍟":["naturalLog","logToTheBase"],"○":["piTimes","circularFuncs"],"!":["factorial","binomial"],"⌹":["matrixInverse","matrixDivide"],"<":[null,"lessThan"],"≤":[null,"lessThanOrEqual"],"=":[null,"equals"],">":[null,"greaterThan"],"≥":[null,"greaterThanOrEqual"],"≠":[null,"notEqual"],"≡":["depth","match"],"≢":[null,"notMatch"],"∈":["enlist","membership"],"⍷":[null,"find"],"∪":["unique","union"],"∩":[null,"intersection"],"∼":["not","without"],"∨":[null,"or"],"∧":[null,"and"],"⍱":[null,"nor"],"⍲":[null,"nand"],"⍴":["shapeOf","reshape"],",":["ravel","catenate"],"⍪":[null,"firstAxisCatenate"],"⌽":["reverse","rotate"],"⊖":["axis1Reverse","axis1Rotate"],"⍉":["transpose",null],"↑":["first","take"],"↓":[null,"drop"],"⊂":["enclose","partitionWithAxis"],"⊃":["diclose","pick"],"⌷":[null,"index"],"⍋":["gradeUp",null],"⍒":["gradeDown",null],"⊤":["encode",null],"⊥":["decode",null],"⍕":["format","formatByExample"],"⍎":["execute",null],"⊣":["stop","left"],"⊢":["pass","right"]},t=/[\.\/⌿⍀¨⍣]/,a=/⍬/,i=/[\+−×÷⌈⌊∣⍳\?⋆⍟○!⌹<≤=>≥≠≡≢∈⍷∪∩∼∨∧⍱⍲⍴,⍪⌽⊖⍉↑↓⊂⊃⌷⍋⍒⊤⊥⍕⍎⊣⊢]/,u=/←/,o=/[⍝#].*$/,s=function(r){var n;return n=!1,function(e){return n=e,e===r?n==="\\":!0}};const f={name:"apl",startState:function(){return{prev:!1,func:!1,op:!1,string:!1,escape:!1}},token:function(r,n){var e;return r.eatSpace()?null:(e=r.next(),e==='"'||e==="'"?(r.eatWhile(s(e)),r.next(),n.prev=!0,"string"):/[\[{\(]/.test(e)?(n.prev=!1,null):/[\]}\)]/.test(e)?(n.prev=!0,null):a.test(e)?(n.prev=!1,"atom"):/[¯\d]/.test(e)?(n.func?(n.func=!1,n.prev=!1):n.prev=!0,r.eatWhile(/[\w\.]/),"number"):t.test(e)||u.test(e)?"operator":i.test(e)?(n.func=!0,n.prev=!1,l[e]?"variableName.function.standard":"variableName.function"):o.test(e)?(r.skipToEnd(),"comment"):e==="∘"&&r.peek()==="."?(r.next(),"variableName.function"):(r.eatWhile(/[\w\$_]/),n.prev=!0,"keyword"))}};export{f as apl}; 2 | -------------------------------------------------------------------------------- /web/dist/assets/asciiarmor-Df11BRmG.js: -------------------------------------------------------------------------------- 1 | function t(e){var r=e.match(/^\s*\S/);return e.skipToEnd(),r?"error":null}const i={name:"asciiarmor",token:function(e,r){var n;if(r.state=="top")return e.sol()&&(n=e.match(/^-----BEGIN (.*)?-----\s*$/))?(r.state="headers",r.type=n[1],"tag"):t(e);if(r.state=="headers"){if(e.sol()&&e.match(/^\w+:/))return r.state="header","atom";var o=t(e);return o&&(r.state="body"),o}else{if(r.state=="header")return e.skipToEnd(),r.state="headers","string";if(r.state=="body")return e.sol()&&(n=e.match(/^-----END (.*)?-----\s*$/))?n[1]!=r.type?"error":(r.state="end","tag"):e.eatWhile(/[A-Za-z0-9+\/=]/)?null:(e.next(),"error");if(r.state=="end")return t(e)}},blankLine:function(e){e.state=="headers"&&(e.state="body")},startState:function(){return{state:"top",type:null}}};export{i as asciiArmor}; 2 | -------------------------------------------------------------------------------- /web/dist/assets/brainfuck-C4LP7Hcl.js: -------------------------------------------------------------------------------- 1 | var f="><+-.,[]".split("");const r={name:"brainfuck",startState:function(){return{commentLine:!1,left:0,right:0,commentLoop:!1}},token:function(i,n){if(i.eatSpace())return null;i.sol()&&(n.commentLine=!1);var e=i.next().toString();if(f.indexOf(e)!==-1){if(n.commentLine===!0)return i.eol()&&(n.commentLine=!1),"comment";if(e==="]"||e==="[")return e==="["?n.left++:n.right++,"bracket";if(e==="+"||e==="-")return"keyword";if(e==="<"||e===">")return"atom";if(e==="."||e===",")return"def"}else return n.commentLine=!0,i.eol()&&(n.commentLine=!1),"comment";i.eol()&&(n.commentLine=!1)}};export{r as brainfuck}; 2 | -------------------------------------------------------------------------------- /web/dist/assets/cmake-BQqOBYOt.js: -------------------------------------------------------------------------------- 1 | var c=/({)?[a-zA-Z0-9_]+(})?/;function t(n,i){for(var e,r,u=!1;!n.eol()&&(e=n.next())!=i.pending;){if(e==="$"&&r!="\\"&&i.pending=='"'){u=!0;break}r=e}return u&&n.backUp(1),e==i.pending?i.continueString=!1:i.continueString=!0,"string"}function f(n,i){var e=n.next();return e==="$"?n.match(c)?"variableName.special":"variable":i.continueString?(n.backUp(1),t(n,i)):n.match(/(\s+)?\w+\(/)||n.match(/(\s+)?\w+\ \(/)?(n.backUp(1),"def"):e=="#"?(n.skipToEnd(),"comment"):e=="'"||e=='"'?(i.pending=e,t(n,i)):e=="("||e==")"?"bracket":e.match(/[0-9]/)?"number":(n.eatWhile(/[\w-]/),null)}const a={name:"cmake",startState:function(){var n={};return n.inDefinition=!1,n.inInclude=!1,n.continueString=!1,n.pending=!1,n},token:function(n,i){return n.eatSpace()?null:f(n,i)}};export{a as cmake}; 2 | -------------------------------------------------------------------------------- /web/dist/assets/commonlisp-DBKNyK5s.js: -------------------------------------------------------------------------------- 1 | var u=/^(block|let*|return-from|catch|load-time-value|setq|eval-when|locally|symbol-macrolet|flet|macrolet|tagbody|function|multiple-value-call|the|go|multiple-value-prog1|throw|if|progn|unwind-protect|labels|progv|let|quote)$/,c=/^with|^def|^do|^prog|case$|^cond$|bind$|when$|unless$/,f=/^(?:[+\-]?(?:\d+|\d*\.\d+)(?:[efd][+\-]?\d+)?|[+\-]?\d+(?:\/[+\-]?\d+)?|#b[+\-]?[01]+|#o[+\-]?[0-7]+|#x[+\-]?[\da-f]+)/,d=/[^\s'`,@()\[\]";]/,l;function i(e){for(var n;n=e.next();)if(n=="\\")e.next();else if(!d.test(n)){e.backUp(1);break}return e.current()}function o(e,n){if(e.eatSpace())return l="ws",null;if(e.match(f))return"number";var t=e.next();if(t=="\\"&&(t=e.next()),t=='"')return(n.tokenize=p)(e,n);if(t=="(")return l="open","bracket";if(t==")")return l="close","bracket";if(t==";")return e.skipToEnd(),l="ws","comment";if(/['`,@]/.test(t))return null;if(t=="|")return e.skipTo("|")?(e.next(),"variableName"):(e.skipToEnd(),"error");if(t=="#"){var t=e.next();return t=="("?(l="open","bracket"):/[+\-=\.']/.test(t)||/\d/.test(t)&&e.match(/^\d*#/)?null:t=="|"?(n.tokenize=x)(e,n):t==":"?(i(e),"meta"):t=="\\"?(e.next(),i(e),"string.special"):"error"}else{var r=i(e);return r=="."?null:(l="symbol",r=="nil"||r=="t"||r.charAt(0)==":"?"atom":n.lastType=="open"&&(u.test(r)||c.test(r))?"keyword":r.charAt(0)=="&"?"variableName.special":"variableName")}}function p(e,n){for(var t=!1,r;r=e.next();){if(r=='"'&&!t){n.tokenize=o;break}t=!t&&r=="\\"}return"string"}function x(e,n){for(var t,r;t=e.next();){if(t=="#"&&r=="|"){n.tokenize=o;break}r=t}return l="ws","comment"}const s={name:"commonlisp",startState:function(){return{ctx:{prev:null,start:0,indentTo:0},lastType:null,tokenize:o}},token:function(e,n){e.sol()&&typeof n.ctx.indentTo!="number"&&(n.ctx.indentTo=n.ctx.start+1),l=null;var t=n.tokenize(e,n);return l!="ws"&&(n.ctx.indentTo==null?l=="symbol"&&c.test(e.current())?n.ctx.indentTo=n.ctx.start+e.indentUnit:n.ctx.indentTo="next":n.ctx.indentTo=="next"&&(n.ctx.indentTo=e.column()),n.lastType=l),l=="open"?n.ctx={prev:n.ctx,start:e.column(),indentTo:null}:l=="close"&&(n.ctx=n.ctx.prev||n.ctx),t},indent:function(e){var n=e.ctx.indentTo;return typeof n=="number"?n:e.ctx.start+1},languageData:{commentTokens:{line:";;",block:{open:"#|",close:"|#"}},closeBrackets:{brackets:["(","[","{",'"']}}};export{s as commonLisp}; 2 | -------------------------------------------------------------------------------- /web/dist/assets/cypher-C_CwsFkJ.js: -------------------------------------------------------------------------------- 1 | var l=function(n){return new RegExp("^(?:"+n.join("|")+")$","i")},p=function(n){i=null;var e=n.next();if(e==='"')return n.match(/^.*?"/),"string";if(e==="'")return n.match(/^.*?'/),"string";if(/[{}\(\),\.;\[\]]/.test(e))return i=e,"punctuation";if(e==="/"&&n.eat("/"))return n.skipToEnd(),"comment";if(u.test(e))return n.eatWhile(u),null;if(n.eatWhile(/[_\w\d]/),n.eat(":"))return n.eatWhile(/[\w\d_\-]/),"atom";var t=n.current();return d.test(t)?"builtin":f.test(t)?"def":h.test(t)||x.test(t)?"keyword":"variable"},o=function(n,e,t){return n.context={prev:n.context,indent:n.indent,col:t,type:e}},c=function(n){return n.indent=n.context.indent,n.context=n.context.prev},i,d=l(["abs","acos","allShortestPaths","asin","atan","atan2","avg","ceil","coalesce","collect","cos","cot","count","degrees","e","endnode","exp","extract","filter","floor","haversin","head","id","keys","labels","last","left","length","log","log10","lower","ltrim","max","min","node","nodes","percentileCont","percentileDisc","pi","radians","rand","range","reduce","rel","relationship","relationships","replace","reverse","right","round","rtrim","shortestPath","sign","sin","size","split","sqrt","startnode","stdev","stdevp","str","substring","sum","tail","tan","timestamp","toFloat","toInt","toString","trim","type","upper"]),f=l(["all","and","any","contains","exists","has","in","none","not","or","single","xor"]),h=l(["as","asc","ascending","assert","by","case","commit","constraint","create","csv","cypher","delete","desc","descending","detach","distinct","drop","else","end","ends","explain","false","fieldterminator","foreach","from","headers","in","index","is","join","limit","load","match","merge","null","on","optional","order","periodic","profile","remove","return","scan","set","skip","start","starts","then","true","union","unique","unwind","using","when","where","with","call","yield"]),x=l(["access","active","assign","all","alter","as","catalog","change","copy","create","constraint","constraints","current","database","databases","dbms","default","deny","drop","element","elements","exists","from","grant","graph","graphs","if","index","indexes","label","labels","management","match","name","names","new","node","nodes","not","of","on","or","password","populated","privileges","property","read","relationship","relationships","remove","replace","required","revoke","role","roles","set","show","start","status","stop","suspended","to","traverse","type","types","user","users","with","write"]),u=/[*+\-<>=&|~%^]/;const g={name:"cypher",startState:function(){return{tokenize:p,context:null,indent:0,col:0}},token:function(n,e){if(n.sol()&&(e.context&&e.context.align==null&&(e.context.align=!1),e.indent=n.indentation()),n.eatSpace())return null;var t=e.tokenize(n,e);if(t!=="comment"&&e.context&&e.context.align==null&&e.context.type!=="pattern"&&(e.context.align=!0),i==="(")o(e,")",n.column());else if(i==="[")o(e,"]",n.column());else if(i==="{")o(e,"}",n.column());else if(/[\]\}\)]/.test(i)){for(;e.context&&e.context.type==="pattern";)c(e);e.context&&i===e.context.type&&c(e)}else i==="."&&e.context&&e.context.type==="pattern"?c(e):/atom|string|variable/.test(t)&&e.context&&(/[\}\]]/.test(e.context.type)?o(e,"pattern",n.column()):e.context.type==="pattern"&&!e.context.align&&(e.context.align=!0,e.context.col=n.column()));return t},indent:function(n,e,t){var a=e&&e.charAt(0),r=n.context;if(/[\]\}]/.test(a))for(;r&&r.type==="pattern";)r=r.prev;var s=r&&a===r.type;return r?r.type==="keywords"?null:r.align?r.col+(s?0:1):r.indent+(s?0:t.unit):0}};export{g as cypher}; 2 | -------------------------------------------------------------------------------- /web/dist/assets/diff-DbItnlRl.js: -------------------------------------------------------------------------------- 1 | var o={"+":"inserted","-":"deleted","@":"meta"};const r={name:"diff",token:function(n){var e=n.string.search(/[\t ]+?$/);if(!n.sol()||e===0)return n.skipToEnd(),("error "+(o[n.string.charAt(0)]||"")).replace(/ $/,"");var i=o[n.peek()]||n.skipToEnd();return e===-1?n.skipToEnd():n.pos=e,i}};export{r as diff}; 2 | -------------------------------------------------------------------------------- /web/dist/assets/dingtalk-Bty8SPLc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/X-Mars/beenote/0aa5f3743597a6a8345b542cc547f3a6431de647/web/dist/assets/dingtalk-Bty8SPLc.png -------------------------------------------------------------------------------- /web/dist/assets/dockerfile-BU1Ap__c.js: -------------------------------------------------------------------------------- 1 | import{s as o}from"./simple-mode-CKxFYdZi.js";var e="from",s=new RegExp("^(\\s*)\\b("+e+")\\b","i"),n=["run","cmd","entrypoint","shell"],l=new RegExp("^(\\s*)("+n.join("|")+")(\\s+\\[)","i"),t="expose",x=new RegExp("^(\\s*)("+t+")(\\s+)","i"),g=["arg","from","maintainer","label","env","add","copy","volume","user","workdir","onbuild","stopsignal","healthcheck","shell"],u=[e,t].concat(n).concat(g),r="("+u.join("|")+")",a=new RegExp("^(\\s*)"+r+"(\\s*)(#.*)?$","i"),k=new RegExp("^(\\s*)"+r+"(\\s+)","i");const m=o({start:[{regex:/^\s*#.*$/,sol:!0,token:"comment"},{regex:s,token:[null,"keyword"],sol:!0,next:"from"},{regex:a,token:[null,"keyword",null,"error"],sol:!0},{regex:l,token:[null,"keyword",null],sol:!0,next:"array"},{regex:x,token:[null,"keyword",null],sol:!0,next:"expose"},{regex:k,token:[null,"keyword",null],sol:!0,next:"arguments"},{regex:/./,token:null}],from:[{regex:/\s*$/,token:null,next:"start"},{regex:/(\s*)(#.*)$/,token:[null,"error"],next:"start"},{regex:/(\s*\S+\s+)(as)/i,token:[null,"keyword"],next:"start"},{token:null,next:"start"}],single:[{regex:/(?:[^\\']|\\.)/,token:"string"},{regex:/'/,token:"string",pop:!0}],double:[{regex:/(?:[^\\"]|\\.)/,token:"string"},{regex:/"/,token:"string",pop:!0}],array:[{regex:/\]/,token:null,next:"start"},{regex:/"(?:[^\\"]|\\.)*"?/,token:"string"}],expose:[{regex:/\d+$/,token:"number",next:"start"},{regex:/[^\d]+$/,token:null,next:"start"},{regex:/\d+/,token:"number"},{regex:/[^\d]+/,token:null},{token:null,next:"start"}],arguments:[{regex:/^\s*#.*$/,sol:!0,token:"comment"},{regex:/"(?:[^\\"]|\\.)*"?$/,token:"string",next:"start"},{regex:/"/,token:"string",push:"double"},{regex:/'(?:[^\\']|\\.)*'?$/,token:"string",next:"start"},{regex:/'/,token:"string",push:"single"},{regex:/[^#"']+[\\`]$/,token:null},{regex:/[^#"']+$/,token:null,next:"start"},{regex:/[^#"']+/,token:null},{token:null,next:"start"}],languageData:{commentTokens:{line:"#"}}});export{m as dockerFile}; 2 | -------------------------------------------------------------------------------- /web/dist/assets/dtd-DF_7sFjM.js: -------------------------------------------------------------------------------- 1 | var u;function r(e,n){return u=n,e}function t(e,n){var l=e.next();if(l=="<"&&e.eat("!")){if(e.eatWhile(/[\-]/))return n.tokenize=o,o(e,n);if(e.eatWhile(/[\w]/))return r("keyword","doindent")}else{if(l=="<"&&e.eat("?"))return n.tokenize=a("meta","?>"),r("meta",l);if(l=="#"&&e.eatWhile(/[\w]/))return r("atom","tag");if(l=="|")return r("keyword","separator");if(l.match(/[\(\)\[\]\-\.,\+\?>]/))return r(null,l);if(l.match(/[\[\]]/))return r("rule",l);if(l=='"'||l=="'")return n.tokenize=k(l),n.tokenize(e,n);if(e.eatWhile(/[a-zA-Z\?\+\d]/)){var i=e.current();return i.substr(i.length-1,i.length).match(/\?|\+/)!==null&&e.backUp(1),r("tag","tag")}else return l=="%"||l=="*"?r("number","number"):(e.eatWhile(/[\w\\\-_%.{,]/),r(null,null))}}function o(e,n){for(var l=0,i;(i=e.next())!=null;){if(l>=2&&i==">"){n.tokenize=t;break}l=i=="-"?l+1:0}return r("comment","comment")}function k(e){return function(n,l){for(var i=!1,c;(c=n.next())!=null;){if(c==e&&!i){l.tokenize=t;break}i=!i&&c=="\\"}return r("string","tag")}}function a(e,n){return function(l,i){for(;!l.eol();){if(l.match(n)){i.tokenize=t;break}l.next()}return e}}const f={name:"dtd",startState:function(){return{tokenize:t,baseIndent:0,stack:[]}},token:function(e,n){if(e.eatSpace())return null;var l=n.tokenize(e,n),i=n.stack[n.stack.length-1];return e.current()=="["||u==="doindent"||u=="["?n.stack.push("rule"):u==="endtag"?n.stack[n.stack.length-1]="endtag":e.current()=="]"||u=="]"||u==">"&&i=="rule"?n.stack.pop():u=="["&&n.stack.push("["),l},indent:function(e,n,l){var i=e.stack.length;return n.charAt(0)==="]"?i--:n.substr(n.length-1,n.length)===">"&&(n.substr(0,1)==="<"||u=="doindent"&&n.length>1||(u=="doindent"?i--:u==">"&&n.length>1||u=="tag"&&n!==">"||(u=="tag"&&e.stack[e.stack.length-1]=="rule"?i--:u=="tag"?i++:n===">"&&e.stack[e.stack.length-1]=="rule"&&u===">"?i--:n===">"&&e.stack[e.stack.length-1]=="rule"||(n.substr(0,1)!=="<"&&n.substr(0,1)===">"?i=i-1:n===">"||(i=i-1)))),(u==null||u=="]")&&i--),e.baseIndent+i*l.unit},languageData:{indentOnInput:/^\s*[\]>]$/}};export{f as dtd}; 2 | -------------------------------------------------------------------------------- /web/dist/assets/ebnf-CDyGwa7X.js: -------------------------------------------------------------------------------- 1 | var i={slash:0,parenthesis:1},n={comment:0,_string:1,characterClass:2};const l={name:"ebnf",startState:function(){return{stringType:null,commentType:null,braced:0,lhs:!0,localState:null,stack:[],inDefinition:!1}},token:function(e,c){if(e){switch(c.stack.length===0&&(e.peek()=='"'||e.peek()=="'"?(c.stringType=e.peek(),e.next(),c.stack.unshift(n._string)):e.match("/*")?(c.stack.unshift(n.comment),c.commentType=i.slash):e.match("(*")&&(c.stack.unshift(n.comment),c.commentType=i.parenthesis)),c.stack[0]){case n._string:for(;c.stack[0]===n._string&&!e.eol();)e.peek()===c.stringType?(e.next(),c.stack.shift()):e.peek()==="\\"?(e.next(),e.next()):e.match(/^.[^\\\"\']*/);return c.lhs?"property":"string";case n.comment:for(;c.stack[0]===n.comment&&!e.eol();)c.commentType===i.slash&&e.match("*/")||c.commentType===i.parenthesis&&e.match("*)")?(c.stack.shift(),c.commentType=null):e.match(/^.[^\*]*/);return"comment";case n.characterClass:for(;c.stack[0]===n.characterClass&&!e.eol();)e.match(/^[^\]\\]+/)||e.match(".")||c.stack.shift();return"operator"}var t=e.peek();switch(t){case"[":return e.next(),c.stack.unshift(n.characterClass),"bracket";case":":case"|":case";":return e.next(),"operator";case"%":if(e.match("%%"))return"header";if(e.match(/[%][A-Za-z]+/))return"keyword";if(e.match(/[%][}]/))return"bracket";break;case"/":if(e.match(/[\/][A-Za-z]+/))return"keyword";case"\\":if(e.match(/[\][a-z]+/))return"string.special";case".":if(e.match("."))return"atom";case"*":case"-":case"+":case"^":if(e.match(t))return"atom";case"$":if(e.match("$$"))return"builtin";if(e.match(/[$][0-9]+/))return"variableName.special";case"<":if(e.match(/<<[a-zA-Z_]+>>/))return"builtin"}return e.match("//")?(e.skipToEnd(),"comment"):e.match("return")?"operator":e.match(/^[a-zA-Z_][a-zA-Z0-9_]*/)?e.match(/(?=[\(.])/)?"variable":e.match(/(?=[\s\n]*[:=])/)?"def":"variableName.special":["[","]","(",")"].indexOf(e.peek())!=-1?(e.next(),"bracket"):(e.eatSpace()||e.next(),null)}}};export{l as ebnf}; 2 | -------------------------------------------------------------------------------- /web/dist/assets/eiffel-CnydiIhH.js: -------------------------------------------------------------------------------- 1 | function u(e){for(var r={},n=0,t=e.length;n>"]);function f(e,r,n){return n.tokenize.push(e),e(r,n)}function s(e,r){if(e.eatSpace())return null;var n=e.next();return n=='"'||n=="'"?f(p(n,"string"),e,r):n=="-"&&e.eat("-")?(e.skipToEnd(),"comment"):n==":"&&e.eat("=")?"operator":/[0-9]/.test(n)?(e.eatWhile(/[xXbBCc0-9\.]/),e.eat(/[\?\!]/),"variable"):/[a-zA-Z_0-9]/.test(n)?(e.eatWhile(/[a-zA-Z_0-9]/),e.eat(/[\?\!]/),"variable"):/[=+\-\/*^%<>~]/.test(n)?(e.eatWhile(/[=+\-\/*^%<>~]/),"operator"):null}function p(e,r,n){return function(t,o){for(var a=!1,i;(i=t.next())!=null;){if(i==e&&!a){o.tokenize.pop();break}a=!a&&i=="%"}return r}}const d={name:"eiffel",startState:function(){return{tokenize:[s]}},token:function(e,r){var n=r.tokenize[r.tokenize.length-1](e,r);if(n=="variable"){var t=e.current();n=l.propertyIsEnumerable(e.current())?"keyword":c.propertyIsEnumerable(e.current())?"operator":/^[A-Z][A-Z_0-9]*$/g.test(t)?"tag":/^0[bB][0-1]+$/g.test(t)||/^0[cC][0-7]+$/g.test(t)||/^0[xX][a-fA-F0-9]+$/g.test(t)||/^([0-9]+\.[0-9]*)|([0-9]*\.[0-9]+)$/g.test(t)||/^[0-9]+$/g.test(t)?"number":"variable"}return n},languageData:{commentTokens:{line:"--"}}};export{d as eiffel}; 2 | -------------------------------------------------------------------------------- /web/dist/assets/elm-vLlmbW-K.js: -------------------------------------------------------------------------------- 1 | function a(n,t,i){return t(i),i(n,t)}var v=/[a-z]/,g=/[A-Z]/,l=/[a-zA-Z0-9_]/,f=/[0-9]/,o=/[0-9A-Fa-f]/,p=/[-&*+.\\/<>=?^|:]/,w=/[(),[\]{}]/,x=/[ \v\f]/;function r(){return function(n,t){if(n.eatWhile(x))return null;var i=n.next();if(w.test(i))return i==="{"&&n.eat("-")?a(n,t,h(1)):i==="["&&n.match("glsl|")?a(n,t,u):"builtin";if(i==="'")return a(n,t,d);if(i==='"')return n.eat('"')?n.eat('"')?a(n,t,k):"string":a(n,t,E);if(g.test(i))return n.eatWhile(l),"type";if(v.test(i)){var e=n.pos===1;return n.eatWhile(l),e?"def":"variable"}if(f.test(i)){if(i==="0"){if(n.eat(/[xX]/))return n.eatWhile(o),"number"}else n.eatWhile(f);return n.eat(".")&&n.eatWhile(f),n.eat(/[eE]/)&&(n.eat(/[-+]/),n.eatWhile(f)),"number"}return p.test(i)?i==="-"&&n.eat("-")?(n.skipToEnd(),"comment"):(n.eatWhile(p),"keyword"):i==="_"?"keyword":"error"}}function h(n){return n==0?r():function(t,i){for(;!t.eol();){var e=t.next();if(e=="{"&&t.eat("-"))++n;else if(e=="-"&&t.eat("}")&&(--n,n===0))return i(r()),"comment"}return i(h(n)),"comment"}}function k(n,t){for(;!n.eol();){var i=n.next();if(i==='"'&&n.eat('"')&&n.eat('"'))return t(r()),"string"}return"string"}function E(n,t){for(;n.skipTo('\\"');)n.next(),n.next();return n.skipTo('"')?(n.next(),t(r()),"string"):(n.skipToEnd(),t(r()),"error")}function d(n,t){for(;n.skipTo("\\'");)n.next(),n.next();return n.skipTo("'")?(n.next(),t(r()),"string"):(n.skipToEnd(),t(r()),"error")}function u(n,t){for(;!n.eol();){var i=n.next();if(i==="|"&&n.eat("]"))return t(r()),"string"}return"string"}var y={case:1,of:1,as:1,if:1,then:1,else:1,let:1,in:1,type:1,alias:1,module:1,where:1,import:1,exposing:1,port:1};const W={name:"elm",startState:function(){return{f:r()}},copyState:function(n){return{f:n.f}},token:function(n,t){var i=t.f(n,function(m){t.f=m}),e=n.current();return y.hasOwnProperty(e)?"keyword":i},languageData:{commentTokens:{line:"--"}}};export{W as elm}; 2 | -------------------------------------------------------------------------------- /web/dist/assets/factor-BPndPnYX.js: -------------------------------------------------------------------------------- 1 | import{s as e}from"./simple-mode-CKxFYdZi.js";const n=e({start:[{regex:/#?!.*/,token:"comment"},{regex:/"""/,token:"string",next:"string3"},{regex:/(STRING:)(\s)/,token:["keyword",null],next:"string2"},{regex:/\S*?"/,token:"string",next:"string"},{regex:/(?:0x[\d,a-f]+)|(?:0o[0-7]+)|(?:0b[0,1]+)|(?:\-?\d+.?\d*)(?=\s)/,token:"number"},{regex:/((?:GENERIC)|\:?\:)(\s+)(\S+)(\s+)(\()/,token:["keyword",null,"def",null,"bracket"],next:"stack"},{regex:/(M\:)(\s+)(\S+)(\s+)(\S+)/,token:["keyword",null,"def",null,"tag"]},{regex:/USING\:/,token:"keyword",next:"vocabulary"},{regex:/(USE\:|IN\:)(\s+)(\S+)(?=\s|$)/,token:["keyword",null,"tag"]},{regex:/(\S+\:)(\s+)(\S+)(?=\s|$)/,token:["keyword",null,"def"]},{regex:/(?:;|\\|t|f|if|loop|while|until|do|PRIVATE>|\.\*\?]+(?=\s|$)/,token:"builtin"},{regex:/[\)><]+\S+(?=\s|$)/,token:"builtin"},{regex:/(?:[\+\-\=\/\*<>])(?=\s|$)/,token:"keyword"},{regex:/\S+/,token:"variable"},{regex:/\s+|./,token:null}],vocabulary:[{regex:/;/,token:"keyword",next:"start"},{regex:/\S+/,token:"tag"},{regex:/\s+|./,token:null}],string:[{regex:/(?:[^\\]|\\.)*?"/,token:"string",next:"start"},{regex:/.*/,token:"string"}],string2:[{regex:/^;/,token:"keyword",next:"start"},{regex:/.*/,token:"string"}],string3:[{regex:/(?:[^\\]|\\.)*?"""/,token:"string",next:"start"},{regex:/.*/,token:"string"}],stack:[{regex:/\)/,token:"bracket",next:"start"},{regex:/--/,token:"bracket"},{regex:/\S+/,token:"meta"},{regex:/\s+|./,token:null}],languageData:{name:"factor",dontIndentStates:["start","vocabulary","string","string3","stack"],commentTokens:{line:"!"}}});export{n as factor}; 2 | -------------------------------------------------------------------------------- /web/dist/assets/fcl-Kvtd6kyn.js: -------------------------------------------------------------------------------- 1 | var d={term:!0,method:!0,accu:!0,rule:!0,then:!0,is:!0,and:!0,or:!0,if:!0,default:!0},f={var_input:!0,var_output:!0,fuzzify:!0,defuzzify:!0,function_block:!0,ruleblock:!0},o={end_ruleblock:!0,end_defuzzify:!0,end_function_block:!0,end_fuzzify:!0,end_var:!0},p={true:!0,false:!0,nan:!0,real:!0,min:!0,max:!0,cog:!0,cogs:!0},l=/[+\-*&^%:=<>!|\/]/;function i(e,n){var t=e.next();if(/[\d\.]/.test(t))return t=="."?e.match(/^[0-9]+([eE][\-+]?[0-9]+)?/):t=="0"?e.match(/^[xX][0-9a-fA-F]+/)||e.match(/^0[0-7]+/):e.match(/^[0-9]*\.?[0-9]*([eE][\-+]?[0-9]+)?/),"number";if(t=="/"||t=="("){if(e.eat("*"))return n.tokenize=c,c(e,n);if(e.eat("/"))return e.skipToEnd(),"comment"}if(l.test(t))return e.eatWhile(l),"operator";e.eatWhile(/[\w\$_\xa1-\uffff]/);var r=e.current().toLowerCase();return d.propertyIsEnumerable(r)||f.propertyIsEnumerable(r)||o.propertyIsEnumerable(r)?"keyword":p.propertyIsEnumerable(r)?"atom":"variable"}function c(e,n){for(var t=!1,r;r=e.next();){if((r=="/"||r==")")&&t){n.tokenize=i;break}t=r=="*"}return"comment"}function a(e,n,t,r,u){this.indented=e,this.column=n,this.type=t,this.align=r,this.prev=u}function k(e,n,t){return e.context=new a(e.indented,n,t,null,e.context)}function v(e){if(e.context.prev){var n=e.context.type;return n=="end_block"&&(e.indented=e.context.indented),e.context=e.context.prev}}const x={name:"fcl",startState:function(e){return{tokenize:null,context:new a(-e,0,"top",!1),indented:0,startOfLine:!0}},token:function(e,n){var t=n.context;if(e.sol()&&(t.align==null&&(t.align=!1),n.indented=e.indentation(),n.startOfLine=!0),e.eatSpace())return null;var r=(n.tokenize||i)(e,n);if(r=="comment")return r;t.align==null&&(t.align=!0);var u=e.current().toLowerCase();return f.propertyIsEnumerable(u)?k(n,e.column(),"end_block"):o.propertyIsEnumerable(u)&&v(n),n.startOfLine=!1,r},indent:function(e,n,t){if(e.tokenize!=i&&e.tokenize!=null)return 0;var r=e.context,u=o.propertyIsEnumerable(n);return r.align?r.column+(u?0:1):r.indented+(u?0:t.unit)},languageData:{commentTokens:{line:"//",block:{open:"(*",close:"*)"}}}};export{x as fcl}; 2 | -------------------------------------------------------------------------------- /web/dist/assets/forth-Ffai-XNe.js: -------------------------------------------------------------------------------- 1 | function t(i){var n=[];return i.split(" ").forEach(function(E){n.push({name:E})}),n}var r=t("INVERT AND OR XOR 2* 2/ LSHIFT RSHIFT 0= = 0< < > U< MIN MAX 2DROP 2DUP 2OVER 2SWAP ?DUP DEPTH DROP DUP OVER ROT SWAP >R R> R@ + - 1+ 1- ABS NEGATE S>D * M* UM* FM/MOD SM/REM UM/MOD */ */MOD / /MOD MOD HERE , @ ! CELL+ CELLS C, C@ C! CHARS 2@ 2! ALIGN ALIGNED +! ALLOT CHAR [CHAR] [ ] BL FIND EXECUTE IMMEDIATE COUNT LITERAL STATE ; DOES> >BODY EVALUATE SOURCE >IN <# # #S #> HOLD SIGN BASE >NUMBER HEX DECIMAL FILL MOVE . CR EMIT SPACE SPACES TYPE U. .R U.R ACCEPT TRUE FALSE <> U> 0<> 0> NIP TUCK ROLL PICK 2>R 2R@ 2R> WITHIN UNUSED MARKER I J TO COMPILE, [COMPILE] SAVE-INPUT RESTORE-INPUT PAD ERASE 2LITERAL DNEGATE D- D+ D0< D0= D2* D2/ D< D= DMAX DMIN D>S DABS M+ M*/ D. D.R 2ROT DU< CATCH THROW FREE RESIZE ALLOCATE CS-PICK CS-ROLL GET-CURRENT SET-CURRENT FORTH-WORDLIST GET-ORDER SET-ORDER PREVIOUS SEARCH-WORDLIST WORDLIST FIND ALSO ONLY FORTH DEFINITIONS ORDER -TRAILING /STRING SEARCH COMPARE CMOVE CMOVE> BLANK SLITERAL"),O=t("IF ELSE THEN BEGIN WHILE REPEAT UNTIL RECURSE [IF] [ELSE] [THEN] ?DO DO LOOP +LOOP UNLOOP LEAVE EXIT AGAIN CASE OF ENDOF ENDCASE");function R(i,n){var E;for(E=i.length-1;E>=0;E--)if(i[E].name===n.toUpperCase())return i[E]}const L={name:"forth",startState:function(){return{state:"",base:10,coreWordList:r,immediateWordList:O,wordList:[]}},token:function(i,n){var E;if(i.eatSpace())return null;if(n.state===""){if(i.match(/^(\]|:NONAME)(\s|$)/i))return n.state=" compilation","builtin";if(E=i.match(/^(\:)\s+(\S+)(\s|$)+/),E)return n.wordList.push({name:E[2].toUpperCase()}),n.state=" compilation","def";if(E=i.match(/^(VARIABLE|2VARIABLE|CONSTANT|2CONSTANT|CREATE|POSTPONE|VALUE|WORD)\s+(\S+)(\s|$)+/i),E)return n.wordList.push({name:E[2].toUpperCase()}),"def";if(E=i.match(/^(\'|\[\'\])\s+(\S+)(\s|$)+/),E)return"builtin"}else{if(i.match(/^(\;|\[)(\s)/))return n.state="",i.backUp(1),"builtin";if(i.match(/^(\;|\[)($)/))return n.state="","builtin";if(i.match(/^(POSTPONE)\s+\S+(\s|$)+/))return"builtin"}if(E=i.match(/^(\S+)(\s+|$)/),E)return R(n.wordList,E[1])!==void 0?"variable":E[1]==="\\"?(i.skipToEnd(),"comment"):R(n.coreWordList,E[1])!==void 0?"builtin":R(n.immediateWordList,E[1])!==void 0?"keyword":E[1]==="("?(i.eatWhile(function(e){return e!==")"}),i.eat(")"),"comment"):E[1]===".("?(i.eatWhile(function(e){return e!==")"}),i.eat(")"),"string"):E[1]==='S"'||E[1]==='."'||E[1]==='C"'?(i.eatWhile(function(e){return e!=='"'}),i.eat('"'),"string"):E[1]-68719476735?"number":"atom"}};export{L as forth}; 2 | -------------------------------------------------------------------------------- /web/dist/assets/http-DBlCnlav.js: -------------------------------------------------------------------------------- 1 | function u(r,n){return r.skipToEnd(),n.cur=t,"error"}function i(r,n){return r.match(/^HTTP\/\d\.\d/)?(n.cur=f,"keyword"):r.match(/^[A-Z]+/)&&/[ \t]/.test(r.peek())?(n.cur=d,"keyword"):u(r,n)}function f(r,n){var e=r.match(/^\d+/);if(!e)return u(r,n);n.cur=l;var o=Number(e[0]);return o>=100&&o<400?"atom":"error"}function l(r,n){return r.skipToEnd(),n.cur=t,null}function d(r,n){return r.eatWhile(/\S/),n.cur=s,"string.special"}function s(r,n){return r.match(/^HTTP\/\d\.\d$/)?(n.cur=t,"keyword"):u(r,n)}function t(r){return r.sol()&&!r.eat(/[ \t]/)?r.match(/^.*?:/)?"atom":(r.skipToEnd(),"error"):(r.skipToEnd(),"string")}function c(r){return r.skipToEnd(),null}const p={name:"http",token:function(r,n){var e=n.cur;return e!=t&&e!=c&&r.eatSpace()?null:e(r,n)},blankLine:function(r){r.cur=c},startState:function(){return{cur:i}}};export{p as http}; 2 | -------------------------------------------------------------------------------- /web/dist/assets/index-3sg4Vsm0.js: -------------------------------------------------------------------------------- 1 | import{a as s,s as n,t as r,L as o,b as P,i as Q,f as i,c as a,k as c}from"./NoteEdit-C-i8Hbkk.js";import"./index-BQnrSvw8.js";import"./style-IFfT69lj.js";import"./index-DKjOyILR.js";const g=n({String:r.string,Number:r.number,"True False":r.bool,PropertyName:r.propertyName,Null:r.null,", :":r.separator,"[ ]":r.squareBracket,"{ }":r.brace}),p=s.deserialize({version:14,states:"$bOVQPOOOOQO'#Cb'#CbOnQPO'#CeOvQPO'#ClOOQO'#Cr'#CrQOQPOOOOQO'#Cg'#CgO}QPO'#CfO!SQPO'#CtOOQO,59P,59PO![QPO,59PO!aQPO'#CuOOQO,59W,59WO!iQPO,59WOVQPO,59QOqQPO'#CmO!nQPO,59`OOQO1G.k1G.kOVQPO'#CnO!vQPO,59aOOQO1G.r1G.rOOQO1G.l1G.lOOQO,59X,59XOOQO-E6k-E6kOOQO,59Y,59YOOQO-E6l-E6l",stateData:"#O~OeOS~OQSORSOSSOTSOWQO_ROgPO~OVXOgUO~O^[O~PVO[^O~O]_OVhX~OVaO~O]bO^iX~O^dO~O]_OVha~O]bO^ia~O",goto:"!kjPPPPPPkPPkqwPPPPk{!RPPP!XP!e!hXSOR^bQWQRf_TVQ_Q`WRg`QcZRicQTOQZRQe^RhbRYQR]R",nodeNames:"⚠ JsonText True False Null Number String } { Object Property PropertyName : , ] [ Array",maxTerm:25,nodeProps:[["isolate",-2,6,11,""],["openedBy",7,"{",14,"["],["closedBy",8,"}",15,"]"]],propSources:[g],skippedNodes:[0],repeatNodeCount:2,tokenData:"(|~RaXY!WYZ!W]^!Wpq!Wrs!]|}$u}!O$z!Q!R%T!R![&c![!]&t!}#O&y#P#Q'O#Y#Z'T#b#c'r#h#i(Z#o#p(r#q#r(w~!]Oe~~!`Wpq!]qr!]rs!xs#O!]#O#P!}#P;'S!];'S;=`$o<%lO!]~!}Og~~#QXrs!]!P!Q!]#O#P!]#U#V!]#Y#Z!]#b#c!]#f#g!]#h#i!]#i#j#m~#pR!Q![#y!c!i#y#T#Z#y~#|R!Q![$V!c!i$V#T#Z$V~$YR!Q![$c!c!i$c#T#Z$c~$fR!Q![!]!c!i!]#T#Z!]~$rP;=`<%l!]~$zO]~~$}Q!Q!R%T!R![&c~%YRT~!O!P%c!g!h%w#X#Y%w~%fP!Q![%i~%nRT~!Q![%i!g!h%w#X#Y%w~%zR{|&T}!O&T!Q![&Z~&WP!Q![&Z~&`PT~!Q![&Z~&hST~!O!P%c!Q![&c!g!h%w#X#Y%w~&yO[~~'OO_~~'TO^~~'WP#T#U'Z~'^P#`#a'a~'dP#g#h'g~'jP#X#Y'm~'rOR~~'uP#i#j'x~'{P#`#a(O~(RP#`#a(U~(ZOS~~(^P#f#g(a~(dP#i#j(g~(jP#X#Y(m~(rOQ~~(wOW~~(|OV~",tokenizers:[0],topRules:{JsonText:[0,1]},tokenPrec:0}),h=()=>t=>{try{JSON.parse(t.state.doc.toString())}catch(O){if(!(O instanceof SyntaxError))throw O;const e=l(O,t.state.doc);return[{from:e,message:O.message,severity:"error",to:e}]}return[]};function l(t,O){let e;return(e=t.message.match(/at position (\d+)/))?Math.min(+e[1],O.length):(e=t.message.match(/at line (\d+) column (\d+)/))?Math.min(O.line(+e[1]).from+ +e[2]-1,O.length):0}const u=o.define({name:"json",parser:p.configure({props:[Q.add({Object:a({except:/^\s*\}/}),Array:a({except:/^\s*\]/})}),i.add({"Object Array":c})]}),languageData:{closeBrackets:{brackets:["[","{",'"']},indentOnInput:/^\s*[\}\]]$/}});function f(){return new P(u)}export{f as json,u as jsonLanguage,h as jsonParseLinter}; 2 | -------------------------------------------------------------------------------- /web/dist/assets/index-BCZP89dg.js: -------------------------------------------------------------------------------- 1 | import{L as p,b as u,q as l,r as n,a as m,v as b,s as S,t as e,l as r}from"./NoteEdit-C-i8Hbkk.js";import"./index-BQnrSvw8.js";import"./style-IFfT69lj.js";import"./index-DKjOyILR.js";const c=m.deserialize({version:14,states:"%pOVOWOOObQPOOOpOSO'#C_OOOO'#Cp'#CpQVOWOOQxQPOOO!TQQOOQ!YQPOOOOOO,58y,58yO!_OSO,58yOOOO-E6n-E6nO!dQQO'#CqQ{QPOOO!iQPOOQ{QPOOO!qQPOOOOOO1G.e1G.eOOQO,59],59]OOQO-E6o-E6oO!yOpO'#CiO#RO`O'#CiQOQPOOO#ZO#tO'#CmO#fO!bO'#CmOOQO,59T,59TO#qOpO,59TO#vO`O,59TOOOO'#Cr'#CrO#{O#tO,59XOOQO,59X,59XOOOO'#Cs'#CsO$WO!bO,59XOOQO1G.o1G.oOOOO-E6p-E6pOOQO1G.s1G.sOOOO-E6q-E6q",stateData:"$g~OjOS~OQROUROkQO~OWTOXUOZUO`VO~OSXOTWO~OXUO[]OlZO~OY^O~O[_O~OT`O~OYaO~OmcOodO~OmfOogO~O^iOnhO~O_jOphO~ObkOqkOrmO~OcnOsnOtmO~OnpO~OppO~ObkOqkOrrO~OcnOsnOtrO~OWX`~",goto:"!^hPPPiPPPPPPPPPmPPPpPPsy!Q!WTROSRe]Re_QSORYSS[T^Rb[QlfRqlQogRso",nodeNames:"⚠ Content Text Interpolation InterpolationContent }} Entity Attribute VueAttributeName : Identifier @ Is ScriptAttributeValue AttributeScript AttributeScript AttributeName AttributeValue Entity Entity",maxTerm:36,nodeProps:[["isolate",-3,3,13,17,""]],skippedNodes:[0],repeatNodeCount:4,tokenData:"'y~RdXY!aYZ!a]^!apq!ars!rwx!w}!O!|!O!P#t!Q![#y![!]$s!_!`%g!b!c%l!c!}#y#R#S#y#T#j#y#j#k%q#k#o#y%W;'S#y;'S;:j$m<%lO#y~!fSj~XY!aYZ!a]^!apq!a~!wOm~~!|Oo~!b#RX`!b}!O!|!Q![!|![!]!|!c!}!|#R#S!|#T#o!|%W;'S!|;'S;:j#n<%lO!|!b#qP;=`<%l!|~#yOl~%W$QXY#t`!b}!O!|!Q![#y![!]!|!c!}#y#R#S#y#T#o#y%W;'S#y;'S;:j$m<%lO#y%W$pP;=`<%l#y~$zXX~`!b}!O!|!Q![!|![!]!|!c!}!|#R#S!|#T#o!|%W;'S!|;'S;:j#n<%lO!|~%lO[~~%qOZ~%W%xXY#t`!b}!O&e!Q![#y![!]!|!c!}#y#R#S#y#T#o#y%W;'S#y;'S;:j$m<%lO#y!b&jX`!b}!O!|!Q![!|![!]!|!c!}'V#R#S!|#T#o'V%W;'S!|;'S;:j#n<%lO!|!b'^XW!b`!b}!O!|!Q![!|![!]!|!c!}'V#R#S!|#T#o'V%W;'S!|;'S;:j#n<%lO!|",tokenizers:[6,7,new r("b~RP#q#rU~XP#q#r[~aOT~~",17,4),new r("!k~RQvwX#o#p!_~^TU~Opmq!]m!^;'Sm;'S;=`!X<%lOm~pUOpmq!]m!]!^!S!^;'Sm;'S;=`!X<%lOm~!XOU~~![P;=`<%lm~!bP#o#p!e~!jOk~~",72,2),new r("[~RPwxU~ZOp~~",11,15),new r("[~RPrsU~ZOn~~",11,14),new r("!e~RQvwXwx!_~^Tc~Opmq!]m!^;'Sm;'S;=`!X<%lOm~pUOpmq!]m!]!^!S!^;'Sm;'S;=`!X<%lOm~!XOc~~![P;=`<%lm~!dOt~~",66,35),new r("!e~RQrsXvw^~^Or~~cTb~Oprq!]r!^;'Sr;'S;=`!^<%lOr~uUOprq!]r!]!^!X!^;'Sr;'S;=`!^<%lOr~!^Ob~~!aP;=`<%lr~",66,33)],topRules:{Content:[0,1],Attribute:[1,7]},tokenPrec:157}),P=b.parser.configure({top:"SingleExpression"}),o=c.configure({props:[S({Text:e.content,Is:e.definitionOperator,AttributeName:e.attributeName,VueAttributeName:e.keyword,Identifier:e.variableName,"AttributeValue ScriptAttributeValue":e.attributeValue,Entity:e.character,"{{ }}":e.brace,"@ :":e.punctuation})]}),s={parser:P},Q=o.configure({wrap:n((O,t)=>O.name=="InterpolationContent"?s:null)}),g=o.configure({wrap:n((O,t)=>O.name=="AttributeScript"?s:null),top:"Attribute"}),y={parser:Q},R={parser:g},a=l();function i(O){return O.configure({dialect:"selfClosing",wrap:n(X)},"vue")}const T=i(a.language);function X(O,t){switch(O.name){case"Attribute":return/^(@|:|v-)/.test(t.read(O.from,O.from+2))?R:null;case"Text":return y}return null}function d(O={}){let t=a;if(O.base){if(O.base.language.name!="html"||!(O.base.language instanceof p))throw new RangeError("The base option must be the result of calling html(...)");t=O.base}return new u(t.language==a.language?T:i(t.language),[t.support,t.language.data.of({closeBrackets:{brackets:["{",'"']}})])}export{d as vue,T as vueLanguage}; 2 | -------------------------------------------------------------------------------- /web/dist/assets/index-BUL7-L5W.js: -------------------------------------------------------------------------------- 1 | import{L as O,b as r,a as b,i as s,f as t,s as a,h as P,k as n,t as e}from"./NoteEdit-C-i8Hbkk.js";import"./index-BQnrSvw8.js";import"./style-IFfT69lj.js";import"./index-DKjOyILR.js";const S={__proto__:null,anyref:34,dataref:34,eqref:34,externref:34,i31ref:34,funcref:34,i8:34,i16:34,i32:34,i64:34,f32:34,f64:34},i=b.deserialize({version:14,states:"!^Q]QPOOOqQPO'#CbOOQO'#Cd'#CdOOQO'#Cl'#ClOOQO'#Ch'#ChQ]QPOOOOQO,58|,58|OxQPO,58|OOQO-E6f-E6fOOQO1G.h1G.h",stateData:"!P~O_OSPOSQOS~OTPOVROXROYROZROaQO~OSUO~P]OSXO~P]O",goto:"xaPPPPPPbPbPPPhPPPrXROPTVQTOQVPTWTVXSOPTV",nodeNames:"⚠ LineComment BlockComment Module ) ( App Identifier Type Keyword Number String",maxTerm:17,nodeProps:[["isolate",-3,1,2,11,""],["openedBy",4,"("],["closedBy",5,")"],["group",-6,6,7,8,9,10,11,"Expression"]],skippedNodes:[0,1,2],repeatNodeCount:1,tokenData:"0o~R^XY}YZ}]^}pq}rs!Stu#pxy'Uyz(e{|(j}!O(j!Q!R(s!R![*p!]!^.^#T#o.{~!SO_~~!VVOr!Srs!ls#O!S#O#P!q#P;'S!S;'S;=`#j<%lO!S~!qOZ~~!tRO;'S!S;'S;=`!};=`O!S~#QWOr!Srs!ls#O!S#O#P!q#P;'S!S;'S;=`#j;=`<%l!S<%lO!S~#mP;=`<%l!S~#siqr%bst%btu%buv%bvw%bwx%bz{%b{|%b}!O%b!O!P%b!P!Q%b!Q![%b![!]%b!^!_%b!_!`%b!`!a%b!a!b%b!b!c%b!c!}%b#Q#R%b#R#S%b#S#T%b#T#o%b#p#q%b#r#s%b~%giV~qr%bst%btu%buv%bvw%bwx%bz{%b{|%b}!O%b!O!P%b!P!Q%b!Q![%b![!]%b!^!_%b!_!`%b!`!a%b!a!b%b!b!c%b!c!}%b#Q#R%b#R#S%b#S#T%b#T#o%b#p#q%b#r#s%b~'ZPT~!]!^'^~'aTO!]'^!]!^'p!^;'S'^;'S;=`(_<%lO'^~'sVOy'^yz(Yz!]'^!]!^'p!^;'S'^;'S;=`(_<%lO'^~(_OQ~~(bP;=`<%l'^~(jOS~~(mQ!Q!R(s!R![*p~(xUY~!O!P)[!Q![*p!g!h){#R#S+U#X#Y){#l#m+[~)aRY~!Q![)j!g!h){#X#Y){~)oSY~!Q![)j!g!h){#R#S*j#X#Y){~*OR{|*X}!O*X!Q![*_~*[P!Q![*_~*dQY~!Q![*_#R#S*X~*mP!Q![)j~*uTY~!O!P)[!Q![*p!g!h){#R#S+U#X#Y){~+XP!Q![*p~+_R!Q![+h!c!i+h#T#Z+h~+mVY~!O!P,S!Q![+h!c!i+h!r!s-P#R#S+[#T#Z+h#d#e-P~,XTY~!Q![,h!c!i,h!r!s-P#T#Z,h#d#e-P~,mUY~!Q![,h!c!i,h!r!s-P#R#S.Q#T#Z,h#d#e-P~-ST{|-c}!O-c!Q![-o!c!i-o#T#Z-o~-fR!Q![-o!c!i-o#T#Z-o~-tSY~!Q![-o!c!i-o#R#S-c#T#Z-o~.TR!Q![,h!c!i,h#T#Z,h~.aP!]!^.d~.iSP~OY.dZ;'S.d;'S;=`.u<%lO.d~.xP;=`<%l.d~/QiX~qr.{st.{tu.{uv.{vw.{wx.{z{.{{|.{}!O.{!O!P.{!P!Q.{!Q![.{![!].{!^!_.{!_!`.{!`!a.{!a!b.{!b!c.{!c!}.{#Q#R.{#R#S.{#S#T.{#T#o.{#p#q.{#r#s.{",tokenizers:[0],topRules:{Module:[0,3]},specialized:[{term:9,get:o=>S[o]||-1}],tokenPrec:0}),Q=O.define({name:"wast",parser:i.configure({props:[s.add({App:P({closing:")",align:!1})}),t.add({App:n,BlockComment(o){return{from:o.from+2,to:o.to-2}}}),a({Keyword:e.keyword,Type:e.typeName,Number:e.number,String:e.string,Identifier:e.variableName,LineComment:e.lineComment,BlockComment:e.blockComment,"( )":e.paren})]}),languageData:{commentTokens:{line:";;",block:{open:"(;",close:";)"}},closeBrackets:{brackets:["(",'"']}}});function c(){return new r(Q)}export{c as wast,Q as wastLanguage}; 2 | -------------------------------------------------------------------------------- /web/dist/assets/index-DKjOyILR.js: -------------------------------------------------------------------------------- 1 | import{a7 as e}from"./index-BQnrSvw8.js";const o=t=>e.get("/notes/",{params:t}),n=t=>e.post("/notes/",t),u=(t,s)=>e.patch(`/notes/${t}/`,s),a=t=>e.delete(`/notes/${t}/`),c=()=>e.get("/groups/"),p=t=>e.post("/groups/",t),g=(t,s)=>e.patch(`/groups/${t}/`,s),d=t=>e.delete(`/groups/${t}/`),h=t=>e.get("/notes/stats/",{params:t}),l=()=>e.get("/auth/stats/"),$=t=>e.get(`/notes/${t}/`),N=()=>e.get("/auth/users/"),U=t=>e.post("/auth/users/",t),G=(t,s)=>e.patch(`/auth/users/${t}/`,s),i=t=>e.delete(`/auth/users/${t}/`);export{h as a,l as b,o as c,c as d,a as e,N as f,$ as g,u as h,n as i,g as j,p as k,d as l,U as m,i as n,G as u}; 2 | -------------------------------------------------------------------------------- /web/dist/assets/jinja2-C4DGRd-O.js: -------------------------------------------------------------------------------- 1 | var l=["and","as","block","endblock","by","cycle","debug","else","elif","extends","filter","endfilter","firstof","do","for","endfor","if","endif","ifchanged","endifchanged","ifequal","endifequal","ifnotequal","set","raw","endraw","endifnotequal","in","include","load","not","now","or","parsed","regroup","reversed","spaceless","call","endcall","macro","endmacro","endspaceless","ssi","templatetag","openblock","closeblock","openvariable","closevariable","without","context","openbrace","closebrace","opencomment","closecomment","widthratio","url","with","endwith","get_current_language","trans","endtrans","noop","blocktrans","endblocktrans","get_available_languages","get_current_language_bidi","pluralize","autoescape","endautoescape"],c=/^[+\-*&%=<>!?|~^]/,f=/^[:\[\(\{]/,o=["true","false"],r=/^(\d[+\-\*\/])?\d+(\.\d+)?/;l=new RegExp("(("+l.join(")|(")+"))\\b");o=new RegExp("(("+o.join(")|(")+"))\\b");function u(n,e){var i=n.peek();if(e.incomment)return n.skipTo("#}")?(n.eatWhile(/\#|}/),e.incomment=!1):n.skipToEnd(),"comment";if(e.intag){if(e.operator){if(e.operator=!1,n.match(o))return"atom";if(n.match(r))return"number"}if(e.sign){if(e.sign=!1,n.match(o))return"atom";if(n.match(r))return"number"}if(e.instring)return i==e.instring&&(e.instring=!1),n.next(),"string";if(i=="'"||i=='"')return e.instring=i,n.next(),"string";if(e.inbraces>0&&i==")")n.next(),e.inbraces--;else if(i=="(")n.next(),e.inbraces++;else if(e.inbrackets>0&&i=="]")n.next(),e.inbrackets--;else if(i=="[")n.next(),e.inbrackets++;else{if(!e.lineTag&&(n.match(e.intag+"}")||n.eat("-")&&n.match(e.intag+"}")))return e.intag=!1,"tag";if(n.match(c))return e.operator=!0,"operator";if(n.match(f))e.sign=!0;else{if(n.column()==1&&e.lineTag&&n.match(l))return"keyword";if(n.eat(" ")||n.sol()){if(n.match(l))return"keyword";if(n.match(o))return"atom";if(n.match(r))return"number";n.sol()&&n.next()}else n.next()}}return"variable"}else if(n.eat("{")){if(n.eat("#"))return e.incomment=!0,n.skipTo("#}")?(n.eatWhile(/\#|}/),e.incomment=!1):n.skipToEnd(),"comment";if(i=n.eat(/\{|%/))return e.intag=i,e.inbraces=0,e.inbrackets=0,i=="{"&&(e.intag="}"),n.eat("-"),"tag"}else if(n.eat("#")){if(n.peek()=="#")return n.skipToEnd(),"comment";if(!n.eol())return e.intag=!0,e.lineTag=!0,e.inbraces=0,e.inbrackets=0,"tag"}n.next()}const a={name:"jinja2",startState:function(){return{tokenize:u,inbrackets:0,inbraces:0}},token:function(n,e){var i=e.tokenize(n,e);return n.eol()&&e.lineTag&&!e.instring&&e.inbraces==0&&e.inbrackets==0&&(e.intag=!1,e.lineTag=!1),i},languageData:{commentTokens:{block:{open:"{#",close:"#}",line:"##"}}}};export{a as jinja2}; 2 | -------------------------------------------------------------------------------- /web/dist/assets/logo-CYe3-jOy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/X-Mars/beenote/0aa5f3743597a6a8345b542cc547f3a6431de647/web/dist/assets/logo-CYe3-jOy.png -------------------------------------------------------------------------------- /web/dist/assets/lua-BgMRiT3U.js: -------------------------------------------------------------------------------- 1 | function c(e){return new RegExp("^(?:"+e.join("|")+")","i")}function o(e){return new RegExp("^(?:"+e.join("|")+")$","i")}var d=o(["_G","_VERSION","assert","collectgarbage","dofile","error","getfenv","getmetatable","ipairs","load","loadfile","loadstring","module","next","pairs","pcall","print","rawequal","rawget","rawset","require","select","setfenv","setmetatable","tonumber","tostring","type","unpack","xpcall","coroutine.create","coroutine.resume","coroutine.running","coroutine.status","coroutine.wrap","coroutine.yield","debug.debug","debug.getfenv","debug.gethook","debug.getinfo","debug.getlocal","debug.getmetatable","debug.getregistry","debug.getupvalue","debug.setfenv","debug.sethook","debug.setlocal","debug.setmetatable","debug.setupvalue","debug.traceback","close","flush","lines","read","seek","setvbuf","write","io.close","io.flush","io.input","io.lines","io.open","io.output","io.popen","io.read","io.stderr","io.stdin","io.stdout","io.tmpfile","io.type","io.write","math.abs","math.acos","math.asin","math.atan","math.atan2","math.ceil","math.cos","math.cosh","math.deg","math.exp","math.floor","math.fmod","math.frexp","math.huge","math.ldexp","math.log","math.log10","math.max","math.min","math.modf","math.pi","math.pow","math.rad","math.random","math.randomseed","math.sin","math.sinh","math.sqrt","math.tan","math.tanh","os.clock","os.date","os.difftime","os.execute","os.exit","os.getenv","os.remove","os.rename","os.setlocale","os.time","os.tmpname","package.cpath","package.loaded","package.loaders","package.loadlib","package.path","package.preload","package.seeall","string.byte","string.char","string.dump","string.find","string.format","string.gmatch","string.gsub","string.len","string.lower","string.match","string.rep","string.reverse","string.sub","string.upper","table.concat","table.insert","table.maxn","table.remove","table.sort"]),g=o(["and","break","elseif","false","nil","not","or","return","true","function","end","if","then","else","do","while","repeat","until","for","in","local"]),f=o(["function","if","repeat","do","\\(","{"]),h=o(["end","until","\\)","}"]),p=c(["end","until","\\)","}","else","elseif"]);function u(e){for(var t=0;e.eat("=");)++t;return e.eat("["),t}function l(e,t){var n=e.next();return n=="-"&&e.eat("-")?e.eat("[")&&e.eat("[")?(t.cur=s(u(e),"comment"))(e,t):(e.skipToEnd(),"comment"):n=='"'||n=="'"?(t.cur=m(n))(e,t):n=="["&&/[\[=]/.test(e.peek())?(t.cur=s(u(e),"string"))(e,t):/\d/.test(n)?(e.eatWhile(/[\w.%]/),"number"):/[\w_]/.test(n)?(e.eatWhile(/[\w\\\-_.]/),"variable"):null}function s(e,t){return function(n,i){for(var a=null,r;(r=n.next())!=null;)if(a==null)r=="]"&&(a=0);else if(r=="=")++a;else if(r=="]"&&a==e){i.cur=l;break}else a=null;return t}}function m(e){return function(t,n){for(var i=!1,a;(a=t.next())!=null&&!(a==e&&!i);)i=!i&&a=="\\";return i||(n.cur=l),"string"}}const b={name:"lua",startState:function(){return{basecol:0,indentDepth:0,cur:l}},token:function(e,t){if(e.eatSpace())return null;var n=t.cur(e,t),i=e.current();return n=="variable"&&(g.test(i)?n="keyword":d.test(i)&&(n="builtin")),n!="comment"&&n!="string"&&(f.test(i)?++t.indentDepth:h.test(i)&&--t.indentDepth),n},indent:function(e,t,n){var i=p.test(t);return e.basecol+n.unit*(e.indentDepth-(i?1:0))},languageData:{indentOnInput:/^\s*(?:end|until|else|\)|\})$/,commentTokens:{line:"--",block:{open:"--[[",close:"]]--"}}}};export{b as lua}; 2 | -------------------------------------------------------------------------------- /web/dist/assets/mathematica-DTrFuWx2.js: -------------------------------------------------------------------------------- 1 | var u="[a-zA-Z\\$][a-zA-Z0-9\\$]*",f="(?:\\d+)",c="(?:\\.\\d+|\\d+\\.\\d*|\\d+)",o="(?:\\.\\w+|\\w+\\.\\w*|\\w+)",l="(?:`(?:`?"+c+")?)",z=new RegExp("(?:"+f+"(?:\\^\\^"+o+l+"?(?:\\*\\^[+-]?\\d+)?))"),m=new RegExp("(?:"+c+l+"?(?:\\*\\^[+-]?\\d+)?)"),A=new RegExp("(?:`?)(?:"+u+")(?:`(?:"+u+"))*(?:`?)");function i(e,a){var n;return n=e.next(),n==='"'?(a.tokenize=Z,a.tokenize(e,a)):n==="("&&e.eat("*")?(a.commentLevel++,a.tokenize=$,a.tokenize(e,a)):(e.backUp(1),e.match(z,!0,!1)||e.match(m,!0,!1)?"number":e.match(/(?:In|Out)\[[0-9]*\]/,!0,!1)?"atom":e.match(/([a-zA-Z\$][a-zA-Z0-9\$]*(?:`[a-zA-Z0-9\$]+)*::usage)/,!0,!1)?"meta":e.match(/([a-zA-Z\$][a-zA-Z0-9\$]*(?:`[a-zA-Z0-9\$]+)*::[a-zA-Z\$][a-zA-Z0-9\$]*):?/,!0,!1)?"string.special":e.match(/([a-zA-Z\$][a-zA-Z0-9\$]*\s*:)(?:(?:[a-zA-Z\$][a-zA-Z0-9\$]*)|(?:[^:=>~@\^\&\*\)\[\]'\?,\|])).*/,!0,!1)||e.match(/[a-zA-Z\$][a-zA-Z0-9\$]*_+[a-zA-Z\$][a-zA-Z0-9\$]*/,!0,!1)||e.match(/[a-zA-Z\$][a-zA-Z0-9\$]*_+/,!0,!1)||e.match(/_+[a-zA-Z\$][a-zA-Z0-9\$]*/,!0,!1)?"variableName.special":e.match(/\\\[[a-zA-Z\$][a-zA-Z0-9\$]*\]/,!0,!1)?"character":e.match(/(?:\[|\]|{|}|\(|\))/,!0,!1)?"bracket":e.match(/(?:#[a-zA-Z\$][a-zA-Z0-9\$]*|#+[0-9]?)/,!0,!1)?"variableName.constant":e.match(A,!0,!1)?"keyword":e.match(/(?:\\|\+|\-|\*|\/|,|;|\.|:|@|~|=|>|<|&|\||_|`|'|\^|\?|!|%)/,!0,!1)?"operator":(e.next(),"error"))}function Z(e,a){for(var n,r=!1,t=!1;(n=e.next())!=null;){if(n==='"'&&!t){r=!0;break}t=!t&&n==="\\"}return r&&!t&&(a.tokenize=i),"string"}function $(e,a){for(var n,r;a.commentLevel>0&&(r=e.next())!=null;)n==="("&&r==="*"&&a.commentLevel++,n==="*"&&r===")"&&a.commentLevel--,n=r;return a.commentLevel<=0&&(a.tokenize=i),"comment"}const v={name:"mathematica",startState:function(){return{tokenize:i,commentLevel:0}},token:function(e,a){return e.eatSpace()?null:a.tokenize(e,a)},languageData:{commentTokens:{block:{open:"(*",close:"*)"}}}};export{v as mathematica}; 2 | -------------------------------------------------------------------------------- /web/dist/assets/mbox-CNhZ1qSd.js: -------------------------------------------------------------------------------- 1 | var o=["From","Sender","Reply-To","To","Cc","Bcc","Message-ID","In-Reply-To","References","Resent-From","Resent-Sender","Resent-To","Resent-Cc","Resent-Bcc","Resent-Message-ID","Return-Path","Received"],l=["Date","Subject","Comments","Keywords","Resent-Date"],u=/^[ \t]/,d=/^From /,f=new RegExp("^("+o.join("|")+"): "),c=new RegExp("^("+l.join("|")+"): "),t=/^[^:]+:/,m=/^[^ ]+@[^ ]+/,p=/^.*?(?=[^ ]+?@[^ ]+)/,H=/^<.*?>/,v=/^.*?(?=<.*>)/;function h(e){return e==="Subject"?"header":"string"}function R(e,r){if(e.sol()){if(r.inSeparator=!1,r.inHeader&&e.match(u))return null;if(r.inHeader=!1,r.header=null,e.match(d))return r.inHeaders=!0,r.inSeparator=!0,"atom";var n,i=!1;return(n=e.match(c))||(i=!0)&&(n=e.match(f))?(r.inHeaders=!0,r.inHeader=!0,r.emailPermitted=i,r.header=n[1],"atom"):r.inHeaders&&(n=e.match(t))?(r.inHeader=!0,r.emailPermitted=!0,r.header=n[1],"atom"):(r.inHeaders=!1,e.skipToEnd(),null)}if(r.inSeparator)return e.match(m)?"link":(e.match(p)||e.skipToEnd(),"atom");if(r.inHeader){var a=h(r.header);if(r.emailPermitted){if(e.match(H))return a+" link";if(e.match(v))return a}return e.skipToEnd(),a}return e.skipToEnd(),null}const k={name:"mbox",startState:function(){return{inSeparator:!1,inHeader:!1,emailPermitted:!1,header:null,inHeaders:!1}},token:R,blankLine:function(e){e.inHeaders=e.inSeparator=e.inHeader=!1},languageData:{autocomplete:o.concat(l)}};export{k as mbox}; 2 | -------------------------------------------------------------------------------- /web/dist/assets/modelica-Dc1JOy9r.js: -------------------------------------------------------------------------------- 1 | function r(n){for(var e={},i=n.split(" "),l=0;l+\-\/^\[\]]/,s=/(:=|<=|>=|==|<>|\.\+|\.\-|\.\*|\.\/|\.\^)/,o=/[0-9]/,c=/[_a-zA-Z]/;function p(n,e){return n.skipToEnd(),e.tokenize=null,"comment"}function d(n,e){for(var i=!1,l;l=n.next();){if(i&&l=="/"){e.tokenize=null;break}i=l=="*"}return"comment"}function h(n,e){for(var i=!1,l;(l=n.next())!=null;){if(l=='"'&&!i){e.tokenize=null,e.sol=!1;break}i=!i&&l=="\\"}return"string"}function b(n,e){for(n.eatWhile(o);n.eat(o)||n.eat(c););var i=n.current();return e.sol&&(i=="package"||i=="model"||i=="when"||i=="connector")?e.level++:e.sol&&i=="end"&&e.level>0&&e.level--,e.tokenize=null,e.sol=!1,t.propertyIsEnumerable(i)?"keyword":a.propertyIsEnumerable(i)?"builtin":u.propertyIsEnumerable(i)?"atom":"variable"}function v(n,e){for(;n.eat(/[^']/););return e.tokenize=null,e.sol=!1,n.eat("'")?"variable":"error"}function g(n,e){return n.eatWhile(o),n.eat(".")&&n.eatWhile(o),(n.eat("e")||n.eat("E"))&&(n.eat("-")||n.eat("+"),n.eatWhile(o)),e.tokenize=null,e.sol=!1,"number"}const z={name:"modelica",startState:function(){return{tokenize:null,level:0,sol:!0}},token:function(n,e){if(e.tokenize!=null)return e.tokenize(n,e);if(n.sol()&&(e.sol=!0),n.eatSpace())return e.tokenize=null,null;var i=n.next();if(i=="/"&&n.eat("/"))e.tokenize=p;else if(i=="/"&&n.eat("*"))e.tokenize=d;else{if(s.test(i+n.peek()))return n.next(),e.tokenize=null,"operator";if(k.test(i))return e.tokenize=null,"operator";if(c.test(i))e.tokenize=b;else if(i=="'"&&n.peek()&&n.peek()!="'")e.tokenize=v;else if(i=='"')e.tokenize=h;else if(o.test(i))e.tokenize=g;else return e.tokenize=null,"error"}return e.tokenize(n,e)},indent:function(n,e,i){if(n.tokenize!=null)return null;var l=n.level;return/(algorithm)/.test(e)&&l--,/(equation)/.test(e)&&l--,/(initial algorithm)/.test(e)&&l--,/(initial equation)/.test(e)&&l--,/(end)/.test(e)&&l--,l>0?i.unit*l:0},languageData:{commentTokens:{line:"//",block:{open:"/*",close:"*/"}},autocomplete:f}};export{z as modelica}; 2 | -------------------------------------------------------------------------------- /web/dist/assets/mscgen-BA5vi2Kp.js: -------------------------------------------------------------------------------- 1 | function c(t){return{name:"mscgen",startState:i,copyState:s,token:u(t),languageData:{commentTokens:{line:"#",block:{open:"/*",close:"*/"}}}}}const a=c({keywords:["msc"],options:["hscale","width","arcgradient","wordwraparcs"],constants:["true","false","on","off"],attributes:["label","idurl","id","url","linecolor","linecolour","textcolor","textcolour","textbgcolor","textbgcolour","arclinecolor","arclinecolour","arctextcolor","arctextcolour","arctextbgcolor","arctextbgcolour","arcskip"],brackets:["\\{","\\}"],arcsWords:["note","abox","rbox","box"],arcsOthers:["\\|\\|\\|","\\.\\.\\.","---","--","<->","==","<<=>>","<=>","\\.\\.","<<>>","::","<:>","->","=>>","=>",">>",":>","<-","<<=","<=","<<","<:","x-","-x"],singlecomment:["//","#"],operators:["="]}),l=c({keywords:null,options:["hscale","width","arcgradient","wordwraparcs","wordwrapentities","watermark"],constants:["true","false","on","off","auto"],attributes:null,brackets:["\\{","\\}"],arcsWords:["note","abox","rbox","box","alt","else","opt","break","par","seq","strict","neg","critical","ignore","consider","assert","loop","ref","exc"],arcsOthers:["\\|\\|\\|","\\.\\.\\.","---","--","<->","==","<<=>>","<=>","\\.\\.","<<>>","::","<:>","->","=>>","=>",">>",":>","<-","<<=","<=","<<","<:","x-","-x"],singlecomment:["//","#"],operators:["="]}),b=c({keywords:["msc","xu"],options:["hscale","width","arcgradient","wordwraparcs","wordwrapentities","watermark"],constants:["true","false","on","off","auto"],attributes:["label","idurl","id","url","linecolor","linecolour","textcolor","textcolour","textbgcolor","textbgcolour","arclinecolor","arclinecolour","arctextcolor","arctextcolour","arctextbgcolor","arctextbgcolour","arcskip","title","deactivate","activate","activation"],brackets:["\\{","\\}"],arcsWords:["note","abox","rbox","box","alt","else","opt","break","par","seq","strict","neg","critical","ignore","consider","assert","loop","ref","exc"],arcsOthers:["\\|\\|\\|","\\.\\.\\.","---","--","<->","==","<<=>>","<=>","\\.\\.","<<>>","::","<:>","->","=>>","=>",">>",":>","<-","<<=","<=","<<","<:","x-","-x"],singlecomment:["//","#"],operators:["="]});function n(t){return new RegExp("^\\b("+t.join("|")+")\\b","i")}function o(t){return new RegExp("^(?:"+t.join("|")+")","i")}function i(){return{inComment:!1,inString:!1,inAttributeList:!1,inScript:!1}}function s(t){return{inComment:t.inComment,inString:t.inString,inAttributeList:t.inAttributeList,inScript:t.inScript}}function u(t){return function(r,e){if(r.match(o(t.brackets),!0,!0))return"bracket";if(!e.inComment){if(r.match(/\/\*[^\*\/]*/,!0,!0))return e.inComment=!0,"comment";if(r.match(o(t.singlecomment),!0,!0))return r.skipToEnd(),"comment"}if(e.inComment)return r.match(/[^\*\/]*\*\//,!0,!0)?e.inComment=!1:r.skipToEnd(),"comment";if(!e.inString&&r.match(/\"(\\\"|[^\"])*/,!0,!0))return e.inString=!0,"string";if(e.inString)return r.match(/[^\"]*\"/,!0,!0)?e.inString=!1:r.skipToEnd(),"string";if(t.keywords&&r.match(n(t.keywords),!0,!0)||r.match(n(t.options),!0,!0)||r.match(n(t.arcsWords),!0,!0)||r.match(o(t.arcsOthers),!0,!0))return"keyword";if(t.operators&&r.match(o(t.operators),!0,!0))return"operator";if(t.constants&&r.match(o(t.constants),!0,!0))return"variable";if(!t.inAttributeList&&t.attributes&&r.match("[",!0,!0))return t.inAttributeList=!0,"bracket";if(t.inAttributeList){if(t.attributes!==null&&r.match(n(t.attributes),!0,!0))return"attribute";if(r.match("]",!0,!0))return t.inAttributeList=!1,"bracket"}return r.next(),null}}export{a as mscgen,l as msgenny,b as xu}; 2 | -------------------------------------------------------------------------------- /web/dist/assets/mumps-BT43cFF4.js: -------------------------------------------------------------------------------- 1 | function o(e){return new RegExp("^(("+e.join(")|(")+"))\\b","i")}var i=new RegExp("^[\\+\\-\\*/&#!_?\\\\<>=\\'\\[\\]]"),$=new RegExp("^(('=)|(<=)|(>=)|('>)|('<)|([[)|(]])|(^$))"),t=new RegExp("^[\\.,:]"),c=new RegExp("[()]"),l=new RegExp("^[%A-Za-z][A-Za-z0-9]*"),a=["break","close","do","else","for","goto","halt","hang","if","job","kill","lock","merge","new","open","quit","read","set","tcommit","trollback","tstart","use","view","write","xecute","b","c","d","e","f","g","h","i","j","k","l","m","n","o","q","r","s","tc","tro","ts","u","v","w","x"],d=["\\$ascii","\\$char","\\$data","\\$ecode","\\$estack","\\$etrap","\\$extract","\\$find","\\$fnumber","\\$get","\\$horolog","\\$io","\\$increment","\\$job","\\$justify","\\$length","\\$name","\\$next","\\$order","\\$piece","\\$qlength","\\$qsubscript","\\$query","\\$quit","\\$random","\\$reverse","\\$select","\\$stack","\\$test","\\$text","\\$translate","\\$view","\\$x","\\$y","\\$a","\\$c","\\$d","\\$e","\\$ec","\\$es","\\$et","\\$f","\\$fn","\\$g","\\$h","\\$i","\\$j","\\$l","\\$n","\\$na","\\$o","\\$p","\\$q","\\$ql","\\$qs","\\$r","\\$re","\\$s","\\$st","\\$t","\\$tr","\\$v","\\$z"],u=o(d),f=o(a);function m(e,n){e.sol()&&(n.label=!0,n.commandMode=0);var r=e.peek();return r==" "||r==" "?(n.label=!1,n.commandMode==0?n.commandMode=1:(n.commandMode<0||n.commandMode==2)&&(n.commandMode=0)):r!="."&&n.commandMode>0&&(r==":"?n.commandMode=-1:n.commandMode=2),(r==="("||r===" ")&&(n.label=!1),r===";"?(e.skipToEnd(),"comment"):e.match(/^[-+]?\d+(\.\d+)?([eE][-+]?\d+)?/)?"number":r=='"'?e.skipTo('"')?(e.next(),"string"):(e.skipToEnd(),"error"):e.match($)||e.match(i)?"operator":e.match(t)?null:c.test(r)?(e.next(),"bracket"):n.commandMode>0&&e.match(f)?"controlKeyword":e.match(u)?"builtin":e.match(l)?"variable":r==="$"||r==="^"?(e.next(),"builtin"):r==="@"?(e.next(),"string.special"):/[\w%]/.test(r)?(e.eatWhile(/[\w%]/),"variable"):(e.next(),"error")}const s={name:"mumps",startState:function(){return{label:!1,commandMode:0}},token:function(e,n){var r=m(e,n);return n.label?"tag":r}};export{s as mumps}; 2 | -------------------------------------------------------------------------------- /web/dist/assets/ntriples-BfvgReVJ.js: -------------------------------------------------------------------------------- 1 | var _={PRE_SUBJECT:0,WRITING_SUB_URI:1,WRITING_BNODE_URI:2,PRE_PRED:3,WRITING_PRED_URI:4,PRE_OBJ:5,WRITING_OBJ_URI:6,WRITING_OBJ_BNODE:7,WRITING_OBJ_LITERAL:8,WRITING_LIT_LANG:9,WRITING_LIT_TYPE:10,POST_OBJ:11,ERROR:12};function T(e,I){var R=e.location,i;R==_.PRE_SUBJECT&&I=="<"?i=_.WRITING_SUB_URI:R==_.PRE_SUBJECT&&I=="_"?i=_.WRITING_BNODE_URI:R==_.PRE_PRED&&I=="<"?i=_.WRITING_PRED_URI:R==_.PRE_OBJ&&I=="<"?i=_.WRITING_OBJ_URI:R==_.PRE_OBJ&&I=="_"?i=_.WRITING_OBJ_BNODE:R==_.PRE_OBJ&&I=='"'?i=_.WRITING_OBJ_LITERAL:R==_.WRITING_SUB_URI&&I==">"||R==_.WRITING_BNODE_URI&&I==" "?i=_.PRE_PRED:R==_.WRITING_PRED_URI&&I==">"?i=_.PRE_OBJ:R==_.WRITING_OBJ_URI&&I==">"||R==_.WRITING_OBJ_BNODE&&I==" "||R==_.WRITING_OBJ_LITERAL&&I=='"'||R==_.WRITING_LIT_LANG&&I==" "||R==_.WRITING_LIT_TYPE&&I==">"?i=_.POST_OBJ:R==_.WRITING_OBJ_LITERAL&&I=="@"?i=_.WRITING_LIT_LANG:R==_.WRITING_OBJ_LITERAL&&I=="^"?i=_.WRITING_LIT_TYPE:I==" "&&(R==_.PRE_SUBJECT||R==_.PRE_PRED||R==_.PRE_OBJ||R==_.POST_OBJ)?i=R:R==_.POST_OBJ&&I=="."?i=_.PRE_SUBJECT:i=_.ERROR,e.location=i}const u={name:"ntriples",startState:function(){return{location:_.PRE_SUBJECT,uris:[],anchors:[],bnodes:[],langs:[],types:[]}},token:function(e,I){var R=e.next();if(R=="<"){T(I,R);var i="";return e.eatWhile(function(n){return n!="#"&&n!=">"?(i+=n,!0):!1}),I.uris.push(i),e.match("#",!1)||(e.next(),T(I,">")),"variable"}if(R=="#"){var r="";return e.eatWhile(function(n){return n!=">"&&n!=" "?(r+=n,!0):!1}),I.anchors.push(r),"url"}if(R==">")return T(I,">"),"variable";if(R=="_"){T(I,R);var f="";return e.eatWhile(function(n){return n!=" "?(f+=n,!0):!1}),I.bnodes.push(f),e.next(),T(I," "),"builtin"}if(R=='"')return T(I,R),e.eatWhile(function(n){return n!='"'}),e.next(),e.peek()!="@"&&e.peek()!="^"&&T(I,'"'),"string";if(R=="@"){T(I,"@");var E="";return e.eatWhile(function(n){return n!=" "?(E+=n,!0):!1}),I.langs.push(E),e.next(),T(I," "),"string.special"}if(R=="^"){e.next(),T(I,"^");var l="";return e.eatWhile(function(n){return n!=">"?(l+=n,!0):!1}),I.types.push(l),e.next(),T(I,">"),"variable"}R==" "&&T(I,R),R=="."&&T(I,R)}};export{u as ntriples}; 2 | -------------------------------------------------------------------------------- /web/dist/assets/octave-Ck1zUtKM.js: -------------------------------------------------------------------------------- 1 | function t(e){return new RegExp("^(("+e.join(")|(")+"))\\b")}var f=new RegExp("^[\\+\\-\\*/&|\\^~<>!@'\\\\]"),u=new RegExp("^[\\(\\[\\{\\},:=;\\.]"),a=new RegExp("^((==)|(~=)|(<=)|(>=)|(<<)|(>>)|(\\.[\\+\\-\\*/\\^\\\\]))"),l=new RegExp("^((!=)|(\\+=)|(\\-=)|(\\*=)|(/=)|(&=)|(\\|=)|(\\^=))"),c=new RegExp("^((>>=)|(<<=))"),p=new RegExp("^[\\]\\)]"),d=new RegExp("^[_A-Za-z¡-￿][_A-Za-z0-9¡-￿]*"),s=t(["error","eval","function","abs","acos","atan","asin","cos","cosh","exp","log","prod","sum","log10","max","min","sign","sin","sinh","sqrt","tan","reshape","break","zeros","default","margin","round","ones","rand","syn","ceil","floor","size","clear","zeros","eye","mean","std","cov","det","eig","inv","norm","rank","trace","expm","logm","sqrtm","linspace","plot","title","xlabel","ylabel","legend","text","grid","meshgrid","mesh","num2str","fft","ifft","arrayfun","cellfun","input","fliplr","flipud","ismember"]),h=t(["return","case","switch","else","elseif","end","endif","endfunction","if","otherwise","do","for","while","try","catch","classdef","properties","events","methods","global","persistent","endfor","endwhile","printf","sprintf","disp","until","continue","pkg"]);function o(e,n){return!e.sol()&&e.peek()==="'"?(e.next(),n.tokenize=i,"operator"):(n.tokenize=i,i(e,n))}function m(e,n){return e.match(/^.*%}/)?(n.tokenize=i,"comment"):(e.skipToEnd(),"comment")}function i(e,n){if(e.eatSpace())return null;if(e.match("%{"))return n.tokenize=m,e.skipToEnd(),"comment";if(e.match(/^[%#]/))return e.skipToEnd(),"comment";if(e.match(/^[0-9\.+-]/,!1)){if(e.match(/^[+-]?0x[0-9a-fA-F]+[ij]?/))return e.tokenize=i,"number";if(e.match(/^[+-]?\d*\.\d+([EeDd][+-]?\d+)?[ij]?/)||e.match(/^[+-]?\d+([EeDd][+-]?\d+)?[ij]?/))return"number"}if(e.match(t(["nan","NaN","inf","Inf"])))return"number";var r=e.match(/^"(?:[^"]|"")*("|$)/)||e.match(/^'(?:[^']|'')*('|$)/);return r?r[1]?"string":"error":e.match(h)?"keyword":e.match(s)?"builtin":e.match(d)?"variable":e.match(f)||e.match(a)?"operator":e.match(u)||e.match(l)||e.match(c)?null:e.match(p)?(n.tokenize=o,null):(e.next(),"error")}const g={name:"octave",startState:function(){return{tokenize:i}},token:function(e,n){var r=n.tokenize(e,n);return(r==="number"||r==="variable")&&(n.tokenize=o),r},languageData:{commentTokens:{line:"%"}}};export{g as octave}; 2 | -------------------------------------------------------------------------------- /web/dist/assets/oz-BzwKVEFT.js: -------------------------------------------------------------------------------- 1 | function o(e){return new RegExp("^(("+e.join(")|(")+"))\\b")}var k=/[\^@!\|<>#~\.\*\-\+\\/,=]/,s=/(<-)|(:=)|(=<)|(>=)|(<=)|(<:)|(>:)|(=:)|(\\=)|(\\=:)|(!!)|(==)|(::)/,p=/(:::)|(\.\.\.)|(=<:)|(>=:)/,f=["in","then","else","of","elseof","elsecase","elseif","catch","finally","with","require","prepare","import","export","define","do"],l=["end"],z=o(["true","false","nil","unit"]),m=o(["andthen","at","attr","declare","feat","from","lex","mod","div","mode","orelse","parser","prod","prop","scanner","self","syn","token"]),v=o(["local","proc","fun","case","class","if","cond","or","dis","choice","not","thread","try","raise","lock","for","suchthat","meth","functor"]),d=o(f),h=o(l);function i(e,n){if(e.eatSpace())return null;if(e.match(/[{}]/))return"bracket";if(e.match("[]"))return"keyword";if(e.match(p)||e.match(s))return"operator";if(e.match(z))return"atom";var t=e.match(v);if(t)return n.doInCurrentLine?n.doInCurrentLine=!1:n.currentIndent++,t[0]=="proc"||t[0]=="fun"?n.tokenize=x:t[0]=="class"?n.tokenize=g:t[0]=="meth"&&(n.tokenize=w),"keyword";if(e.match(d)||e.match(m))return"keyword";if(e.match(h))return n.currentIndent--,"keyword";var r=e.next();if(r=='"'||r=="'")return n.tokenize=y(r),n.tokenize(e,n);if(/[~\d]/.test(r)){if(r=="~")if(/^[0-9]/.test(e.peek())){if(e.next()=="0"&&e.match(/^[xX][0-9a-fA-F]+/)||e.match(/^[0-9]*(\.[0-9]+)?([eE][~+]?[0-9]+)?/))return"number"}else return null;return r=="0"&&e.match(/^[xX][0-9a-fA-F]+/)||e.match(/^[0-9]*(\.[0-9]+)?([eE][~+]?[0-9]+)?/)?"number":null}return r=="%"?(e.skipToEnd(),"comment"):r=="/"&&e.eat("*")?(n.tokenize=a,a(e,n)):k.test(r)?"operator":(e.eatWhile(/\w/),"variable")}function g(e,n){return e.eatSpace()?null:(e.match(/([A-Z][A-Za-z0-9_]*)|(`.+`)/),n.tokenize=i,"type")}function w(e,n){return e.eatSpace()?null:(e.match(/([a-zA-Z][A-Za-z0-9_]*)|(`.+`)/),n.tokenize=i,"def")}function x(e,n){return e.eatSpace()?null:!n.hasPassedFirstStage&&e.eat("{")?(n.hasPassedFirstStage=!0,"bracket"):n.hasPassedFirstStage?(e.match(/([A-Z][A-Za-z0-9_]*)|(`.+`)|\$/),n.hasPassedFirstStage=!1,n.tokenize=i,"def"):(n.tokenize=i,null)}function a(e,n){for(var t=!1,r;r=e.next();){if(r=="/"&&t){n.tokenize=i;break}t=r=="*"}return"comment"}function y(e){return function(n,t){for(var r=!1,u,c=!1;(u=n.next())!=null;){if(u==e&&!r){c=!0;break}r=!r&&u=="\\"}return(c||!r)&&(t.tokenize=i),"string"}}function b(){var e=f.concat(l);return new RegExp("[\\[\\]]|("+e.join("|")+")$")}const I={name:"oz",startState:function(){return{tokenize:i,currentIndent:0,doInCurrentLine:!1,hasPassedFirstStage:!1}},token:function(e,n){return e.sol()&&(n.doInCurrentLine=0),n.tokenize(e,n)},indent:function(e,n,t){var r=n.replace(/^\s+|\s+$/g,"");return r.match(h)||r.match(d)||r.match(/(\[])/)?t.unit*(e.currentIndent-1):e.currentIndent<0?0:e.currentIndent*t.unit},languageData:{indentOnInut:b(),commentTokens:{line:"%",block:{open:"/*",close:"*/"}}}};export{I as oz}; 2 | -------------------------------------------------------------------------------- /web/dist/assets/pascal--L3eBynH.js: -------------------------------------------------------------------------------- 1 | function c(r){for(var n={},e=r.split(" "),t=0;t!?|\/]/;function d(r,n){var e=r.next();if(e=="#"&&n.startOfLine)return r.skipToEnd(),"meta";if(e=='"'||e=="'")return n.tokenize=p(e),n.tokenize(r,n);if(e=="("&&r.eat("*"))return n.tokenize=l,l(r,n);if(e=="{")return n.tokenize=u,u(r,n);if(/[\[\]\(\),;\:\.]/.test(e))return null;if(/\d/.test(e))return r.eatWhile(/[\w\.]/),"number";if(e=="/"&&r.eat("/"))return r.skipToEnd(),"comment";if(a.test(e))return r.eatWhile(a),"operator";r.eatWhile(/[\w\$_]/);var t=r.current().toLowerCase();return s.propertyIsEnumerable(t)?"keyword":f.propertyIsEnumerable(t)?"atom":"variable"}function p(r){return function(n,e){for(var t=!1,i,o=!1;(i=n.next())!=null;){if(i==r&&!t){o=!0;break}t=!t&&i=="\\"}return(o||!t)&&(e.tokenize=null),"string"}}function l(r,n){for(var e=!1,t;t=r.next();){if(t==")"&&e){n.tokenize=null;break}e=t=="*"}return"comment"}function u(r,n){for(var e;e=r.next();)if(e=="}"){n.tokenize=null;break}return"comment"}const k={name:"pascal",startState:function(){return{tokenize:null}},token:function(r,n){if(r.eatSpace())return null;var e=(n.tokenize||d)(r,n);return e=="comment"||e=="meta",e},languageData:{indentOnInput:/^\s*[{}]$/,commentTokens:{block:{open:"(*",close:"*)"}}}};export{k as pascal}; 2 | -------------------------------------------------------------------------------- /web/dist/assets/pig-CevX1Tat.js: -------------------------------------------------------------------------------- 1 | function r(e){for(var T={},O=e.split(" "),E=0;E=&?:\/!|]/;function L(e,T,O){return T.tokenize=O,O(e,T)}function u(e,T){for(var O=!1,E;E=e.next();){if(E=="/"&&O){T.tokenize=A;break}O=E=="*"}return"comment"}function C(e){return function(T,O){for(var E=!1,N,R=!1;(N=T.next())!=null;){if(N==e&&!E){R=!0;break}E=!E&&N=="\\"}return(R||!E)&&(O.tokenize=A),"error"}}function A(e,T){var O=e.next();return O=='"'||O=="'"?L(e,T,C(O)):/[\[\]{}\(\),;\.]/.test(O)?null:/\d/.test(O)?(e.eatWhile(/[\w\.]/),"number"):O=="/"?e.eat("*")?L(e,T,u):(e.eatWhile(I),"operator"):O=="-"?e.eat("-")?(e.skipToEnd(),"comment"):(e.eatWhile(I),"operator"):I.test(O)?(e.eatWhile(I),"operator"):(e.eatWhile(/[\w\$_]/),n&&n.propertyIsEnumerable(e.current().toUpperCase())&&!e.eat(")")&&!e.eat(".")?"keyword":S&&S.propertyIsEnumerable(e.current().toUpperCase())?"builtin":t&&t.propertyIsEnumerable(e.current().toUpperCase())?"type":"variable")}const G={name:"pig",startState:function(){return{tokenize:A,startOfLine:!0}},token:function(e,T){if(e.eatSpace())return null;var O=T.tokenize(e,T);return O},languageData:{autocomplete:(i+o+U).split(" ")}};export{G as pig}; 2 | -------------------------------------------------------------------------------- /web/dist/assets/properties-C78fOPTZ.js: -------------------------------------------------------------------------------- 1 | const f={name:"properties",token:function(e,i){var o=e.sol()||i.afterSection,l=e.eol();if(i.afterSection=!1,o&&(i.nextMultiline?(i.inMultiline=!0,i.nextMultiline=!1):i.position="def"),l&&!i.nextMultiline&&(i.inMultiline=!1,i.position="def"),o)for(;e.eatSpace(););var n=e.next();return o&&(n==="#"||n==="!"||n===";")?(i.position="comment",e.skipToEnd(),"comment"):o&&n==="["?(i.afterSection=!0,e.skipTo("]"),e.eat("]"),"header"):n==="="||n===":"?(i.position="quote",null):(n==="\\"&&i.position==="quote"&&e.eol()&&(i.nextMultiline=!0),i.position)},startState:function(){return{position:"def",nextMultiline:!1,inMultiline:!1,afterSection:!1}}};export{f as properties}; 2 | -------------------------------------------------------------------------------- /web/dist/assets/protobuf-ChK-085T.js: -------------------------------------------------------------------------------- 1 | function t(e){return new RegExp("^(("+e.join(")|(")+"))\\b","i")}var n=["package","message","import","syntax","required","optional","repeated","reserved","default","extensions","packed","bool","bytes","double","enum","float","string","int32","int64","uint32","uint64","sint32","sint64","fixed32","fixed64","sfixed32","sfixed64","option","service","rpc","returns"],r=t(n),i=new RegExp("^[_A-Za-z¡-￿][_A-Za-z0-9¡-￿]*");function f(e){return e.eatSpace()?null:e.match("//")?(e.skipToEnd(),"comment"):e.match(/^[0-9\.+-]/,!1)&&(e.match(/^[+-]?0x[0-9a-fA-F]+/)||e.match(/^[+-]?\d*\.\d+([EeDd][+-]?\d+)?/)||e.match(/^[+-]?\d+([EeDd][+-]?\d+)?/))?"number":e.match(/^"([^"]|(""))*"/)||e.match(/^'([^']|(''))*'/)?"string":e.match(r)?"keyword":e.match(i)?"variable":(e.next(),null)}const u={name:"protobuf",token:f,languageData:{autocomplete:n}};export{u as protobuf}; 2 | -------------------------------------------------------------------------------- /web/dist/assets/puppet-DMA9R1ak.js: -------------------------------------------------------------------------------- 1 | var c={},s=/({)?([a-z][a-z0-9_]*)?((::[a-z][a-z0-9_]*)*::)?[a-zA-Z0-9_]+(})?/;function a(e,n){for(var i=n.split(" "),o=0;o.*/,!1),t=e.match(/(\s+)?[\w:_]+(\s+)?{/,!1),f=e.match(/(\s+)?[@]{1,2}[\w:_]+(\s+)?{/,!1),r=e.next();if(r==="$")return e.match(s)?n.continueString?"variableName.special":"variable":"error";if(n.continueString)return e.backUp(1),u(e,n);if(n.inDefinition){if(e.match(/(\s+)?[\w:_]+(\s+)?/))return"def";e.match(/\s+{/),n.inDefinition=!1}return n.inInclude?(e.match(/(\s+)?\S+(\s+)?/),n.inInclude=!1,"def"):e.match(/(\s+)?\w+\(/)?(e.backUp(1),"def"):o?(e.match(/(\s+)?\w+/),"tag"):i&&c.hasOwnProperty(i)?(e.backUp(1),e.match(/[\w]+/),e.match(/\s+\S+\s+{/,!1)&&(n.inDefinition=!0),i=="include"&&(n.inInclude=!0),c[i]):/(^|\s+)[A-Z][\w:_]+/.test(i)?(e.backUp(1),e.match(/(^|\s+)[A-Z][\w:_]+/),"def"):t?(e.match(/(\s+)?[\w:_]+/),"def"):f?(e.match(/(\s+)?[@]{1,2}/),"atom"):r=="#"?(e.skipToEnd(),"comment"):r=="'"||r=='"'?(n.pending=r,u(e,n)):r=="{"||r=="}"?"bracket":r=="/"?(e.match(/^[^\/]*\//),"string.special"):r.match(/[0-9]/)?(e.eatWhile(/[0-9]+/),"number"):r=="="?(e.peek()==">"&&e.next(),"operator"):(e.eatWhile(/[\w-]/),null)}const p={name:"puppet",startState:function(){var e={};return e.inDefinition=!1,e.inInclude=!1,e.continueString=!1,e.pending=!1,e},token:function(e,n){return e.eatSpace()?null:l(e,n)}};export{p as puppet}; 2 | -------------------------------------------------------------------------------- /web/dist/assets/r-B6wPVr8A.js: -------------------------------------------------------------------------------- 1 | function f(e){for(var n={},r=0;r=!&|~$:]/,t;function p(e,n){t=null;var r=e.next();if(r=="#")return e.skipToEnd(),"comment";if(r=="0"&&e.eat("x"))return e.eatWhile(/[\da-f]/i),"number";if(r=="."&&e.eat(/\d/))return e.match(/\d*(?:e[+\-]?\d+)?/),"number";if(/\d/.test(r))return e.match(/\d*(?:\.\d+)?(?:e[+\-]\d+)?L?/),"number";if(r=="'"||r=='"')return n.tokenize=E(r),"string";if(r=="`")return e.match(/[^`]+`/),"string.special";if(r=="."&&e.match(/.(?:[.]|\d+)/))return"keyword";if(/[a-zA-Z\.]/.test(r)){e.eatWhile(/[\w\.]/);var i=e.current();return h.propertyIsEnumerable(i)?"atom":N.propertyIsEnumerable(i)?(A.propertyIsEnumerable(i)&&!e.match(/\s*if(\s+|$)/,!1)&&(t="block"),"keyword"):m.propertyIsEnumerable(i)?"builtin":"variable"}else return r=="%"?(e.skipTo("%")&&e.next(),"variableName.special"):r=="<"&&e.eat("-")||r=="<"&&e.match("<-")||r=="-"&&e.match(/>>?/)||r=="="&&n.ctx.argList?"operator":k.test(r)?(r=="$"||e.eatWhile(k),"operator"):/[\(\){}\[\];]/.test(r)?(t=r,r==";"?"punctuation":null):null}function E(e){return function(n,r){if(n.eat("\\")){var i=n.next();return i=="x"?n.match(/^[a-f0-9]{2}/i):(i=="u"||i=="U")&&n.eat("{")&&n.skipTo("}")?n.next():i=="u"?n.match(/^[a-f0-9]{4}/i):i=="U"?n.match(/^[a-f0-9]{8}/i):/[0-7]/.test(i)&&n.match(/^[0-7]{1,2}/),"string.special"}else{for(var l;(l=n.next())!=null;){if(l==e){r.tokenize=p;break}if(l=="\\"){n.backUp(1);break}}return"string"}}}var v=1,u=2,c=4;function o(e,n,r){e.ctx={type:n,indent:e.indent,flags:0,column:r.column(),prev:e.ctx}}function x(e,n){var r=e.ctx;e.ctx={type:r.type,indent:r.indent,flags:r.flags|n,column:r.column,prev:r.prev}}function a(e){e.indent=e.ctx.indent,e.ctx=e.ctx.prev}const I={name:"r",startState:function(e){return{tokenize:p,ctx:{type:"top",indent:-e,flags:u},indent:0,afterIdent:!1}},token:function(e,n){if(e.sol()&&((n.ctx.flags&3)==0&&(n.ctx.flags|=u),n.ctx.flags&c&&a(n),n.indent=e.indentation()),e.eatSpace())return null;var r=n.tokenize(e,n);return r!="comment"&&(n.ctx.flags&u)==0&&x(n,v),(t==";"||t=="{"||t=="}")&&n.ctx.type=="block"&&a(n),t=="{"?o(n,"}",e):t=="("?(o(n,")",e),n.afterIdent&&(n.ctx.argList=!0)):t=="["?o(n,"]",e):t=="block"?o(n,"block",e):t==n.ctx.type?a(n):n.ctx.type=="block"&&r!="comment"&&x(n,c),n.afterIdent=r=="variable"||r=="keyword",r},indent:function(e,n,r){if(e.tokenize!=p)return 0;var i=n&&n.charAt(0),l=e.ctx,d=i==l.type;return l.flags&c&&(l=l.prev),l.type=="block"?l.indent+(i=="{"?0:r.unit):l.flags&v?l.column+(d?0:1):l.indent+(d?0:r.unit)},languageData:{wordChars:".",commentTokens:{line:"#"},autocomplete:b.concat(g,s)}};export{I as r}; 2 | -------------------------------------------------------------------------------- /web/dist/assets/relativeTime-Dd6TU8RK.js: -------------------------------------------------------------------------------- 1 | import{a5 as q}from"./index-BQnrSvw8.js";var f={exports:{}},B=f.exports,w;function E(){return w||(w=1,function(R,j){(function(i,m){R.exports=m()})(B,function(){return function(i,m,s){i=i||{};var o=m.prototype,M={future:"in %s",past:"%s ago",s:"a few seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"};function y(r,e,a,l){return o.fromToBase(r,e,a,l)}s.en.relativeTime=M,o.fromToBase=function(r,e,a,l,$){for(var h,d,v,c=a.$locale().relativeTime||M,p=i.thresholds||[{l:"s",r:44,d:"second"},{l:"m",r:89},{l:"mm",r:44,d:"minute"},{l:"h",r:89},{l:"hh",r:21,d:"hour"},{l:"d",r:35},{l:"dd",r:25,d:"day"},{l:"M",r:45},{l:"MM",r:10,d:"month"},{l:"y",r:17},{l:"yy",d:"year"}],b=p.length,u=0;u0,n<=t.r||!t.r){n<=1&&u>0&&(t=p[u-1]);var T=c[t.l];$&&(n=$(""+n)),d=typeof T=="string"?T.replace("%d",n):T(n,e,t.l,v);break}}if(e)return d;var x=v?c.future:c.past;return typeof x=="function"?x(d):x.replace("%s",d)},o.to=function(r,e){return y(r,e,this,!0)},o.from=function(r,e){return y(r,e,this)};var g=function(r){return r.$u?s.utc():s()};o.toNow=function(r){return this.to(g(this),r)},o.fromNow=function(r){return this.from(g(this),r)}}})}(f)),f.exports}var N=E();const C=q(N);export{C as r}; 2 | -------------------------------------------------------------------------------- /web/dist/assets/rpm-CTu-6PCP.js: -------------------------------------------------------------------------------- 1 | var o=/^-+$/,a=/^(Mon|Tue|Wed|Thu|Fri|Sat|Sun) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) ?\d{1,2} \d{2}:\d{2}(:\d{2})? [A-Z]{3,4} \d{4} - /,c=/^[\w+.-]+@[\w.-]+/;const h={name:"rpmchanges",token:function(r){return r.sol()&&(r.match(o)||r.match(a))?"tag":r.match(c)?"string":(r.next(),null)}};var i=/^(i386|i586|i686|x86_64|ppc64le|ppc64|ppc|ia64|s390x|s390|sparc64|sparcv9|sparc|noarch|alphaev6|alpha|hppa|mipsel)/,t=/^[a-zA-Z0-9()]+:/,l=/^%(debug_package|package|description|prep|build|install|files|clean|changelog|preinstall|preun|postinstall|postun|pretrans|posttrans|pre|post|triggerin|triggerun|verifyscript|check|triggerpostun|triggerprein|trigger)/,p=/^%(ifnarch|ifarch|if)/,f=/^%(else|endif)/,u=/^(\!|\?|\<\=|\<|\>\=|\>|\=\=|\&\&|\|\|)/;const d={name:"rpmspec",startState:function(){return{controlFlow:!1,macroParameters:!1,section:!1}},token:function(r,e){var n=r.peek();if(n=="#")return r.skipToEnd(),"comment";if(r.sol()){if(r.match(t))return"header";if(r.match(l))return"atom"}if(r.match(/^\$\w+/)||r.match(/^\$\{\w+\}/))return"def";if(r.match(f))return"keyword";if(r.match(p))return e.controlFlow=!0,"keyword";if(e.controlFlow){if(r.match(u))return"operator";if(r.match(/^(\d+)/))return"number";r.eol()&&(e.controlFlow=!1)}if(r.match(i))return r.eol()&&(e.controlFlow=!1),"number";if(r.match(/^%[\w]+/))return r.match("(")&&(e.macroParameters=!0),"keyword";if(e.macroParameters){if(r.match(/^\d+/))return"number";if(r.match(")"))return e.macroParameters=!1,"keyword"}return r.match(/^%\{\??[\w \-\:\!]+\}/)?(r.eol()&&(e.controlFlow=!1),"def"):(r.next(),null)}};export{h as rpmChanges,d as rpmSpec}; 2 | -------------------------------------------------------------------------------- /web/dist/assets/shell-CjFT_Tl9.js: -------------------------------------------------------------------------------- 1 | var c={};function s(n,e){for(var i=0;i1&&n.eat("$");var i=n.next();return/['"({]/.test(i)?(e.tokens[0]=l(i,i=="("?"quote":i=="{"?"def":"string"),u(n,e)):(/\d/.test(i)||n.eatWhile(/\w/),e.tokens.shift(),"def")};function w(n){return function(e,i){return e.sol()&&e.string==n&&i.tokens.shift(),e.skipToEnd(),"string.special"}}function u(n,e){return(e.tokens[0]||d)(n,e)}const v={name:"shell",startState:function(){return{tokens:[]}},token:function(n,e){return u(n,e)},languageData:{autocomplete:k.concat(h,p),closeBrackets:{brackets:["(","[","{","'",'"',"`"]},commentTokens:{line:"#"}}};export{v as shell}; 2 | -------------------------------------------------------------------------------- /web/dist/assets/sieve-C3Gn_uJK.js: -------------------------------------------------------------------------------- 1 | function l(n){for(var e={},i=n.split(" "),r=0;r2&&r.token&&typeof r.token!="string"){e.pending=[];for(var o=2;o-1)return null;var d=e.indent.length-1,g=n[e.state];n:for(;;){for(var r=0;r=@%|&?!.,:;^]/,p=/true|false|nil|self|super|thisContext/,l=function(e,n){this.next=e,this.parent=n},r=function(e,n,t){this.name=e,this.context=n,this.eos=t},c=function(){this.context=new l(h,null),this.expectVariable=!0,this.indentation=0,this.userIndentationDelta=0};c.prototype.userIndent=function(e,n){this.userIndentationDelta=e>0?e/n-this.indentation:0};var h=function(e,n,t){var i=new r(null,n,!1),a=e.next();return a==='"'?i=u(e,new l(u,n)):a==="'"?i=s(e,new l(s,n)):a==="#"?e.peek()==="'"?(e.next(),i=f(e,new l(f,n))):e.eatWhile(/[^\s.{}\[\]()]/)?i.name="string.special":i.name="meta":a==="$"?(e.next()==="<"&&(e.eatWhile(/[^\s>]/),e.next()),i.name="string.special"):a==="|"&&t.expectVariable?i.context=new l(x,n):/[\[\]{}()]/.test(a)?(i.name="bracket",i.eos=/[\[{(]/.test(a),a==="["?t.indentation++:a==="]"&&(t.indentation=Math.max(0,t.indentation-1))):o.test(a)?(e.eatWhile(o),i.name="operator",i.eos=a!==";"):/\d/.test(a)?(e.eatWhile(/[\w\d]/),i.name="number"):/[\w_]/.test(a)?(e.eatWhile(/[\w\d_]/),i.name=t.expectVariable?p.test(e.current())?"keyword":"variable":null):i.eos=t.expectVariable,i},u=function(e,n){return e.eatWhile(/[^"]/),new r("comment",e.eat('"')?n.parent:n,!0)},s=function(e,n){return e.eatWhile(/[^']/),new r("string",e.eat("'")?n.parent:n,!1)},f=function(e,n){return e.eatWhile(/[^']/),new r("string.special",e.eat("'")?n.parent:n,!1)},x=function(e,n){var t=new r(null,n,!1),i=e.next();return i==="|"?(t.context=n.parent,t.eos=!0):(e.eatWhile(/[^|]/),t.name="variable"),t};const d={name:"smalltalk",startState:function(){return new c},token:function(e,n){if(n.userIndent(e.indentation(),e.indentUnit),e.eatSpace())return null;var t=n.context.next(e,n.context,n);return n.context=t.context,n.expectVariable=t.eos,t.name},blankLine:function(e,n){e.userIndent(0,n)},indent:function(e,n,t){var i=e.context.next===h&&n&&n.charAt(0)==="]"?-1:e.userIndentationDelta;return(e.indentation+i)*t.unit},languageData:{indentOnInput:/^\s*\]$/}};export{d as smalltalk}; 2 | -------------------------------------------------------------------------------- /web/dist/assets/solr-DehyRSwq.js: -------------------------------------------------------------------------------- 1 | var u=/[^\s\|\!\+\-\*\?\~\^\&\:\(\)\[\]\{\}\"\\]/,f=/[\|\!\+\-\*\?\~\^\&]/,l=/^(OR|AND|NOT|TO)$/;function k(n){return parseFloat(n).toString()===n}function a(n){return function(e,r){for(var t=!1,o;(o=e.next())!=null&&!(o==n&&!t);)t=!t&&o=="\\";return t||(r.tokenize=i),"string"}}function c(n){return function(e,r){return n=="|"?e.eat(/\|/):n=="&"&&e.eat(/\&/),r.tokenize=i,"operator"}}function s(n){return function(e,r){for(var t=n;(n=e.peek())&&n.match(u)!=null;)t+=e.next();return r.tokenize=i,l.test(t)?"operator":k(t)?"number":e.peek()==":"?"propertyName":"string"}}function i(n,e){var r=n.next();return r=='"'?e.tokenize=a(r):f.test(r)?e.tokenize=c(r):u.test(r)&&(e.tokenize=s(r)),e.tokenize!=i?e.tokenize(n,e):null}const p={name:"solr",startState:function(){return{tokenize:i}},token:function(n,e){return n.eatSpace()?null:e.tokenize(n,e)}};export{p as solr}; 2 | -------------------------------------------------------------------------------- /web/dist/assets/sparql-DkYu6x3z.js: -------------------------------------------------------------------------------- 1 | var u;function s(n){return new RegExp("^(?:"+n.join("|")+")$","i")}var d=s(["str","lang","langmatches","datatype","bound","sameterm","isiri","isuri","iri","uri","bnode","count","sum","min","max","avg","sample","group_concat","rand","abs","ceil","floor","round","concat","substr","strlen","replace","ucase","lcase","encode_for_uri","contains","strstarts","strends","strbefore","strafter","year","month","day","hours","minutes","seconds","timezone","tz","now","uuid","struuid","md5","sha1","sha256","sha384","sha512","coalesce","if","strlang","strdt","isnumeric","regex","exists","isblank","isliteral","a","bind"]),F=s(["base","prefix","select","distinct","reduced","construct","describe","ask","from","named","where","order","limit","offset","filter","optional","graph","by","asc","desc","as","having","undef","values","group","minus","in","not","service","silent","using","insert","delete","union","true","false","with","data","copy","to","move","add","create","drop","clear","load","into"]),x=/[*+\-<>=&|\^\/!\?]/,a="[A-Za-z_\\-0-9]",h=new RegExp("[A-Za-z]"),g=new RegExp("(("+a+"|\\.)*("+a+"))?:");function p(n,e){var t=n.next();if(u=null,t=="$"||t=="?")return t=="?"&&n.match(/\s/,!1)?"operator":(n.match(/^[A-Za-z0-9_\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][A-Za-z0-9_\u00B7\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u037D\u037F-\u1FFF\u200C-\u200D\u203F-\u2040\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]*/),"variableName.local");if(t=="<"&&!n.match(/^[\s\u00a0=]/,!1))return n.match(/^[^\s\u00a0>]*>?/),"atom";if(t=='"'||t=="'")return e.tokenize=v(t),e.tokenize(n,e);if(/[{}\(\),\.;\[\]]/.test(t))return u=t,"bracket";if(t=="#")return n.skipToEnd(),"comment";if(x.test(t))return"operator";if(t==":")return f(n),"atom";if(t=="@")return n.eatWhile(/[a-z\d\-]/i),"meta";if(h.test(t)&&n.match(g))return f(n),"atom";n.eatWhile(/[_\w\d]/);var i=n.current();return d.test(i)?"builtin":F.test(i)?"keyword":"variable"}function f(n){n.match(/(\.(?=[\w_\-\\%])|[:\w_-]|\\[-\\_~.!$&'()*+,;=/?#@%]|%[a-f\d][a-f\d])+/i)}function v(n){return function(e,t){for(var i=!1,r;(r=e.next())!=null;){if(r==n&&!i){t.tokenize=p;break}i=!i&&r=="\\"}return"string"}}function o(n,e,t){n.context={prev:n.context,indent:n.indent,col:t,type:e}}function c(n){n.indent=n.context.indent,n.context=n.context.prev}const m={name:"sparql",startState:function(){return{tokenize:p,context:null,indent:0,col:0}},token:function(n,e){if(n.sol()&&(e.context&&e.context.align==null&&(e.context.align=!1),e.indent=n.indentation()),n.eatSpace())return null;var t=e.tokenize(n,e);if(t!="comment"&&e.context&&e.context.align==null&&e.context.type!="pattern"&&(e.context.align=!0),u=="(")o(e,")",n.column());else if(u=="[")o(e,"]",n.column());else if(u=="{")o(e,"}",n.column());else if(/[\]\}\)]/.test(u)){for(;e.context&&e.context.type=="pattern";)c(e);e.context&&u==e.context.type&&(c(e),u=="}"&&e.context&&e.context.type=="pattern"&&c(e))}else u=="."&&e.context&&e.context.type=="pattern"?c(e):/atom|string|variable/.test(t)&&e.context&&(/[\}\]]/.test(e.context.type)?o(e,"pattern",n.column()):e.context.type=="pattern"&&!e.context.align&&(e.context.align=!0,e.context.col=n.column()));return t},indent:function(n,e,t){var i=e&&e.charAt(0),r=n.context;if(/[\]\}]/.test(i))for(;r&&r.type=="pattern";)r=r.prev;var l=r&&i==r.type;return r?r.type=="pattern"?r.col:r.align?r.col+(l?0:1):r.indent+(l?0:t.unit):0},languageData:{commentTokens:{line:"#"}}};export{m as sparql}; 2 | -------------------------------------------------------------------------------- /web/dist/assets/spreadsheet-BCZA_wO0.js: -------------------------------------------------------------------------------- 1 | const i={name:"spreadsheet",startState:function(){return{stringType:null,stack:[]}},token:function(e,n){if(e){switch(n.stack.length===0&&(e.peek()=='"'||e.peek()=="'")&&(n.stringType=e.peek(),e.next(),n.stack.unshift("string")),n.stack[0]){case"string":for(;n.stack[0]==="string"&&!e.eol();)e.peek()===n.stringType?(e.next(),n.stack.shift()):e.peek()==="\\"?(e.next(),e.next()):e.match(/^.[^\\\"\']*/);return"string";case"characterClass":for(;n.stack[0]==="characterClass"&&!e.eol();)e.match(/^[^\]\\]+/)||e.match(/^\\./)||n.stack.shift();return"operator"}var c=e.peek();switch(c){case"[":return e.next(),n.stack.unshift("characterClass"),"bracket";case":":return e.next(),"operator";case"\\":return e.match(/\\[a-z]+/)?"string.special":(e.next(),"atom");case".":case",":case";":case"*":case"-":case"+":case"^":case"<":case"/":case"=":return e.next(),"atom";case"$":return e.next(),"builtin"}return e.match(/\d+/)?e.match(/^\w+/)?"error":"number":e.match(/^[a-zA-Z_]\w*/)?e.match(/(?=[\(.])/,!1)?"keyword":"variable":["[","]","(",")","{","}"].indexOf(c)!=-1?(e.next(),"bracket"):(e.eatSpace()||e.next(),null)}}};export{i as spreadsheet}; 2 | -------------------------------------------------------------------------------- /web/dist/assets/stex-C3f8Ysf7.js: -------------------------------------------------------------------------------- 1 | function k(b){function h(t,n){t.cmdState.push(n)}function g(t){return t.cmdState.length>0?t.cmdState[t.cmdState.length-1]:null}function p(t){var n=t.cmdState.pop();n&&n.closeBracket()}function s(t){for(var n=t.cmdState,e=n.length-1;e>=0;e--){var a=n[e];if(a.name!="DEFAULT")return a}return{styleIdentifier:function(){return null}}}function i(t,n,e){return function(){this.name=t,this.bracketNo=0,this.style=n,this.styles=e,this.argument=null,this.styleIdentifier=function(){return this.styles[this.bracketNo-1]||null},this.openBracket=function(){return this.bracketNo++,"bracket"},this.closeBracket=function(){}}}var r={};r.importmodule=i("importmodule","tag",["string","builtin"]),r.documentclass=i("documentclass","tag",["","atom"]),r.usepackage=i("usepackage","tag",["atom"]),r.begin=i("begin","tag",["atom"]),r.end=i("end","tag",["atom"]),r.label=i("label","tag",["atom"]),r.ref=i("ref","tag",["atom"]),r.eqref=i("eqref","tag",["atom"]),r.cite=i("cite","tag",["atom"]),r.bibitem=i("bibitem","tag",["atom"]),r.Bibitem=i("Bibitem","tag",["atom"]),r.RBibitem=i("RBibitem","tag",["atom"]),r.DEFAULT=function(){this.name="DEFAULT",this.style="tag",this.styleIdentifier=this.openBracket=this.closeBracket=function(){}};function f(t,n){t.f=n}function l(t,n){var e;if(t.match(/^\\[a-zA-Z@\xc0-\u1fff\u2060-\uffff]+/)){var a=t.current().slice(1);return e=r.hasOwnProperty(a)?r[a]:r.DEFAULT,e=new e,h(n,e),f(n,d),e.style}if(t.match(/^\\[$&%#{}_]/)||t.match(/^\\[,;!\/\\]/))return"tag";if(t.match("\\["))return f(n,function(m,c){return o(m,c,"\\]")}),"keyword";if(t.match("\\("))return f(n,function(m,c){return o(m,c,"\\)")}),"keyword";if(t.match("$$"))return f(n,function(m,c){return o(m,c,"$$")}),"keyword";if(t.match("$"))return f(n,function(m,c){return o(m,c,"$")}),"keyword";var u=t.next();if(u=="%")return t.skipToEnd(),"comment";if(u=="}"||u=="]"){if(e=g(n),e)e.closeBracket(u),f(n,d);else return"error";return"bracket"}else return u=="{"||u=="["?(e=r.DEFAULT,e=new e,h(n,e),"bracket"):/\d/.test(u)?(t.eatWhile(/[\w.%]/),"atom"):(t.eatWhile(/[\w\-_]/),e=s(n),e.name=="begin"&&(e.argument=t.current()),e.styleIdentifier())}function o(t,n,e){if(t.eatSpace())return null;if(e&&t.match(e))return f(n,l),"keyword";if(t.match(/^\\[a-zA-Z@]+/))return"tag";if(t.match(/^[a-zA-Z]+/))return"variableName.special";if(t.match(/^\\[$&%#{}_]/)||t.match(/^\\[,;!\/]/)||t.match(/^[\^_&]/))return"tag";if(t.match(/^[+\-<>|=,\/@!*:;'"`~#?]/))return null;if(t.match(/^(\d+\.\d*|\d*\.\d+|\d+)/))return"number";var a=t.next();return a=="{"||a=="}"||a=="["||a=="]"||a=="("||a==")"?"bracket":a=="%"?(t.skipToEnd(),"comment"):"error"}function d(t,n){var e=t.peek(),a;return e=="{"||e=="["?(a=g(n),a.openBracket(e),t.eat(e),f(n,l),"bracket"):/[ \t\r]/.test(e)?(t.eat(e),null):(f(n,l),p(n),l(t,n))}return{name:"stex",startState:function(){var t=b?function(n,e){return o(n,e)}:l;return{cmdState:[],f:t}},copyState:function(t){return{cmdState:t.cmdState.slice(),f:t.f}},token:function(t,n){return n.f(t,n)},blankLine:function(t){t.f=l,t.cmdState.length=0},languageData:{commentTokens:{line:"%"}}}}const y=k(!1),S=k(!0);export{y as stex,S as stexMath}; 2 | -------------------------------------------------------------------------------- /web/dist/assets/tcl-DVfN8rqt.js: -------------------------------------------------------------------------------- 1 | function s(r){for(var n={},t=r.split(" "),e=0;e!?^\/\|]/;function i(r,n,t){return n.tokenize=t,t(r,n)}function o(r,n){var t=n.beforeParams;n.beforeParams=!1;var e=r.next();if((e=='"'||e=="'")&&n.inParams)return i(r,n,p(e));if(/[\[\]{}\(\),;\.]/.test(e))return e=="("&&t?n.inParams=!0:e==")"&&(n.inParams=!1),null;if(/\d/.test(e))return r.eatWhile(/[\w\.]/),"number";if(e=="#")return r.eat("*")?i(r,n,d):e=="#"&&r.match(/ *\[ *\[/)?i(r,n,k):(r.skipToEnd(),"comment");if(e=='"')return r.skipTo(/"/),"comment";if(e=="$")return r.eatWhile(/[$_a-z0-9A-Z\.{:]/),r.eatWhile(/}/),n.beforeParams=!0,"builtin";if(c.test(e))return r.eatWhile(c),"comment";r.eatWhile(/[\w\$_{}\xa1-\uffff]/);var a=r.current().toLowerCase();return f&&f.propertyIsEnumerable(a)?"keyword":u&&u.propertyIsEnumerable(a)?(n.beforeParams=!0,"keyword"):null}function p(r){return function(n,t){for(var e=!1,a,l=!1;(a=n.next())!=null;){if(a==r&&!e){l=!0;break}e=!e&&a=="\\"}return l&&(t.tokenize=o),"string"}}function d(r,n){for(var t=!1,e;e=r.next();){if(e=="#"&&t){n.tokenize=o;break}t=e=="*"}return"comment"}function k(r,n){for(var t=0,e;e=r.next();){if(e=="#"&&t==2){n.tokenize=o;break}e=="]"?t++:e!=" "&&(t=0)}return"meta"}const m={name:"tcl",startState:function(){return{tokenize:o,beforeParams:!1,inParams:!1}},token:function(r,n){return r.eatSpace()?null:n.tokenize(r,n)},languageData:{commentTokens:{line:"#"}}};export{m as tcl}; 2 | -------------------------------------------------------------------------------- /web/dist/assets/tiddlywiki-DO-Gjzrf.js: -------------------------------------------------------------------------------- 1 | var c={},l={allTags:!0,closeAll:!0,list:!0,newJournal:!0,newTiddler:!0,permaview:!0,saveChanges:!0,search:!0,slider:!0,tabs:!0,tag:!0,tagging:!0,tags:!0,tiddler:!0,timeline:!0,today:!0,version:!0,option:!0,with:!0,filter:!0},f=/[\w_\-]/i,k=/^\-\-\-\-+$/,h=/^\/\*\*\*$/,d=/^\*\*\*\/$/,a=/^<<<$/,p=/^\/\/\{\{\{$/,w=/^\/\/\}\}\}$/,b=/^$/,v=/^$/,S=/^\{\{\{$/,y=/^\}\}\}$/,$=/.*?\}\}\}/;function o(e,t,r){return t.tokenize=r,r(e,t)}function i(e,t){var r=e.sol(),n=e.peek();if(t.block=!1,r&&/[<\/\*{}\-]/.test(n)){if(e.match(S))return t.block=!0,o(e,t,u);if(e.match(a))return"quote";if(e.match(h)||e.match(d)||e.match(p)||e.match(w)||e.match(b)||e.match(v))return"comment";if(e.match(k))return"contentSeparator"}if(e.next(),r&&/[\/\*!#;:>|]/.test(n)){if(n=="!")return e.skipToEnd(),"header";if(n=="*")return e.eatWhile("*"),"comment";if(n=="#")return e.eatWhile("#"),"comment";if(n==";")return e.eatWhile(";"),"comment";if(n==":")return e.eatWhile(":"),"comment";if(n==">")return e.eatWhile(">"),"quote";if(n=="|")return"header"}if(n=="{"&&e.match("{{"))return o(e,t,u);if(/[hf]/i.test(n)&&/[ti]/i.test(e.peek())&&e.match(/\b(ttps?|tp|ile):\/\/[\-A-Z0-9+&@#\/%?=~_|$!:,.;]*[A-Z0-9+&@#\/%=~_|$]/i))return"link";if(n=='"')return"string";if(n=="~"||/[\[\]]/.test(n)&&e.match(n))return"brace";if(n=="@")return e.eatWhile(f),"link";if(/\d/.test(n))return e.eatWhile(/\d/),"number";if(n=="/"){if(e.eat("%"))return o(e,t,z);if(e.eat("/"))return o(e,t,W)}if(n=="_"&&e.eat("_"))return o(e,t,x);if(n=="-"&&e.eat("-")){if(e.peek()!=" ")return o(e,t,g);if(e.peek()==" ")return"brace"}return n=="'"&&e.eat("'")?o(e,t,C):n=="<"&&e.eat("<")?o(e,t,T):(e.eatWhile(/[\w\$_]/),c.propertyIsEnumerable(e.current())?"keyword":null)}function z(e,t){for(var r=!1,n;n=e.next();){if(n=="/"&&r){t.tokenize=i;break}r=n=="%"}return"comment"}function C(e,t){for(var r=!1,n;n=e.next();){if(n=="'"&&r){t.tokenize=i;break}r=n=="'"}return"strong"}function u(e,t){var r=t.block;return r&&e.current()?"comment":!r&&e.match($)||r&&e.sol()&&e.match(y)?(t.tokenize=i,"comment"):(e.next(),"comment")}function W(e,t){for(var r=!1,n;n=e.next();){if(n=="/"&&r){t.tokenize=i;break}r=n=="/"}return"emphasis"}function x(e,t){for(var r=!1,n;n=e.next();){if(n=="_"&&r){t.tokenize=i;break}r=n=="_"}return"link"}function g(e,t){for(var r=!1,n;n=e.next();){if(n=="-"&&r){t.tokenize=i;break}r=n=="-"}return"deleted"}function T(e,t){if(e.current()=="<<")return"meta";var r=e.next();return r?r==">"&&e.peek()==">"?(e.next(),t.tokenize=i,"meta"):(e.eatWhile(/[\w\$_]/),l.propertyIsEnumerable(e.current())?"keyword":null):(t.tokenize=i,null)}const m={name:"tiddlywiki",startState:function(){return{tokenize:i}},token:function(e,t){if(e.eatSpace())return null;var r=t.tokenize(e,t);return r}};export{m as tiddlyWiki}; 2 | -------------------------------------------------------------------------------- /web/dist/assets/tiki-DGYXhP31.js: -------------------------------------------------------------------------------- 1 | function c(e,t,n){return function(r,a){for(;!r.eol();){if(r.match(t)){a.tokenize=o;break}r.next()}return n&&(a.tokenize=n),e}}function f(e){return function(t,n){for(;!t.eol();)t.next();return n.tokenize=o,e}}function o(e,t){function n(p){return t.tokenize=p,p(e,t)}var r=e.sol(),a=e.next();switch(a){case"{":return e.eat("/"),e.eatSpace(),e.eatWhile(/[^\s\u00a0=\"\'\/?(}]/),t.tokenize=h,"tag";case"_":if(e.eat("_"))return n(c("strong","__",o));break;case"'":if(e.eat("'"))return n(c("em","''",o));break;case"(":if(e.eat("("))return n(c("link","))",o));break;case"[":return n(c("url","]",o));case"|":if(e.eat("|"))return n(c("comment","||"));break;case"-":if(e.eat("="))return n(c("header string","=-",o));if(e.eat("-"))return n(c("error tw-deleted","--",o));break;case"=":if(e.match("=="))return n(c("tw-underline","===",o));break;case":":if(e.eat(":"))return n(c("comment","::"));break;case"^":return n(c("tw-box","^"));case"~":if(e.match("np~"))return n(c("meta","~/np~"));break}if(r)switch(a){case"!":return e.match("!!!!!")||e.match("!!!!")||e.match("!!!")||e.match("!!"),n(f("header string"));case"*":case"#":case"+":return n(f("tw-listitem bracket"))}return null}var g,s;function h(e,t){var n=e.next(),r=e.peek();return n=="}"?(t.tokenize=o,"tag"):n=="("||n==")"?"bracket":n=="="?(s="equals",r==">"&&(e.next(),r=e.peek()),/[\'\"]/.test(r)||(t.tokenize=z()),"operator"):/[\'\"]/.test(n)?(t.tokenize=w(n),t.tokenize(e,t)):(e.eatWhile(/[^\s\u00a0=\"\'\/?]/),"keyword")}function w(e){return function(t,n){for(;!t.eol();)if(t.next()==e){n.tokenize=h;break}return"string"}}function z(){return function(e,t){for(;!e.eol();){var n=e.next(),r=e.peek();if(n==" "||n==","||/[ )}]/.test(r)){t.tokenize=h;break}}return"string"}}var i,l;function k(){for(var e=arguments.length-1;e>=0;e--)i.cc.push(arguments[e])}function u(){return k.apply(null,arguments),!0}function b(e,t){var n=i.context&&i.context.noIndent;i.context={prev:i.context,pluginName:e,indent:i.indented,startOfLine:t,noIndent:n}}function x(){i.context&&(i.context=i.context.prev)}function L(e){if(e=="openPlugin")return i.pluginName=g,u(d,N(i.startOfLine));if(e=="closePlugin"){var t=!1;return i.context?(t=i.context.pluginName!=g,x()):t=!0,t&&(l="error"),u(P(t))}else return e=="string"&&((!i.context||i.context.name!="!cdata")&&b("!cdata"),i.tokenize==o&&x()),u()}function N(e){return function(t){return t=="selfclosePlugin"||t=="endPlugin"||t=="endPlugin"&&b(i.pluginName,e),u()}}function P(e){return function(t){return e&&(l="error"),t=="endPlugin"?u():k()}}function d(e){return e=="keyword"?(l="attribute",u(d)):e=="equals"?u(O,d):k()}function O(e){return e=="keyword"?(l="string",u()):e=="string"?u(v):k()}function v(e){return e=="string"?u(v):k()}const S={name:"tiki",startState:function(){return{tokenize:o,cc:[],indented:0,startOfLine:!0,pluginName:null,context:null}},token:function(e,t){if(e.sol()&&(t.startOfLine=!0,t.indented=e.indentation()),e.eatSpace())return null;l=s=g=null;var n=t.tokenize(e,t);if((n||s)&&n!="comment")for(i=t;;){var r=t.cc.pop()||L;if(r(s||n))break}return t.startOfLine=!1,l||n},indent:function(e,t,n){var r=e.context;if(r&&r.noIndent)return 0;for(r&&/^{\//.test(t)&&(r=r.prev);r&&!r.startOfLine;)r=r.prev;return r?r.indent+n.unit:0}};export{S as tiki}; 2 | -------------------------------------------------------------------------------- /web/dist/assets/toml-BXUEaScT.js: -------------------------------------------------------------------------------- 1 | const l={name:"toml",startState:function(){return{inString:!1,stringType:"",lhs:!0,inArray:0}},token:function(n,e){if(!e.inString&&(n.peek()=='"'||n.peek()=="'")&&(e.stringType=n.peek(),n.next(),e.inString=!0),n.sol()&&e.inArray===0&&(e.lhs=!0),e.inString){for(;e.inString&&!n.eol();)n.peek()===e.stringType?(n.next(),e.inString=!1):n.peek()==="\\"?(n.next(),n.next()):n.match(/^.[^\\\"\']*/);return e.lhs?"property":"string"}else{if(e.inArray&&n.peek()==="]")return n.next(),e.inArray--,"bracket";if(e.lhs&&n.peek()==="["&&n.skipTo("]"))return n.next(),n.peek()==="]"&&n.next(),"atom";if(n.peek()==="#")return n.skipToEnd(),"comment";if(n.eatSpace())return null;if(e.lhs&&n.eatWhile(function(i){return i!="="&&i!=" "}))return"property";if(e.lhs&&n.peek()==="=")return n.next(),e.lhs=!1,null;if(!e.lhs&&n.match(/^\d\d\d\d[\d\-\:\.T]*Z/))return"atom";if(!e.lhs&&(n.match("true")||n.match("false")))return"atom";if(!e.lhs&&n.peek()==="[")return e.inArray++,n.next(),"bracket";if(!e.lhs&&n.match(/^\-?\d+(?:\.\d+)?/))return"number";n.eatSpace()||n.next()}return null},languageData:{commentTokens:{line:"#"}}};export{l as toml}; 2 | -------------------------------------------------------------------------------- /web/dist/assets/troff-wAsdV37c.js: -------------------------------------------------------------------------------- 1 | var h={};function u(n){if(n.eatSpace())return null;var t=n.sol(),c=n.next();if(c==="\\")return n.match("fB")||n.match("fR")||n.match("fI")||n.match("u")||n.match("d")||n.match("%")||n.match("&")?"string":n.match("m[")?(n.skipTo("]"),n.next(),"string"):n.match("s+")||n.match("s-")?(n.eatWhile(/[\d-]/),"string"):((n.match("(")||n.match("*("))&&n.eatWhile(/[\w-]/),"string");if(t&&(c==="."||c==="'")&&n.eat("\\")&&n.eat('"'))return n.skipToEnd(),"comment";if(t&&c==="."){if(n.match("B ")||n.match("I ")||n.match("R "))return"attribute";if(n.match("TH ")||n.match("SH ")||n.match("SS ")||n.match("HP "))return n.skipToEnd(),"quote";if(n.match(/[A-Z]/)&&n.match(/[A-Z]/)||n.match(/[a-z]/)&&n.match(/[a-z]/))return"attribute"}n.eatWhile(/[\w-]/);var i=n.current();return h.hasOwnProperty(i)?h[i]:null}function f(n,t){return(t.tokens[0]||u)(n,t)}const o={name:"troff",startState:function(){return{tokens:[]}},token:function(n,t){return f(n,t)}};export{o as troff}; 2 | -------------------------------------------------------------------------------- /web/dist/assets/turtle-B1tBg_DP.js: -------------------------------------------------------------------------------- 1 | var r;function p(e){return new RegExp("^(?:"+e.join("|")+")$","i")}p([]);var d=p(["@prefix","@base","a"]),f=/[*+\-<>=&|]/;function x(e,n){var t=e.next();if(r=null,t=="<"&&!e.match(/^[\s\u00a0=]/,!1))return e.match(/^[^\s\u00a0>]*>?/),"atom";if(t=='"'||t=="'")return n.tokenize=v(t),n.tokenize(e,n);if(/[{}\(\),\.;\[\]]/.test(t))return r=t,null;if(t=="#")return e.skipToEnd(),"comment";if(f.test(t))return e.eatWhile(f),null;if(t==":")return"operator";if(e.eatWhile(/[_\w\d]/),e.peek()==":")return"variableName.special";var i=e.current();return d.test(i)?"meta":t>="A"&&t<="Z"?"comment":"keyword";var i=e.current()}function v(e){return function(n,t){for(var i=!1,o;(o=n.next())!=null;){if(o==e&&!i){t.tokenize=x;break}i=!i&&o=="\\"}return"string"}}function l(e,n,t){e.context={prev:e.context,indent:e.indent,col:t,type:n}}function c(e){e.indent=e.context.indent,e.context=e.context.prev}const g={name:"turtle",startState:function(){return{tokenize:x,context:null,indent:0,col:0}},token:function(e,n){if(e.sol()&&(n.context&&n.context.align==null&&(n.context.align=!1),n.indent=e.indentation()),e.eatSpace())return null;var t=n.tokenize(e,n);if(t!="comment"&&n.context&&n.context.align==null&&n.context.type!="pattern"&&(n.context.align=!0),r=="(")l(n,")",e.column());else if(r=="[")l(n,"]",e.column());else if(r=="{")l(n,"}",e.column());else if(/[\]\}\)]/.test(r)){for(;n.context&&n.context.type=="pattern";)c(n);n.context&&r==n.context.type&&c(n)}else r=="."&&n.context&&n.context.type=="pattern"?c(n):/atom|string|variable/.test(t)&&n.context&&(/[\}\]]/.test(n.context.type)?l(n,"pattern",e.column()):n.context.type=="pattern"&&!n.context.align&&(n.context.align=!0,n.context.col=e.column()));return t},indent:function(e,n,t){var i=n&&n.charAt(0),o=e.context;if(/[\]\}]/.test(i))for(;o&&o.type=="pattern";)o=o.prev;var u=o&&i==o.type;return o?o.type=="pattern"?o.col:o.align?o.col+(u?0:1):o.indent+(u?0:t.unit):0},languageData:{commentTokens:{line:"#"}}};export{g as turtle}; 2 | -------------------------------------------------------------------------------- /web/dist/assets/velocity-D8B20fx6.js: -------------------------------------------------------------------------------- 1 | function u(n){for(var e={},i=n.split(" "),r=0;r!?:\/|]/;function o(n,e,i){return e.tokenize=i,i(n,e)}function t(n,e){var i=e.beforeParams;e.beforeParams=!1;var r=n.next();if(r=="'"&&!e.inString&&e.inParams)return e.lastTokenWasBuiltin=!1,o(n,e,p(r));if(r=='"'){if(e.lastTokenWasBuiltin=!1,e.inString)return e.inString=!1,"string";if(e.inParams)return o(n,e,p(r))}else{if(/[\[\]{}\(\),;\.]/.test(r))return r=="("&&i?e.inParams=!0:r==")"&&(e.inParams=!1,e.lastTokenWasBuiltin=!0),null;if(/\d/.test(r))return e.lastTokenWasBuiltin=!1,n.eatWhile(/[\w\.]/),"number";if(r=="#"&&n.eat("*"))return e.lastTokenWasBuiltin=!1,o(n,e,h);if(r=="#"&&n.match(/ *\[ *\[/))return e.lastTokenWasBuiltin=!1,o(n,e,b);if(r=="#"&&n.eat("#"))return e.lastTokenWasBuiltin=!1,n.skipToEnd(),"comment";if(r=="$")return n.eat("!"),n.eatWhile(/[\w\d\$_\.{}-]/),c&&c.propertyIsEnumerable(n.current())?"keyword":(e.lastTokenWasBuiltin=!0,e.beforeParams=!0,"builtin");if(k.test(r))return e.lastTokenWasBuiltin=!1,n.eatWhile(k),"operator";n.eatWhile(/[\w\$_{}@]/);var l=n.current();return s&&s.propertyIsEnumerable(l)?"keyword":a&&a.propertyIsEnumerable(l)||n.current().match(/^#@?[a-z0-9_]+ *$/i)&&n.peek()=="("&&!(a&&a.propertyIsEnumerable(l.toLowerCase()))?(e.beforeParams=!0,e.lastTokenWasBuiltin=!1,"keyword"):e.inString?(e.lastTokenWasBuiltin=!1,"string"):n.pos>l.length&&n.string.charAt(n.pos-l.length-1)=="."&&e.lastTokenWasBuiltin?"builtin":(e.lastTokenWasBuiltin=!1,null)}}function p(n){return function(e,i){for(var r=!1,l,f=!1;(l=e.next())!=null;){if(l==n&&!r){f=!0;break}if(n=='"'&&e.peek()=="$"&&!r){i.inString=!0,f=!0;break}r=!r&&l=="\\"}return f&&(i.tokenize=t),"string"}}function h(n,e){for(var i=!1,r;r=n.next();){if(r=="#"&&i){e.tokenize=t;break}i=r=="*"}return"comment"}function b(n,e){for(var i=0,r;r=n.next();){if(r=="#"&&i==2){e.tokenize=t;break}r=="]"?i++:r!=" "&&(i=0)}return"meta"}const W={name:"velocity",startState:function(){return{tokenize:t,beforeParams:!1,inParams:!1,inString:!1,lastTokenWasBuiltin:!1}},token:function(n,e){return n.eatSpace()?null:e.tokenize(n,e)},languageData:{commentTokens:{line:"##",block:{open:"#*",close:"*#"}}}};export{W as velocity}; 2 | -------------------------------------------------------------------------------- /web/dist/assets/vhdl-lSbBsy5d.js: -------------------------------------------------------------------------------- 1 | function f(e){for(var t={},n=e.split(","),r=0;r?]/,g=/^-?([1-9][0-9]*|0[Xx][0-9A-Fa-f]+|0[0-7]*)/,h=/^-?(([0-9]+\.[0-9]*|[0-9]*\.[0-9]+)([Ee][+-]?[0-9]+)?|[0-9]+[Ee][+-]?[0-9]+)/,i=/^_?[A-Za-z][0-9A-Z_a-z-]*/,D=/^_?[A-Za-z][0-9A-Z_a-z-]*(?=\s*;)/,k=/^"[^"]*"/,E=/^\/\*.*?\*\//,C=/^\/\*.*/,w=/^.*?\*\//;function N(e,r){if(e.eatSpace())return null;if(r.inComment)return e.match(w)?(r.inComment=!1,"comment"):(e.skipToEnd(),"comment");if(e.match("//"))return e.skipToEnd(),"comment";if(e.match(E))return"comment";if(e.match(C))return r.inComment=!0,"comment";if(e.match(/^-?[0-9\.]/,!1)&&(e.match(g)||e.match(h)))return"number";if(e.match(k))return"string";if(r.startDef&&e.match(i))return"def";if(r.endDef&&e.match(D))return r.endDef=!1,"def";if(e.match(s))return"keyword";if(e.match(m)){var t=r.lastToken,n=(e.match(/^\s*(.+?)\b/,!1)||[])[1];return t===":"||t==="implements"||n==="implements"||n==="="?"builtin":"type"}return e.match(u)?"builtin":e.match(y)?"atom":e.match(i)?"variable":e.match(A)?"operator":(e.next(),null)}const S={name:"webidl",startState:function(){return{inComment:!1,lastToken:"",startDef:!1,endDef:!1}},token:function(e,r){var t=N(e,r);if(t){var n=e.current();r.lastToken=n,t==="keyword"?(r.startDef=p.test(n),r.endDef=r.endDef||v.test(n)):r.startDef=!1}return t},languageData:{autocomplete:l.concat(o).concat(c).concat(f)}};export{S as webIDL}; 2 | -------------------------------------------------------------------------------- /web/dist/assets/wecom-CrDM2Kh5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/X-Mars/beenote/0aa5f3743597a6a8345b542cc547f3a6431de647/web/dist/assets/wecom-CrDM2Kh5.png -------------------------------------------------------------------------------- /web/dist/assets/yacas-BJ4BC0dw.js: -------------------------------------------------------------------------------- 1 | function t(e){for(var n={},r=e.split(" "),o=0;o|<|&|\||_|`|'|\^|\?|!|%|#)/,!0,!1)?"operator":"error"}function v(e,n){for(var r,o=!1,i=!1;(r=e.next())!=null;){if(r==='"'&&!i){o=!0;break}i=!i&&r==="\\"}return o&&!i&&(n.tokenize=l),"string"}function h(e,n){for(var r,o;(o=e.next())!=null;){if(r==="*"&&o==="/"){n.tokenize=l;break}r=o}return"comment"}function c(e){var n=null;return e.scopes.length>0&&(n=e.scopes[e.scopes.length-1]),n}const b={name:"yacas",startState:function(){return{tokenize:l,scopes:[]}},token:function(e,n){return e.eatSpace()?null:n.tokenize(e,n)},indent:function(e,n,r){if(e.tokenize!==l&&e.tokenize!==null)return null;var o=0;return(n==="]"||n==="];"||n==="}"||n==="};"||n===");")&&(o=-1),(e.scopes.length+o)*r.unit},languageData:{electricInput:/[{}\[\]()\;]/,commentTokens:{line:"//",block:{open:"/*",close:"*/"}}}};export{b as yacas}; 2 | -------------------------------------------------------------------------------- /web/dist/assets/z80-Hz9HOZM7.js: -------------------------------------------------------------------------------- 1 | function o(t){var n,l;t?(n=/^(exx?|(ld|cp)([di]r?)?|[lp]ea|pop|push|ad[cd]|cpl|daa|dec|inc|neg|sbc|sub|and|bit|[cs]cf|x?or|res|set|r[lr]c?a?|r[lr]d|s[lr]a|srl|djnz|nop|[de]i|halt|im|in([di]mr?|ir?|irx|2r?)|ot(dmr?|[id]rx|imr?)|out(0?|[di]r?|[di]2r?)|tst(io)?|slp)(\.([sl]?i)?[sl])?\b/i,l=/^(((call|j[pr]|rst|ret[in]?)(\.([sl]?i)?[sl])?)|(rs|st)mix)\b/i):(n=/^(exx?|(ld|cp|in)([di]r?)?|pop|push|ad[cd]|cpl|daa|dec|inc|neg|sbc|sub|and|bit|[cs]cf|x?or|res|set|r[lr]c?a?|r[lr]d|s[lr]a|srl|djnz|nop|rst|[de]i|halt|im|ot[di]r|out[di]?)\b/i,l=/^(call|j[pr]|ret[in]?|b_?(call|jump))\b/i);var u=/^(af?|bc?|c|de?|e|hl?|l|i[xy]?|r|sp)\b/i,d=/^(n?[zc]|p[oe]?|m)\b/i,f=/^([hl][xy]|i[xy][hl]|slia|sll)\b/i,c=/^([\da-f]+h|[0-7]+o|[01]+b|\d+d?)\b/i;return{name:"z80",startState:function(){return{context:0}},token:function(e,i){if(e.column()||(i.context=0),e.eatSpace())return null;var r;if(e.eatWhile(/\w/))if(t&&e.eat(".")&&e.eatWhile(/\w/),r=e.current(),e.indentation()){if((i.context==1||i.context==4)&&u.test(r))return i.context=4,"variable";if(i.context==2&&d.test(r))return i.context=4,"variableName.special";if(n.test(r))return i.context=1,"keyword";if(l.test(r))return i.context=2,"keyword";if(i.context==4&&c.test(r))return"number";if(f.test(r))return"error"}else return e.match(c)?"number":null;else{if(e.eat(";"))return e.skipToEnd(),"comment";if(e.eat('"')){for(;(r=e.next())&&r!='"';)r=="\\"&&e.next();return"string"}else if(e.eat("'")){if(e.match(/\\?.'/))return"number"}else if(e.eat(".")||e.sol()&&e.eat("#")){if(i.context=5,e.eatWhile(/\w/))return"def"}else if(e.eat("$")){if(e.eatWhile(/[\da-f]/i))return"number"}else if(e.eat("%")){if(e.eatWhile(/[01]/))return"number"}else e.next()}return null}}}const a=o(!1),s=o(!0);export{s as ez80,a as z80}; 2 | -------------------------------------------------------------------------------- /web/dist/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/X-Mars/beenote/0aa5f3743597a6a8345b542cc547f3a6431de647/web/dist/favicon.ico -------------------------------------------------------------------------------- /web/dist/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 蜜蜂笔记 8 | 9 | 10 | 11 | 12 |
13 | 14 | -------------------------------------------------------------------------------- /web/dist/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/X-Mars/beenote/0aa5f3743597a6a8345b542cc547f3a6431de647/web/dist/logo.png -------------------------------------------------------------------------------- /web/dist/note.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /web/env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | 3 | declare module 'vue-router' { 4 | interface RouteMeta { 5 | requiresAuth?: boolean 6 | roles?: string[] 7 | title?: string 8 | icon?: Component 9 | hidden?: boolean 10 | } 11 | } -------------------------------------------------------------------------------- /web/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 蜜蜂笔记 8 | 9 | 10 |
11 | 12 | 13 | -------------------------------------------------------------------------------- /web/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "note-management-web", 3 | "private": true, 4 | "version": "0.1.0", 5 | "type": "module", 6 | "scripts": { 7 | "dev": "vite", 8 | "build": "vite build", 9 | "preview": "vite preview", 10 | "lint": "eslint . --ext .vue,.js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts --fix --ignore-path .gitignore", 11 | "format": "prettier --write src/", 12 | "type-check": "vue-tsc --noEmit" 13 | }, 14 | "dependencies": { 15 | "@element-plus/icons-vue": "^2.3.1", 16 | "axios": "^1.8.4", 17 | "dayjs": "^1.11.13", 18 | "echarts": "^5.6.0", 19 | "element-plus": "^2.9.7", 20 | "lodash-es": "^4.17.21", 21 | "md-editor-v3": "^5.4.5", 22 | "pinia": "^3.0.2", 23 | "vue": "^3.5.13", 24 | "vue-router": "^4.5.0" 25 | }, 26 | "devDependencies": { 27 | "@rushstack/eslint-patch": "^1.11.0", 28 | "@tsconfig/node18": "^18.2.4", 29 | "@types/echarts": "^5.0.0", 30 | "@types/lodash-es": "^4.17.12", 31 | "@types/node": "^22.14.0", 32 | "@vitejs/plugin-vue": "^5.2.3", 33 | "@vue/eslint-config-prettier": "^10.2.0", 34 | "@vue/eslint-config-typescript": "^14.5.0", 35 | "@vue/tsconfig": "^0.7.0", 36 | "eslint": "^9.24.0", 37 | "eslint-plugin-vue": "^10.0.0", 38 | "prettier": "^3.5.3", 39 | "typescript": "~5.8.3", 40 | "vite": "^6.2.6", 41 | "vue-tsc": "^2.2.8" 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /web/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/X-Mars/beenote/0aa5f3743597a6a8345b542cc547f3a6431de647/web/public/favicon.ico -------------------------------------------------------------------------------- /web/public/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/X-Mars/beenote/0aa5f3743597a6a8345b542cc547f3a6431de647/web/public/logo.png -------------------------------------------------------------------------------- /web/public/note.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /web/src/App.vue: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /web/src/api/index.ts: -------------------------------------------------------------------------------- 1 | import request from './request' 2 | import type { Note, Group, User } from './types' 3 | 4 | export const login = (data: { username: string; password: string }) => { 5 | return request.post('/auth/login/', data) 6 | } 7 | 8 | export const getNotes = (params?: any) => { 9 | return request.get('/notes/', { params }) 10 | } 11 | 12 | export const createNote = (data: Partial) => { 13 | return request.post('/notes/', data) 14 | } 15 | 16 | export const updateNote = (id: string, data: Partial) => { 17 | return request.patch(`/notes/${id}/`, data) 18 | } 19 | 20 | export const deleteNote = (id: string) => { 21 | return request.delete(`/notes/${id}/`) 22 | } 23 | 24 | export const getGroups = () => { 25 | return request.get('/groups/') 26 | } 27 | 28 | export const createGroup = (data: Partial) => { 29 | return request.post('/groups/', data) 30 | } 31 | 32 | export const updateGroup = (id: string, data: Partial) => { 33 | return request.patch(`/groups/${id}/`, data) 34 | } 35 | 36 | export const deleteGroup = (id: string) => { 37 | return request.delete(`/groups/${id}/`) 38 | } 39 | 40 | export const getNoteStats = (params?: { range?: string }) => { 41 | return request.get('/notes/stats/', { params }) 42 | } 43 | 44 | export const getActiveUsers = () => { 45 | return request.get('/auth/stats/') 46 | } 47 | 48 | export const getNote = (id: string) => { 49 | return request.get(`/notes/${id}/`) 50 | } 51 | 52 | export const getUsers = () => { 53 | return request.get('/auth/users/') 54 | } 55 | 56 | export const createUser = (data: Partial) => { 57 | return request.post('/auth/users/', data) 58 | } 59 | 60 | export const updateUser = (id: string, data: Partial) => { 61 | return request.patch(`/auth/users/${id}/`, data) 62 | } 63 | 64 | export const deleteUser = (id: string) => { 65 | return request.delete(`/auth/users/${id}/`) 66 | } 67 | 68 | export const getAuthGroups = () => { 69 | return request.get('/auth/groups/') 70 | } 71 | 72 | export const createAuthGroup = (data: Partial) => { 73 | return request.post('/auth/groups/', data) 74 | } 75 | 76 | export const updateAuthGroup = (id: string, data: Partial) => { 77 | return request.patch(`/auth/groups/${id}/`, data) 78 | } 79 | 80 | export const deleteAuthGroup = (id: string) => { 81 | return request.delete(`/auth/groups/${id}/`) 82 | } -------------------------------------------------------------------------------- /web/src/api/request.ts: -------------------------------------------------------------------------------- 1 | import axios from 'axios' 2 | import { ElMessage } from 'element-plus' 3 | import router from '@/router' 4 | import { useUserStore } from '@/store/user' 5 | 6 | const request = axios.create({ 7 | baseURL: '/api', 8 | timeout: 30000 9 | }) 10 | 11 | // 请求拦截器 12 | request.interceptors.request.use( 13 | config => { 14 | const token = localStorage.getItem('token') 15 | if (token) { 16 | config.headers.Authorization = `Bearer ${token}` 17 | } 18 | return config 19 | }, 20 | error => { 21 | return Promise.reject(error) 22 | } 23 | ) 24 | 25 | // 响应拦截器 26 | request.interceptors.response.use( 27 | response => { 28 | return response 29 | }, 30 | error => { 31 | // 处理 token 过期的情况 32 | if (error.response?.status === 401 && 33 | error.response?.data?.code === 'token_not_valid') { 34 | // 清除用户信息和 token 35 | const userStore = useUserStore() 36 | userStore.clearUser() 37 | 38 | // 跳转到登录页 39 | router.push('/login') 40 | 41 | ElMessage.error('登录已过期,请重新登录') 42 | return Promise.reject(new Error('登录已过期')) 43 | } 44 | 45 | // 处理后端返回的错误信息 46 | if (error.response?.data) { 47 | const errors = error.response.data 48 | // 如果是对象格式的错误信息,将所有错误信息拼接起来 49 | if (typeof errors === 'object' && !Array.isArray(errors)) { 50 | const errorMessages = Object.entries(errors) 51 | .map(([field, messages]) => { 52 | // messages 可能是字符串数组 53 | const msgList = Array.isArray(messages) ? messages : [messages] 54 | return msgList.join('、') 55 | }) 56 | .join(';') 57 | ElMessage.error(errorMessages || '请求失败') 58 | } else { 59 | // 如果是其他格式的错误信息 60 | ElMessage.error(error.response.data.message || '请求失败') 61 | } 62 | } else { 63 | ElMessage.error('请求失败') 64 | } 65 | return Promise.reject(error) 66 | } 67 | ) 68 | 69 | export default request -------------------------------------------------------------------------------- /web/src/api/types.ts: -------------------------------------------------------------------------------- 1 | export interface ApiResponse { 2 | data: T 3 | status: number 4 | message?: string 5 | } 6 | 7 | export interface PaginatedResponse { 8 | results: T[] 9 | count: number 10 | } 11 | 12 | export interface Note { 13 | id: string 14 | title: string 15 | content: string 16 | group: string | null 17 | created_at: string 18 | updated_at: string 19 | creator?: { 20 | id: string 21 | username: string 22 | name: string 23 | } 24 | group_detail?: { 25 | id: string 26 | name: string 27 | } 28 | } 29 | 30 | export interface NoteResponse { 31 | results: Note[] 32 | count: number 33 | } 34 | 35 | export interface User { 36 | id: string 37 | username: string 38 | name: string 39 | first_name: string 40 | last_name: string 41 | email: string 42 | role: string 43 | is_active: boolean 44 | last_active_at: string 45 | date_joined: string 46 | notes?: string[] 47 | note_group?: string[] 48 | statusLoading?: boolean 49 | avatar?: string 50 | } 51 | 52 | export interface Group { 53 | id: string 54 | name: string 55 | description?: string 56 | created_at: string 57 | updated_at: string 58 | note_count?: number 59 | creator?: { 60 | id: string 61 | username: string 62 | name: string 63 | } 64 | } 65 | 66 | export interface OAuthUrls { 67 | wecom_url: string | null 68 | feishu_url: string | null 69 | dingtalk_url: string | null 70 | github_url: string | null 71 | google_url: string | null 72 | gitlab_url: string | null 73 | } -------------------------------------------------------------------------------- /web/src/api/users.ts: -------------------------------------------------------------------------------- 1 | import request from './request' 2 | import type { User } from './types' 3 | 4 | export interface LoginResponse { 5 | access: string 6 | refresh: string 7 | user: User 8 | } 9 | 10 | export interface LoginParams { 11 | username: string 12 | password: string 13 | } 14 | 15 | export interface GitLabUser { 16 | id: string 17 | name: string 18 | username: string 19 | email: string 20 | avatar_url: string 21 | gitlab_id: string 22 | created_at: string 23 | updated_at: string 24 | } 25 | 26 | export interface GiteeUser { 27 | id: string 28 | name: string 29 | username: string 30 | email: string 31 | avatar_url: string 32 | gitee_id: string 33 | created_at: string 34 | updated_at: string 35 | } 36 | 37 | export const userApi = { 38 | // 用户登录 39 | login: (data: LoginParams) => { 40 | return request.post('/auth/login/', data) 41 | }, 42 | 43 | // 获取用户信息 44 | getUserInfo: () => { 45 | return request.get('/auth/me/') 46 | }, 47 | 48 | // 企业微信登录 49 | wecomLogin: (code: string) => { 50 | return request.post('/auth/wecom/login/', { code }) 51 | }, 52 | 53 | // 飞书登录 54 | feishuLogin: (code: string) => { 55 | return request.post('/auth/feishu/login/', { code }) 56 | }, 57 | 58 | // 钉钉登录 59 | dingtalkLogin: (authCode: string) => { 60 | return request.post('/auth/dingtalk/login/', { authCode }) 61 | }, 62 | 63 | // GitHub登录 64 | githubLogin: (code: string) => { 65 | return request.post('/auth/github/login/', { code }) 66 | }, 67 | 68 | // Google登录 69 | googleLogin: (code: string) => { 70 | return request.post('/auth/google/login/', { code }) 71 | }, 72 | 73 | // GitLab登录 74 | gitlabLogin: (code: string) => { 75 | return request.post('/auth/gitlab/login/', { code }) 76 | }, 77 | 78 | // Gitee登录 79 | giteeLogin: (code: string) => { 80 | return request.post('/auth/gitee/login/', { code }) 81 | }, 82 | 83 | // 获取第三方登录二维码 84 | getLoginQRCode: () => { 85 | return request.get<{ 86 | wecom_url: string | null 87 | feishu_url: string | null 88 | dingtalk_url: string | null 89 | github_url: string | null 90 | google_url: string | null 91 | gitlab_url: string | null 92 | gitee_url: string | null 93 | }>('/auth/login/qrcode/') 94 | } 95 | } 96 | -------------------------------------------------------------------------------- /web/src/assets/dingtalk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/X-Mars/beenote/0aa5f3743597a6a8345b542cc547f3a6431de647/web/src/assets/dingtalk.png -------------------------------------------------------------------------------- /web/src/assets/feishu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/X-Mars/beenote/0aa5f3743597a6a8345b542cc547f3a6431de647/web/src/assets/feishu.png -------------------------------------------------------------------------------- /web/src/assets/gitee.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/X-Mars/beenote/0aa5f3743597a6a8345b542cc547f3a6431de647/web/src/assets/gitee.png -------------------------------------------------------------------------------- /web/src/assets/github.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/X-Mars/beenote/0aa5f3743597a6a8345b542cc547f3a6431de647/web/src/assets/github.png -------------------------------------------------------------------------------- /web/src/assets/gitlab.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/X-Mars/beenote/0aa5f3743597a6a8345b542cc547f3a6431de647/web/src/assets/gitlab.png -------------------------------------------------------------------------------- /web/src/assets/google.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/X-Mars/beenote/0aa5f3743597a6a8345b542cc547f3a6431de647/web/src/assets/google.png -------------------------------------------------------------------------------- /web/src/assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/X-Mars/beenote/0aa5f3743597a6a8345b542cc547f3a6431de647/web/src/assets/logo.png -------------------------------------------------------------------------------- /web/src/assets/main.css: -------------------------------------------------------------------------------- 1 | html, 2 | body { 3 | margin: 0; 4 | padding: 0; 5 | height: 100%; 6 | font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 7 | 'Noto Sans', sans-serif; 8 | } 9 | 10 | #app { 11 | height: 100%; 12 | } 13 | 14 | .el-table { 15 | --el-table-border-color: var(--el-border-color-lighter); 16 | --el-table-border: 1px solid var(--el-table-border-color); 17 | border: var(--el-table-border); 18 | border-radius: 4px; 19 | } 20 | 21 | :root { 22 | --primary-gradient: linear-gradient(to right, #409EFF, #36D1DC); 23 | } 24 | 25 | .el-button--primary { 26 | background: var(--primary-gradient) !important; 27 | border: none; 28 | } 29 | 30 | .el-menu { 31 | border-right: none !important; 32 | } 33 | 34 | .el-card { 35 | border: none; 36 | border-radius: 8px; 37 | box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.05) !important; 38 | } 39 | 40 | .el-input__wrapper, 41 | .el-select .el-input__wrapper { 42 | box-shadow: 0 0 0 1px #dcdfe6 inset !important; 43 | } 44 | 45 | .el-input__wrapper:hover, 46 | .el-select .el-input__wrapper:hover { 47 | box-shadow: 0 0 0 1px var(--el-color-primary) inset !important; 48 | } 49 | 50 | .el-button { 51 | border-radius: 4px; 52 | } 53 | 54 | .el-dialog { 55 | border-radius: 8px; 56 | } 57 | 58 | .el-dialog__header { 59 | margin-right: 0; 60 | border-bottom: 1px solid var(--el-border-color-lighter); 61 | padding: 20px; 62 | } 63 | 64 | .el-dialog__body { 65 | padding: 20px; 66 | } 67 | 68 | .el-dialog__footer { 69 | border-top: 1px solid var(--el-border-color-lighter); 70 | padding: 20px; 71 | } -------------------------------------------------------------------------------- /web/src/assets/qq.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/X-Mars/beenote/0aa5f3743597a6a8345b542cc547f3a6431de647/web/src/assets/qq.png -------------------------------------------------------------------------------- /web/src/assets/wecom.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/X-Mars/beenote/0aa5f3743597a6a8345b542cc547f3a6431de647/web/src/assets/wecom.png -------------------------------------------------------------------------------- /web/src/components/BaseChart.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | -------------------------------------------------------------------------------- /web/src/main.ts: -------------------------------------------------------------------------------- 1 | import { createApp } from 'vue' 2 | import App from './App.vue' 3 | import router from './router' 4 | import { createPinia } from 'pinia' 5 | import ElementPlus from 'element-plus' 6 | import zhCn from 'element-plus/dist/locale/zh-cn.mjs' 7 | import 'element-plus/dist/index.css' 8 | import './assets/main.css' 9 | import * as ElementPlusIconsVue from '@element-plus/icons-vue' 10 | import BaseChart from '@/components/BaseChart.vue' 11 | 12 | const app = createApp(App) 13 | 14 | // 注册所有图标 15 | for (const [key, component] of Object.entries(ElementPlusIconsVue)) { 16 | app.component(key, component) 17 | } 18 | 19 | app.component('base-chart', BaseChart) 20 | 21 | app.use(createPinia()) 22 | app.use(router) 23 | app.use(ElementPlus, { 24 | locale: zhCn, 25 | }) 26 | 27 | app.mount('#app') -------------------------------------------------------------------------------- /web/src/types/index.ts: -------------------------------------------------------------------------------- 1 | export interface User { 2 | id: number 3 | username: string 4 | email: string 5 | role: string 6 | name: string 7 | } -------------------------------------------------------------------------------- /web/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "@vue/tsconfig/tsconfig.dom.json", 3 | "include": ["env.d.ts", "src/**/*", "src/**/*.vue"], 4 | "compilerOptions": { 5 | "baseUrl": ".", 6 | "paths": { 7 | "@/*": ["./src/*"] 8 | }, 9 | "types": ["element-plus/global"] 10 | }, 11 | "references": [ 12 | { 13 | "path": "./tsconfig.node.json" 14 | } 15 | ] 16 | } -------------------------------------------------------------------------------- /web/tsconfig.node.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "@tsconfig/node18/tsconfig.json", 3 | "include": [ 4 | "vite.config.*", 5 | "vitest.config.*", 6 | "cypress.config.*", 7 | "nightwatch.config.*", 8 | "playwright.config.*" 9 | ], 10 | "compilerOptions": { 11 | "composite": true, 12 | "module": "ESNext", 13 | "moduleResolution": "Bundler", 14 | "types": ["node"] 15 | } 16 | } -------------------------------------------------------------------------------- /web/vite.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vite' 2 | import vue from '@vitejs/plugin-vue' 3 | import path from 'path' 4 | 5 | export default defineConfig({ 6 | plugins: [vue()], 7 | resolve: { 8 | alias: { 9 | '@': path.resolve(__dirname, 'src'), 10 | }, 11 | }, 12 | server: { 13 | proxy: { 14 | '/api': { 15 | target: 'http://localhost:8000', 16 | changeOrigin: true, 17 | }, 18 | }, 19 | }, 20 | optimizeDeps: { 21 | include: ['vue-router'] 22 | } 23 | }) --------------------------------------------------------------------------------