ginipick commited on
Commit
1d8d0e6
ยท
verified ยท
1 Parent(s): a1b6da8

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +77 -202
app.py CHANGED
@@ -884,16 +884,10 @@ HTML = """
884
 
885
  <section id="home" class="fade-in">
886
  <div class="upload-container">
887
-
888
- <button class="upload" id="imageUploadBtn" onclick="document.getElementById('imgInput').click(); return false;">
889
- <i class="fas fa-images"></i> ์ด๋ฏธ์ง€ ์ถ”๊ฐ€
890
- <input id="imgInput" type="file" accept="image/*" multiple hidden>
891
- </button>
892
- <button class="upload" id="pdfUploadBtn" onclick="document.getElementById('pdfInput').click(); return false;">
893
- <i class="fas fa-file-pdf"></i> PDF ์ถ”๊ฐ€
894
- <input id="pdfInput" type="file" accept="application/pdf" hidden>
895
-
896
  </button>
 
897
  </div>
898
 
899
  <div class="section-title">๋‚ด ํ”„๋กœ์ ํŠธ</div>
@@ -901,7 +895,7 @@ HTML = """
901
  <!-- ์นด๋“œ๊ฐ€ ์—ฌ๊ธฐ์— ๋™์ ์œผ๋กœ ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค -->
902
  </div>
903
  <div id="noProjects" class="no-projects" style="display: none;">
904
- ํ”„๋กœ์ ํŠธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ด๋ฏธ์ง€๋‚˜ PDF๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์‹œ์ž‘ํ•˜์„ธ์š”.
905
  </div>
906
  </section>
907
 
@@ -912,7 +906,7 @@ HTML = """
912
 
913
  <script>
914
  let projects=[], fb=null;
915
- const grid=$id('grid'), viewer=$id('viewer');
916
  pdfjsLib.GlobalWorkerOptions.workerSrc='/static/pdf.worker.js';
917
 
918
  // ์„œ๋ฒ„์—์„œ ๋ฏธ๋ฆฌ ๋กœ๋“œ๋œ PDF ํ”„๋กœ์ ํŠธ
@@ -929,135 +923,86 @@ HTML = """
929
  {once:true,capture:true});
930
  });
931
 
932
- // ์—…๋กœ๋“œ ๋ฒ„ํŠผ ์ด๋ฒคํŠธ ์—ฐ๊ฒฐ ํ•จ์ˆ˜
933
- function setupUploadButtons() {
934
- // ๋ชจ๋“  ์—…๋กœ๋“œ ๋ฒ„ํŠผ์— ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ์ถ”๊ฐ€
935
- document.querySelectorAll('.upload').forEach(button => {
936
- button.addEventListener('click', function(e) {
937
- // ๋ฒ„ํŠผ ๋‚ด๋ถ€์˜ input ์š”์†Œ ์ฐพ๊ธฐ
938
- const inputElement = this.querySelector('input[type="file"]');
939
- if (inputElement) {
940
- // input ์š”์†Œ ํด๋ฆญ (ํŒŒ์ผ ์„ ํƒ ๋‹ค์ด์–ผ๋กœ๊ทธ ์—ด๊ธฐ)
941
- inputElement.click();
942
- e.preventDefault(); // ๋ฒ„ํŠผ ๊ธฐ๋ณธ ๋™์ž‘ ๋ฐฉ์ง€
943
- }
944
- });
945
- });
946
- }
947
-
948
  /* โ”€โ”€ ์œ ํ‹ธ โ”€โ”€ */
949
  function $id(id){return document.getElementById(id)}
950
 
