1+ import { hidePopupWithEase } from "../exports/multiTaskHandler" ;
2+ import tmpFilename from "../import/tmpFilename" ;
3+ import textBackups from "../exports/textBackups" ;
4+ import render from "../import/render" ;
5+ import xhrSend from "../server/xhrSend" ;
6+ import saveAsPopup from "../templates/save-as" ;
7+ import fileBackup from "../import/fileBackup" ;
8+ import existsErrorPopup from "../templates/existErrorPopup" ;
9+
10+ function createData ( ) {
11+ var datasource = { } ;
12+ var data = window . localStorage . getItem ( "statusInfo" ) ;
13+ data = data && JSON . parse ( data ) || { } ;
14+ datasource [ "charset" ] = data . charset || "UTF-8" ;
15+ datasource [ "fileExists" ] = $ ( "body" ) . attr ( "data-file-exists" ) ;
16+ datasource [ "fileName" ] = $ ( "body" ) . attr ( "data-file-opened" ) ;
17+ datasource [ "fileType" ] = $ ( "body" ) . attr ( "data-file-type" ) ;
18+ datasource [ "fileExists" ] = JSON . parse ( datasource [ "fileExists" ] ) ;
19+ return datasource ;
20+ }
21+ export default function save ( ) {
22+ $ ( ".s-save" ) . click ( openSaveAsPopup ) ;
23+ }
24+ function openSaveAsPopup ( ) {
25+ if ( $ ( ".save-as-popup" ) . length ) {
26+ return ;
27+ }
28+ const datasource = createData ( ) ;
29+ if ( datasource [ "fileExists" ] ) {
30+ saveFileContent ( { skip : true , content : extractHTML ( ) } ) ;
31+ return ;
32+ }
33+ render ( saveAsPopup ) . runScript ( selectAndFocusInput ) ;
34+ }
35+ function saveFileContent ( senderData ) {
36+ if ( senderData . content === fileBackup . backups && senderData . skip ) {
37+ return ;
38+ }
39+ if ( ! fileBackup . backups ||
40+ ( fileBackup . backups && fileBackup . backups !== senderData . content ) ) {
41+ fileBackup . backups = senderData . content ;
42+ }
43+ xhrSend ( senderData , resetup ) ;
44+ }
45+ function submitSaveAs ( ) {
46+ $ ( "#saveAsForm" ) . on ( "submit" , function ( e ) {
47+ e . preventDefault ( ) ;
48+ saveFileContent ( serializeFormData ( this ) ) ;
49+ } ) ;
50+ }
51+ function selectAndFocusInput ( ) {
52+ var input = $ ( "#filename" ) [ 0 ] ;
53+ input . select ( ) ;
54+ submitSaveAs ( ) ;
55+ setRecentFileList ( ) ;
56+ toggleHandler ( ) ;
57+ $ ( input ) . focus ( ) ;
58+ }
59+ function saveRecentFileInLocalDB ( filename ) {
60+ var data = window . localStorage . getItem ( "recent" ) ;
61+ try {
62+ data = data && JSON . parse ( data ) ;
63+ } catch ( e ) { } ;
64+ if ( ! data ) {
65+ data = { dir : `${ $ ( "body" ) . attr ( "data-root-dir" ) } \\tmp\\` , recent : [ ] } ;
66+ }
67+
68+ $ . extend ( true , data , { recent : [ filename ] } ) ;
69+ data . recent = $ . unique ( data . recent ) ;
70+
71+ window . localStorage . setItem ( "recent" , JSON . stringify ( data ) ) ;
72+ return data ;
73+ }
74+ function setRecentFileList ( ) {
75+ var data = window . localStorage . getItem ( "recent" ) ;
76+ try {
77+ data = data && JSON . parse ( data ) ;
78+ }
79+ catch ( e ) { } ;
80+
81+ $ ( ".recentfile .rtoggle" ) . empty ( ) ;
82+ var recentElem , value ;
83+
84+ if ( ! data ) {
85+ data = { dir : `${ $ ( "body" ) . attr ( "data-root-dir" ) } \\tmp\\` , recent : [ "Untitled.txt" ] } ;
86+ }
87+
88+ $ . each ( data . recent . reverse ( ) , function ( _i , recentFile ) {
89+ recentElem = document . createElement ( "div" ) ;
90+ value = data . dir + recentFile ;
91+ $ ( recentElem ) . attr ( "data-id" , "#filename" ) ;
92+ $ ( recentElem ) . attr ( "data-path" , value ) . attr ( "data-value" , recentFile ) ;
93+ $ ( recentElem ) . html ( value ) ;
94+ $ ( recentElem ) . addClass ( "eqiv-recent-file" ) ;
95+ $ ( ".recentfile .rtoggle" ) . append ( recentElem ) ;
96+ } ) ;
97+ }
98+ function toggleHandler ( ) {
99+ $ ( ".eqiv-recent-file, .ftype" ) . click ( function ( ) {
100+ if ( $ ( this ) . filter ( "#ftype" ) ) {
101+ $ ( "#XFT" ) . val ( $ ( this ) . attr ( "data-sender" ) ) ;
102+ }
103+ var id = $ ( this ) . attr ( "data-id" ) ;
104+ var value = $ ( this ) . attr ( "data-value" ) ;
105+ $ ( "#chooseType" ) [ 0 ] . checked = false ;
106+ $ ( "#recentToggle" ) [ 0 ] . checked = false ;
107+ var focusable = $ ( id ) . val ( value ) . filter ( "#filename" ) ;
108+ focusable . length && focusable [ 0 ] . select ( ) ;
109+ focusable . focus ( ) ;
110+ } ) ;
111+ }
112+ function resetup ( response , status , sender ) {
113+ $ ( ".save-as-popup" ) . remove ( ) ;
114+ if ( response . exists ) {
115+ render . rendWithArgs ( existsErrorPopup , sender [ "file-name" ] ) ;
116+ $ ( ".btn-ok" ) . click ( function ( ) {
117+ hidePopupWithEase ( $ ( ".error-popup" ) ) ;
118+ } ) ;
119+ return ;
120+ }
121+ if ( response . status === status ) {
122+ textBackups . text = $ ( ".line" ) . text ( ) ;
123+ if ( sender . skip ) return ;
124+
125+ var filename = sender [ "file-name" ] . split ( "." ) ;
126+ var extension = filename . pop ( ) ;
127+ filename = filename . join ( "." ) ;
128+ document . title = `Notebook – ${ filename } ` ;
129+ $ ( ".extension" ) . text ( extension ) ;
130+ saveRecentFileInLocalDB ( sender [ "file-name" ] ) ;
131+ $ ( "body" )
132+ . attr ( "data-file-type" , extension ) . attr ( "data-file-exists" , true ) . attr ( "data-file-opened" , filename ) ;
133+ }
134+ }
135+ function extractHTML ( ) {
136+ var extracted = "" ;
137+ $ . each ( $ ( ".line" ) , function ( _i , line ) {
138+ extracted += $ ( line ) . text ( ) . replace ( / \s / g, "\x20" ) + "\n" ;
139+ } ) ;
140+
141+ extracted = extracted . replace ( / ^ \n / , "" ) . replace ( / \n $ / , "" ) ;
142+ return extracted . replace ( / < / g, "<" ) . replace ( / > / g, ">" ) ;
143+ }
144+ function serializeFormData ( form ) {
145+ /**
146+ * text-data
147+ * method
148+ * data-file-exists
149+ * data-file-content
150+ * data-file-type
151+ * data-file-opened
152+ */
153+ var rnoAcceptFilename = / [ \\ \/ \: \* \? \< \> \" \| ] / g;
154+ var rExtension = / \. [ a - z 0 - 9 ] { 1 , 10 } $ / ;
155+ var data = JSON . parse ( $ ( form ) . serializeJson ( ) ) ;
156+ data . content = extractHTML ( ) ;
157+
158+ if ( data [ 'xhr-file-type' ] === 'txt' ) {
159+ var filename = data [ 'file-name' ] ;
160+ data [ 'file-name' ] = filename . replace ( / \. t x t $ / , '' ) . concat ( '.txt' ) ;
161+ }
162+
163+ if ( ! rExtension . test ( data [ 'file-name' ] ) ) {
164+ data [ 'file-name' ] = data [ 'file-name' ] . concat ( '.txt' ) ;
165+ }
166+
167+ if ( rnoAcceptFilename . test ( data [ "file-name" ] ) ) {
168+ return ;
169+ }
170+ return data ;
171+ }
172+ export { createData , selectAndFocusInput } ;
0 commit comments