From 42f1d1012f556f767375fdb37c7ec9b475a8e662 Mon Sep 17 00:00:00 2001 From: piecka Date: Fri, 21 Mar 2025 11:19:20 +0100 Subject: [PATCH] batman --- app/__init__.py | 22 +++++ app/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1223 bytes app/__pycache__/config.cpython-312.pyc | Bin 0 -> 781 bytes app/config.py | 7 ++ app/routes/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 160 bytes app/routes/__pycache__/main.cpython-312.pyc | Bin 0 -> 2685 bytes app/routes/main.py | 47 +++++++++ app/templates/index.html | 91 ++++++++++++++++++ app/templates/upload.html | 39 ++++++++ app/templates/viewer.html | 69 +++++++++++++ app/utils/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 159 bytes .../__pycache__/file_handler.cpython-312.pyc | Bin 0 -> 3203 bytes app/utils/file_handler.py | 67 +++++++++++++ run.py | 7 ++ uploads/docker.md | 44 +++++++++ uploads/uri_map.json | 6 ++ 18 files changed, 399 insertions(+) create mode 100644 app/__init__.py create mode 100644 app/__pycache__/__init__.cpython-312.pyc create mode 100644 app/__pycache__/config.cpython-312.pyc create mode 100644 app/config.py create mode 100644 app/routes/__init__.py create mode 100644 app/routes/__pycache__/__init__.cpython-312.pyc create mode 100644 app/routes/__pycache__/main.cpython-312.pyc create mode 100644 app/routes/main.py create mode 100644 app/templates/index.html create mode 100644 app/templates/upload.html create mode 100644 app/templates/viewer.html create mode 100644 app/utils/__init__.py create mode 100644 app/utils/__pycache__/__init__.cpython-312.pyc create mode 100644 app/utils/__pycache__/file_handler.cpython-312.pyc create mode 100644 app/utils/file_handler.py create mode 100644 run.py create mode 100644 uploads/docker.md create mode 100644 uploads/uri_map.json diff --git a/app/__init__.py b/app/__init__.py new file mode 100644 index 0000000..56c48f2 --- /dev/null +++ b/app/__init__.py @@ -0,0 +1,22 @@ +from flask import Flask +import os +from app.config import Config + +def create_app(config_class=Config): + app = Flask(__name__) + app.config.from_object(config_class) + + # Ensure upload directory exists + os.makedirs(app.config['UPLOAD_FOLDER'], exist_ok=True) + + # Create empty URI map file if it doesn't exist + uri_map_path = os.path.join(app.config['UPLOAD_FOLDER'], 'uri_map.json') + if not os.path.exists(uri_map_path): + with open(uri_map_path, 'w') as f: + f.write('{}') + + # Register blueprints + from app.routes.main import main_bp + app.register_blueprint(main_bp) + + return app diff --git a/app/__pycache__/__init__.cpython-312.pyc b/app/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..91f91898d9464c0658f97f7955998ec8b9985bfa GIT binary patch literal 1223 zcmah|OK1~87@pZjlICHoPmGGC6>U%wJV*pfMOqbVec%h)gTppEsk_NOnB5Ys3A7?e zQD_T7deoDO9z1&1qh3lYma&C`CvSyTgr59&+i3(vCuIKDe&7GkKmUA8rQ!&dduVC+ zfrQYvzz_@UaINM*G?0#TTtOBd#5mBUiZm#Jlq<5O3@R8=rG$0mAs$rkNm=!K0L@~q zp08+L`7&sc9>*>j!$lmDZfp?{GW=IRfwzJDt(Y&8qt~0hI<8?;`3<|Nn$bUfwJj7z zev62k;ZcRPA^*;)<9!g;r8n~H%{qW5CXi-QXiaIRo4U~c$*l9YlHA!^E zJL2yY{+gt#g7qY-%Qe~DEn-cnM+7#!Mz~6W0XwS4DhVrDhwFsu_cu{Ot0_%%4PQqc z=mhd`Rl;ZhVfa01zbg-*D$cfC=Bb-k`>&ksCFig7_ny0U14bZ5?;4&@obqULgc-!r z+??q-HpkUb>3*FBy@s!%mS)&w$jxqJ!EEptA+}~wLU^PYju20jm}3!V$fQM|OOD55 zmR6>^!91?Gntz8YreoMV5~c&6<5HWeRc8260faIcZ66V3B5bmkK(H5-rQ~5iNMf0vv*77cMf(pHSDR={U zOJil-soJ*;TBR%xY&_5DmkFvP5T!NYiebVpA{{*Y07I-=PKSHrW1 z7s*l(=JBBa8+~QLa}Lk?3ax^QSO&KBSeNDKBNf`s+Q1B+zqbdr6&Yi^g!X<#ElcR& P@`3g>)QZ#W5QKgK-^T(t literal 0 HcmV?d00001 diff --git a/app/__pycache__/config.cpython-312.pyc b/app/__pycache__/config.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ab37d0f5542049f80944435b5b933efac9e56326 GIT binary patch literal 781 zcmbtSzi-n(6uxtuAEZe|(lmh%35-EXEfyw(R1!C+b(5;NK)sx-+$C}1*v3v;g(*Y- zflOZ8sX|@o)Rhs51(YQ^!~zR!hzv-bIL8U96m{Ya-+k}h_ukXJdmrQRC}8$2`?WD) z=XcMU8$TnHdyKdM0}OSb01lJ^=8gdloO8ZHfqj_ge|k=(=7)R?&z#8*MqEIE0x?iH z5@X1UMsTvJJ!#ztkRqV(bs|_ppWg0=qP&))6 z8bzpM;-2pD7(%amsy@5nOoxVvaj4m*K?4oawSz33@|N0dQodzs1`T7)_S9azx;Cv5 z-`|z08zr<^l}h3s4VJ{G`(>Kk*?5JD)ru@uWF(1|vi$5V@Rk8wJrbH`hX|I|Rt3v8 zTcp-?gu1ReZK0#uZEPMHFEnyQY(cdwp*DT=y4AP6&6z@g5oeddF&HOS+_mAFn;m9P zVxQK_J@N}>g8Z( z9J@Ub$9MCe`Lw+{Z;|J0Z-xDyDUVIB(u`e29{clqVrQ7^{hpI#@GAfz`~q(M;d%Jr JH()T$`3vTksRRH3 literal 0 HcmV?d00001 diff --git a/app/config.py b/app/config.py new file mode 100644 index 0000000..a99b055 --- /dev/null +++ b/app/config.py @@ -0,0 +1,7 @@ +import os + +class Config: + SECRET_KEY = os.environ.get('SECRET_KEY', 'dev-key-please-change') + UPLOAD_FOLDER = os.path.join(os.path.dirname(os.path.dirname(__file__)), 'uploads') + DEBUG = True + MAX_CONTENT_LENGTH = 16 * 1024 * 1024 diff --git a/app/routes/__init__.py b/app/routes/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/app/routes/__pycache__/__init__.cpython-312.pyc b/app/routes/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..eaef9c78a71eb158b4257e720ccc01b343f31eeb GIT binary patch literal 160 zcmX@j%ge<81RSz=(?RrO5P=Rpvj9b=GgLBYGWxA#C}INgK7-W!ve(bZ&rQ`Y$jnaE zFDS~-N=+^))=$exEY8-?O)Sbz$uG|f%SJmtkIamWj77{q763PMC!zoV literal 0 HcmV?d00001 diff --git a/app/routes/__pycache__/main.cpython-312.pyc b/app/routes/__pycache__/main.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6e44ff9e8232dd92b8f484c3baee5c3af6e71038 GIT binary patch literal 2685 zcmbVNUrZE77@yhQ`@08saEL`gu^iSThD)nPTLq)lQng?cs7)@VoAY*sgWcQf?4Fd% zox!B3n3{lziDzOej~ICH(Z1QYHa?W|NFZApHRYvm7)+Demwq#Qizn(!C)wGV`M&w) z`}6z0?_o`iAHk@7?~kDyZiN1%8)vvGi}k-@aTCc%#wyZq9BW*h)A%^A32{Ml#a)^^ z?$$hUkLHbgG3Db_U)%?OUiE8YT+{;bfL0T)(Q4zh7;#9!vY-U#I9q-^q=ZJ=oJU{& zWtZ$8!t)-7PxgL?<|^cP{afz%WVh@e;;L?mRky-#xfPhhwqUuYio0Q)i`M={2~n@* zJFaGx3`wO;D@c^ItPsgmw2YcC70W}EZ?cMET4FLwfM`mIOvdsOMNSbVXA^Hf!#E8)tjK&;) zpGzrY3W-77VnolHiUE{Vx-&Blk5OgFb`VBgX`F;<0zG%5;PxNV6Ftkl1HTRaI`~jp z3Jw13d%!;!D28Vvv$;~oN9DT13!%Y@Q>D=0iny(Kb}MX_0o^^ z$B;YciDff1vX=1q+5Ul7!Usudhi^Z)9l{4&dyG`l$Jx`rj7Rq%ME;ezDn9ClP2(aa z5tCZOhRi$g$H??Kr&SVIiEz&CzjLF%TBA3-By$uX3}S&-CD5HLFnz0aaXFIzk1lyc z2!QzwFO3A>@VeW1i+ovSZRmB*k?`whvPa$k_6UXErs1Sd0h?PLQXb_ofy7B;897P8 z(uphZRi39VV?*}lxp|+%>1Yc+e;GT!a|-^V7`5+-&S^i22Kq=doLU0SwOpW2Z>5XY zOadwq%7vW0p{S4-ik#y+HQDkfvxcc_wAAEkSt?wF3}Lk>idm-RcAibE5tF`-6l zf+(#CRn^BpkZ6P2&f{7_;cmI@5(Om?bT9}-7NN$_>{nU#TVANH##qW6290&1Sv(X$ z%Vn4(l_4VK_tJ@CEh>;5blplP8UiL@Bk##JII=2QFx3fU2cjj!D8V#=Rz0;>E?vG< zY<%R|xh&S*-g>9yR!d3Ty%MOK?pzG)S_yBz-E-&6tuy8Do`t}k)nMaP;cB6Ht`v++ z3Qxq~RM*w6;_*k~4!E#TA6X2vZ@TeR3{Ic8*?YZrsiC9P&@p>pvEludrq(;nx0;ul zqNS$j?B4rax#{py)3H+1v2xSLlc!gj+h^pTI_{qSB~orad$o7+0Y`)!NO z-R1Dng}~8O`r^LD!2VSzEnQ_Xx*$Z?!6=jyV>DE;BM`doKnHy8BW$Kp#uUB+TKQ zNVQZ5LkEi+RQCqBW_gl&+Jth?A_^gfmV*c_ON8dN9eCa@_CAUtiB^0oK)Z!hxoS`Y zpz_-Y@NGbs#Na#vpK%-}h<|A33||gKCQdyS8&Ylr_`(QbIXyP+k zxx1Fz_RhvjZHJcM?Ofim>$!&yw5=iD)kdNqCc4FL=%a+b%JgGcC)D2z+%{sF2^8=a zryEuyw3^PWnNp2TX2ftJEvpK#5zY){cC&uxl_c6DB?&q_bS3G0#&WSP#kvv$HM8t4 zVhS;') +def view_file(uri): + file_info = get_file_by_uri(uri) + + if not file_info: + abort(404) + + html_content = read_markdown_file(file_info['path']) + return render_template('viewer.html', + filename=file_info['filename'], + content=html_content, + uri=uri) diff --git a/app/templates/index.html b/app/templates/index.html new file mode 100644 index 0000000..804407a --- /dev/null +++ b/app/templates/index.html @@ -0,0 +1,91 @@ + + + + Markdown Viewer + + + + +