951
- // ์ง์ ‘ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ์„ค์ • (๋” ํ™•์‹คํ•œ ๋ฐฉ๋ฒ•)
952
- // ์ˆ˜์ •๋œ ์ด๋ฒคํŠธ ์„ค์ • ํ•จ์ˆ˜
953
- function setupDirectEvents() {
954
- console.log('์ด๋ฒคํŠธ ์„ค์ • ์‹œ์ž‘');
955
-
956
- // ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ ๋ฒ„ํŠผ
957
- const imageBtn = document.getElementById('imageUploadBtn');
958
- const imageInput = document.getElementById('imgInput');
959
-
960
- if (imageBtn && imageInput) {
961
- console.log('์ด๋ฏธ์ง€ ๋ฒ„ํŠผ ์ฐพ์Œ:', imageBtn);
962
- // ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ œ๊ฑฐํ•˜๊ณ  ๋‹ค์‹œ ์ถ”๊ฐ€
963
- imageBtn.removeEventListener('click', imageClickHandler);
964
- imageBtn.addEventListener('click', imageClickHandler);
965
-
966
- function imageClickHandler(e) {
967
- console.log('์ด๋ฏธ์ง€ ๋ฒ„ํŠผ ํด๋ฆญ๋จ');
968
- e.preventDefault();
969
- e.stopPropagation();
970
- imageInput.click();
971
- }
972
- } else {
973
- console.error('์ด๋ฏธ์ง€ ๋ฒ„ํŠผ ๋˜๋Š” ์ธํ’‹์„ ์ฐพ์„ ์ˆ˜ ์—†์Œ');
974
- }
975
-
976
- // PDF ์—…๋กœ๋“œ ๋ฒ„ํŠผ
977
- const pdfBtn = document.getElementById('pdfUploadBtn');
978
- const pdfInput = document.getElementById('pdfInput');
979
-
980
- if (pdfBtn && pdfInput) {
981
- console.log('PDF ๋ฒ„ํŠผ ์ฐพ์Œ:', pdfBtn);
982
- // ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ œ๊ฑฐํ•˜๊ณ  ๋‹ค์‹œ ์ถ”๊ฐ€
983
- pdfBtn.removeEventListener('click', pdfClickHandler);
984
- pdfBtn.addEventListener('click', pdfClickHandler);
985
-
986
- function pdfClickHandler(e) {
987
- console.log('PDF ๋ฒ„ํŠผ ํด๋ฆญ๋จ');
988
- e.preventDefault();
989
- e.stopPropagation();
990
- pdfInput.click();
991
- }
992
- } else {
993
- console.error('PDF ๋ฒ„ํŠผ ๋˜๋Š” ์ธํ’‹์„ ์ฐพ์„ ์ˆ˜ ์—†์Œ');
994
- }
995
-
996
- // ํŒŒ์ผ ์„ ํƒ ์ด๋ฒคํŠธ ์žฌ์„ค์ •
997
- if (imageInput) {
998
- imageInput.onchange = function(e) {
999
- console.log('์ด๋ฏธ์ง€ ํŒŒ์ผ ์„ ํƒ๋จ:', e.target.files.length);
1000
- const files = [...e.target.files];
1001
- if (!files.length) return;
1002
 
1003
- showLoading("์ด๋ฏธ์ง€ ๋กœ๋”ฉ ์ค‘...");
 
 
1004
 
1005
- const pages = [], tot = files.length;
1006
- let done = 0;
1007
-
1008
- files.forEach((f, i) => {
1009
- const r = new FileReader();
1010
- r.onload = x => {
1011
- pages[i] = {src: x.target.result, thumb: x.target.result};
1012
- if (++done === tot) {
1013
- save(pages, '์ด๋ฏธ์ง€ ์ปฌ๋ ‰์…˜');
1014
- hideLoading();
1015
- }
1016
- };
1017
- r.readAsDataURL(f);
1018
- });
1019
- };
1020
- }
1021
-
1022
- if (pdfInput) {
1023
- pdfInput.onchange = function(e) {
1024
- console.log('PDF ํŒŒ์ผ ์„ ํƒ๋จ:', e.target.files.length);
1025
- const file = e.target.files[0];
1026
- if (!file) return;
1027
-
1028
- showLoading("PDF ๋กœ๋”ฉ ์ค‘...");
1029
-
1030
- const fr = new FileReader();
1031
- fr.onload = v => {
1032
- pdfjsLib.getDocument({data: v.target.result}).promise.then(async pdf => {
1033
- const pages = [];
1034
 
1035
- for (let p = 1; p <= pdf.numPages; p++) {
1036
- updateLoading(`PDF ํŽ˜์ด์ง€ ๋กœ๋”ฉ ์ค‘... (${p}/${pdf.numPages})`);
1037
-
1038
- const pg = await pdf.getPage(p);
1039
- const vp = pg.getViewport({scale: 1});
1040
- const c = document.createElement('canvas');
1041
- c.width = vp.width;
1042
- c.height = vp.height;
1043
- await pg.render({canvasContext: c.getContext('2d'), viewport: vp}).promise;
1044
- pages.push({src: c.toDataURL(), thumb: c.toDataURL()});
1045
- }
1046
 
1047
- hideLoading();
1048
- save(pages, file.name.replace('.pdf', ''));
1049
- }).catch(error => {
1050
- console.error("PDF ๋กœ๋”ฉ ์˜ค๋ฅ˜:", error);
1051
- hideLoading();
1052
- showError("PDF ๋กœ๋”ฉ ์ค‘ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.");
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1053
  });
1054
- };
1055
- fr.readAsArrayBuffer(file);
1056
- };
1057
- }
1058
-
1059
- console.log('์ด๋ฒคํŠธ ์„ค์ • ์™„๋ฃŒ');
1060
- }
 
 
 