Markdown Viewer

+ + + + {% if documents %} +
+

Available Documents

+ + {% for doc in documents %} +
+
+ + {{ doc.filename }} + + URI: {{ doc.uri }} +
+
+ View + +
+
+ {% endfor %} +
+ {% else %} +
+

No documents available

+

Upload a markdown file to get started!

+ Upload Now +
+ {% endif %} + + + + diff --git a/app/templates/upload.html b/app/templates/upload.html new file mode 100644 index 0000000..a7a9266 --- /dev/null +++ b/app/templates/upload.html @@ -0,0 +1,39 @@ + + + + Upload Markdown File + + + +

Upload Markdown File

+ + {% with messages = get_flashed_messages() %} + {% if messages %} +
+ {% for message in messages %} +

{{ message }}

+ {% endfor %} +
+ {% endif %} + {% endwith %} + +
+
+ + +
+ +
+ + + Leave blank for an auto-generated URI +
+ +
+ +
+
+ + Back to Home + + diff --git a/app/templates/viewer.html b/app/templates/viewer.html new file mode 100644 index 0000000..e27ab93 --- /dev/null +++ b/app/templates/viewer.html @@ -0,0 +1,69 @@ + + + + {{ filename }} - Markdown Viewer + + + + + + +
+

{{ filename }}

+

+ Permanent Link: + {{ url_for('main.view_file', uri=uri, _external=True) }} +

+
+ +
+ {{ content|safe }} +
+ + + + diff --git a/app/utils/__init__.py b/app/utils/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/app/utils/__pycache__/__init__.cpython-312.pyc b/app/utils/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2fc94db1b4ccad6ec5a8a761f65b6881cdc2d952 GIT binary patch literal 159 zcmX@j%ge<81je#=(?RrO5P=Rpvj9b=GgLBYGWxA#C}INgK7-W!veVDV&rQ`Y$jnaE zFDS~-N=+^))=$exEY8-?O)Sbz$uG|f%SI%kB`sH%PfhH*DI*} g#bJ}1pHiBWYFESxG>#F7i$RQ!%#4hTMa)1J03T2%TL1t6 literal 0 HcmV?d00001 diff --git a/app/utils/__pycache__/file_handler.cpython-312.pyc b/app/utils/__pycache__/file_handler.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..657989436b12bc356ba317e58a8b6cc6af32145d GIT binary patch literal 3203 zcmaJ@TWB2D89rw&d%wuG?3EJP9#z5FRceVqidH~3=9}4nTDQ{9lzGli_KmNhm~ zoppNhnw4qoox%NB43@^Lnm>Z9LH-+#E}dIEw=}jmc0c^6Z+N|L_`!SYedquA`;G9# znl!;8FzgWKh#1HGd#C{B6bhamw#s>8wb3sjLtUu^8rPj{^02iId&>%Xy*B8chy72< zJhj4JPYI9Jm2B#*F)gV4^X5`AMT+nbk++FS>jEV=2!#)2x5XQzPJ!1`6Gm2jnM`I> zTt+FIO!+x{3@^YCM8~JyE}9l_X;d{GxCC|`sSFFH1SbG|bIcu@GZ7I*VNskE!2upC zECC|Cjrj>=KuG-bMtrbwdD|bnTVJT(y|Zv#Eyc*W#$;v97(NJsz89hrTFXwNDnh$!X9k~PC<7s4mk%IFc6Gx z#!hX-l+~e);2A($PCgji4n&rMi^1hLSKeOz^xuIu0dhIHk9~li~0|;d^o6}MPI|-v45imOh)v5Uq39aT5y$|s*lT~%8<)01vF+ILN3o&x*wE_uM(j*e+zQ8*^XuW0TgOf` zKiu(?aNKn$Z3hAKCHOf$F}PzVKK3i!cpC{o08!9`R$Cq0h>HK;v6s*+x{}p)DJArg zUC9jvb~_ZzOK`d)U4x)$OWye?u}~X%YM)EC1zS>u`+_ao;u!Q<$6G^)Eg#IZMO(-T zJlu@6&7oFBzoDs|Q!ntiLLj@WYQVRyDp}Jk=5?SRlz?&O!4;tzVD#i(D-~vlIXi)3ej|RiarwEA^bai#Zzj)gBrh~BV)xOd`eJ>_ zUbOH3`q9A1`oPG8&(;Ut`?hZ*{$bAaQt;t$EUpmTRnZxWwF=S zxYWG3F!4ix$VZkFn^ON%P|HB`!kX0Qs$-{DMAhW#I1H6eb!?Le258e;gvn@%Xa-XR zUNFL3FTM=$dP-5x8OqIBqyU~Y96vBH#E4tjAp?tJh{jo&o3k9xvoH)jk%=H47?(fP z%rD&8il10E7wxsc>sy{Jbsioe=Z9Z~O6TD*ly*9045v0N;n=R!zNTuHYK+Ba?t$@WG!bOm^*V-gP@CQ3vVCLGz(r)?$f5N<(Gf+(FE&( zL(a)HD|hy1;Q9laK5eM*)^dDS_GVc#op26BnwkNz1_MIcZA;V5qM@6U;P@~;I1+=c zFetn0L)buqd2Db(6`ZQW9LtFmtV-EynP@1e!mb7%#Wmm^=PtonV@TDz@SE2lR0?dXi$Ac-#yZqBapqb)L2I(`)v#v1xUe&rW|v5KMA%G$f^=O9B}GtWb|BT`Bq zli*_#e@tRe$jK*U_%R9ZN&@|e?go4`w%a4p Hier wird zumindest einer benötigt, um SSL-Verschlüsselung und HTTPS auf den Websites zu aktivieren +> Caddy ist zwar an sich einfacher, weil es nur eine einzige config datei hat, aber zum lernen würde ich den +> nginxproxymanager empfehlen, da er eine kleine webui hat und man das konzept so gut lernen und verstehen kann + +- [Nginx Reverseproxy-Manager](https://nginxproxymanager.com/guide/) +- [Caddy](https://hub.docker.com/_/caddy/) + +## **Dashboards:** + +> Pick whatever you like. Homepage wird in einer config datei (yml) konfiguriert. Daher würde ich Dashy oder Flame +> eher für den Anfang empfehlen + +- [Dashy](https://github.com/Lissy93/dashy) +- [Flame](https://github.com/pawelmalak/flame) +- [Homepage](https://gethomepage.dev/) + +## **Document-Management:** + +> filebrowser und mydrive sind zwei sehr einfache file share services, die mit einer schönen kleinen weboberfläche kommen +> Nextcloud ist etwas mächtiger, zwar auch deutlich hübscher und mit Android/iOS app etc. Aber eben auch etwas komplexer. Ist aber machbar. +> PaperlessNGX ist ein Dokumentenspeichersystem, hauptsächlich für pdf dateien. Ich lasse mir dort täglich und regelmäßig aus meinen +> Mailpostfächern die .pdf dateien die als Rechnung deklariert sind automatisch in mein system einspielen. Automatisierungstechnisch ein Traum! + +- [filebrowser](https://github.com/hurlenko/filebrowser-docker) +- [my-drive](https://github.com/subnub/myDrive) +- [nextcloud](https://hub.docker.com/_/nextcloud) +- [PaperlessNGX](https://docs.paperless-ngx.com/setup/#docker) +- [Immich](https://immich.app/docs/install/docker-compose) <- google photos clone, für zuhause! (Bessere Suchfunktion, Personenerkennung, Geodaten auf einer Map...) + +## **Sonstige** + +- [Bitwarden](https://github.com/dani-garcia/vaultwarden) <- das ist vaultwarden. Bitwarden + ohne zu Zahlen ^^ + +- [Excalidraw](https://hub.docker.com/r/excalidraw/excalidraw) +- [PDF-Tools](https://github.com/Stirling-Tools/Stirling-PDF) +- [IT-Tools](https://github.com/CorentinTh/it-tools) diff --git a/uploads/uri_map.json b/uploads/uri_map.json new file mode 100644 index 0000000..0283a4c --- /dev/null +++ b/uploads/uri_map.json @@ -0,0 +1,6 @@ +{ + "docker": { + "filename": "docker.md", + "path": "/home/pika/projects/flask/markdownViewer/uploads/docker.md" + } +} \ No newline at end of file