1061
 
1062
  function addCard(i, thumb, title, isCached = false) {
1063
  const d = document.createElement('div');
@@ -1086,54 +1031,6 @@ function setupDirectEvents() {
1086
  $id('noProjects').style.display = 'none';
1087
  }
1088
 
1089
- /* โ”€โ”€ ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ โ”€โ”€ */
1090
- $id('imgInput').onchange=e=>{
1091
- const files=[...e.target.files]; if(!files.length) return;
1092
-
1093
- // ๋กœ๋”ฉ ํ‘œ์‹œ ์ถ”๊ฐ€
1094
- showLoading("์ด๋ฏธ์ง€ ๋กœ๋”ฉ ์ค‘...");
1095
-
1096
- const pages=[],tot=files.length;let done=0;
1097
- files.forEach((f,i)=>{const r=new FileReader();r.onload=x=>{pages[i]={src:x.target.result,thumb:x.target.result};
1098
- if(++done===tot) {
1099
- save(pages, '์ด๋ฏธ์ง€ ์ปฌ๋ ‰์…˜');
1100
- hideLoading();
1101
- }
1102
- };r.readAsDataURL(f);});
1103
- };
1104
-
1105
- /* โ”€โ”€ PDF ์—…๋กœ๋“œ โ”€โ”€ */
1106
- $id('pdfInput').onchange=e=>{
1107
- const file=e.target.files[0]; if(!file) return;
1108
-
1109
- // ๋กœ๋”ฉ ํ‘œ์‹œ ์ถ”๊ฐ€
1110
- showLoading("PDF ๋กœ๋”ฉ ์ค‘...");
1111
-
1112
- const fr=new FileReader();
1113
- fr.onload=v=>{
1114
- pdfjsLib.getDocument({data:v.target.result}).promise.then(async pdf=>{
1115
- const pages=[];
1116
-
1117
- for(let p=1;p<=pdf.numPages;p++){
1118
- // ๋กœ๋”ฉ ์ƒํƒœ ์—…๋ฐ์ดํŠธ
1119
- updateLoading(`PDF ํŽ˜์ด์ง€ ๋กœ๋”ฉ ์ค‘... (${p}/${pdf.numPages})`);
1120
-
1121
- const pg=await pdf.getPage(p), vp=pg.getViewport({scale:1});
1122
- const c=document.createElement('canvas');c.width=vp.width;c.height=vp.height;
1123
- await pg.render({canvasContext:c.getContext('2d'),viewport:vp}).promise;
1124
- pages.push({src:c.toDataURL(),thumb:c.toDataURL()});
1125
- }
1126
-
1127
- hideLoading();
1128
- save(pages, file.name.replace('.pdf', ''));
1129
- }).catch(error => {
1130
- console.error("PDF ๋กœ๋”ฉ ์˜ค๋ฅ˜:", error);
1131
- hideLoading();
1132
- showError("PDF ๋กœ๋”ฉ ์ค‘ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.");
1133
- });
1134
- };fr.readAsArrayBuffer(file);
1135
- };
1136
-
1137
  /* โ”€โ”€ ํ”„๋กœ์ ํŠธ ์ €์žฅ โ”€โ”€ */
1138
  function save(pages, title, isCached = false){
1139
  const id=projects.push(pages)-1;
@@ -1727,28 +1624,6 @@ function setupDirectEvents() {
1727
  }
1728
  }, 5000);
1729
  }
1730
-
1731
-
1732
- // ํŽ˜์ด์ง€ ๋กœ๋“œ ์‹œ ์„œ๋ฒ„ PDF ๋กœ๋“œ
1733
- window.addEventListener('DOMContentLoaded', () => {
1734
- console.log('DOM ๋กœ๋“œ๋จ');
1735
-
1736
- // ์ง์ ‘ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ์„ค์ • (๋” ํ™•์‹คํ•œ ๋ฐฉ๋ฒ•)
1737
- setupDirectEvents();
1738
-
1739
- // ์•ฝ๊ฐ„์˜ ์ง€์—ฐ ํ›„ ๋‹ค์‹œ ํ•œ๋ฒˆ ์ด๋ฒคํŠธ ์„ค์ • (DOM ์™„์ „ ๋กœ๋“œ ๋ณด์žฅ)
1740
- setTimeout(() => {
1741
- console.log('์ง€์—ฐ ํ›„ ์ด๋ฒคํŠธ ์žฌ์„ค์ •');
1742
- setupDirectEvents();
1743
- }, 500);
1744
-
1745
- loadServerPDFs();
1746
-
1747
- // ์บ์‹œ ์ƒํƒœ๋ฅผ ์ฃผ๊ธฐ์ ์œผ๋กœ ํ™•์ธ (3์ดˆ๋งˆ๋‹ค)
1748
- setInterval(checkCacheStatus, 3000);
1749
- });
1750
-
1751
-
1752
  </script>
1753
  </body>
1754
  </html>
 
884
 
885
  <section id="home" class="fade-in">
886
  <div class="upload-container">
887
+ <button class="upload" id="pdfUploadBtn">
888
+ <i class="fas fa-file-pdf"></i> PDF ์ถ”๊ฐ€
 
 
 
 
 
 
 
889
  </button>
890
+ <input id="pdfInput" type="file" accept="application/pdf" style="display:none">
891
  </div>
892
 
893
  <div class="section-title">๋‚ด ํ”„๋กœ์ ํŠธ</div>
 
895
  <!-- ์นด๋“œ๊ฐ€ ์—ฌ๊ธฐ์— ๋™์ ์œผ๋กœ ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค -->
896
  </div>
897
  <div id="noProjects" class="no-projects" style="display: none;">
898
+ ํ”„๋กœ์ ํŠธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. PDF๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์‹œ์ž‘ํ•˜์„ธ์š”.
899
  </div>
900
  </section>
901
 
 
906
 
907
  <script>
908
  let projects=[], fb=null;
909
+ const grid=document.getElementById('grid'), viewer=document.getElementById('viewer');
910
  pdfjsLib.GlobalWorkerOptions.workerSrc='/static/pdf.worker.js';
911
 
912
  // ์„œ๋ฒ„์—์„œ ๋ฏธ๋ฆฌ ๋กœ๋“œ๋œ PDF ํ”„๋กœ์ ํŠธ
 
923
  {once:true,capture:true});
924
  });
925
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
926
  /* โ”€โ”€ ์œ ํ‹ธ โ”€โ”€ */
927
  function $id(id){return document.getElementById(id)}
928
 
929
+ // ํŒŒ์ผ ์—…๋กœ๋“œ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ
930
+ document.addEventListener("DOMContentLoaded", function() {
931
+ console.log("DOM ๋กœ๋“œ ์™„๋ฃŒ, ์ด๋ฒคํŠธ ์„ค์ • ์‹œ์ž‘");
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
932
 
933
+ // PDF ์—…๋กœ๋“œ ๋ฒ„ํŠผ
934
+ const pdfBtn = document.getElementById('pdfUploadBtn');
935
+ const pdfInput = document.getElementById('pdfInput');
936
 
937
+ if (pdfBtn && pdfInput) {
938
+ console.log("PDF ์—…๋กœ๋“œ ๋ฒ„ํŠผ ์ฐพ์Œ");
939
+
940
+ // ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ ํŒŒ์ผ ์ž…๋ ฅ ํŠธ๋ฆฌ๊ฑฐ
941
+ pdfBtn.addEventListener('click', function() {
942
+ console.log("PDF ๋ฒ„ํŠผ ํด๋ฆญ๋จ");
943
+ pdfInput.click();
944
+ });
945
+
946
+ // ํŒŒ์ผ ์„ ํƒ ์‹œ ์ฒ˜๋ฆฌ
947
+ pdfInput.addEventListener('change', function(e) {
948
+ console.log("PDF ํŒŒ์ผ ์„ ํƒ๋จ:", e.target.files.length);
949
+ const file = e.target.files[0];
950
+ if (!file) return;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
951
 
952
+ showLoading("PDF ๋กœ๋”ฉ ์ค‘...");
 
 
 
 
 
 
 
 
 
 
953
 
954
+ const reader = new FileReader();
955
+ reader.onload = function(event) {
956
+ pdfjsLib.getDocument({data: event.target.result}).promise.then(async function(pdf) {
957
+ const pages = [];
958
+
959
+ for (let pageNum = 1; pageNum <= pdf.numPages; pageNum++) {
960
+ updateLoading(`PDF ํŽ˜์ด์ง€ ๋กœ๋”ฉ ์ค‘... (${pageNum}/${pdf.numPages})`);
961
+
962
+ const page = await pdf.getPage(pageNum);
963
+ const viewport = page.getViewport({scale: 1});
964
+ const canvas = document.createElement('canvas');
965
+ canvas.width = viewport.width;
966
+ canvas.height = viewport.height;
967
+
968
+ await page.render({
969
+ canvasContext: canvas.getContext('2d'),
970
+ viewport: viewport
971
+ }).promise;
972
+
973
+ pages.push({
974
+ src: canvas.toDataURL(),
975
+ thumb: canvas.toDataURL()
976
+ });
977
+ }
978
+
979
+ hideLoading();
980
+ save(pages, file.name.replace('.pdf', ''));
981
+ }).catch(function(error) {
982
+ console.error("PDF ๋กœ๋”ฉ ์˜ค๋ฅ˜:", error);
983
+ hideLoading();
984
+ showError("PDF ๋กœ๋”ฉ ์ค‘ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค: " + error.message);
985
+ });
986
+ };
987
+
988
+ reader.onerror = function(error) {
989
+ console.error("ํŒŒ์ผ ์ฝ๊ธฐ ์˜ค๋ฅ˜:", error);
990
+ hideLoading();
991
+ showError("ํŒŒ์ผ์„ ์ฝ๋Š” ์ค‘ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.");
992
+ };
993
+
994
+ reader.readAsArrayBuffer(file);
995
  });
996
+ } else {
997
+ console.error("PDF ์—…๋กœ๋“œ ์š”์†Œ๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Œ");
998
+ }
999
+
1000
+ // ์„œ๋ฒ„ PDF ๋กœ๋“œ ๋ฐ ์บ์‹œ ์ƒํƒœ ํ™•์ธ
1001
+ loadServerPDFs();
1002
+
1003
+ // ์บ์‹œ ์ƒํƒœ๋ฅผ ์ฃผ๊ธฐ์ ์œผ๋กœ ํ™•์ธ
1004
+ setInterval(checkCacheStatus, 3000);
1005
+ });
1006
 
1007
  function addCard(i, thumb, title, isCached = false) {
1008
  const d = document.createElement('div');
 
1031
  $id('noProjects').style.display = 'none';
1032
  }
1033
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1034
  /* โ”€โ”€ ํ”„๋กœ์ ํŠธ ์ €์žฅ โ”€โ”€ */
1035
  function save(pages, title, isCached = false){
1036
  const id=projects.push(pages)-1;
 
1624
  }
1625
  }, 5000);
1626
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1627
  </script>
1628
  </body>
1629
  </html>