@@ -62,7 +62,7 @@ export async function createMonaco(textarea, filename, editorOpts) {
62
62
const monaco = await import ( /* webpackChunkName: "monaco" */ 'monaco-editor' ) ;
63
63
64
64
initLanguages ( monaco ) ;
65
- let { language, ...other } = editorOpts ;
65
+ let { language, eol , ...other } = editorOpts ;
66
66
if ( ! language ) language = getLanguage ( filename ) ;
67
67
68
68
const container = document . createElement ( 'div' ) ;
@@ -105,14 +105,28 @@ export async function createMonaco(textarea, filename, editorOpts) {
105
105
monaco . languages . register ( { id : 'vs.editor.nullLanguage' } ) ;
106
106
monaco . languages . setLanguageConfiguration ( 'vs.editor.nullLanguage' , { } ) ;
107
107
108
+ // We encode the initial value in JSON on the backend to prevent browsers from
109
+ // discarding the \r during HTML parsing:
110
+ // https://html.spec.whatwg.org/multipage/parsing.html#preprocessing-the-input-stream
111
+ const value = JSON . parse ( textarea . getAttribute ( 'data-initial-value' ) || '""' ) ;
112
+ textarea . value = value ;
113
+ textarea . removeAttribute ( 'data-initial-value' ) ;
114
+
108
115
const editor = monaco . editor . create ( container , {
109
- value : textarea . value ,
116
+ value,
110
117
theme : 'gitea' ,
111
118
language,
112
119
...other ,
113
120
} ) ;
114
121
115
122
const model = editor . getModel ( ) ;
123
+
124
+ // Monaco performs auto-detection of dominant EOL in the file, biased towards LF for
125
+ // empty files. If there is an editorconfig value, override this detected value.
126
+ if ( eol in monaco . editor . EndOfLineSequence ) {
127
+ model . setEOL ( monaco . editor . EndOfLineSequence [ eol ] ) ;
128
+ }
129
+
116
130
model . onDidChangeContent ( ( ) => {
117
131
textarea . value = editor . getValue ( ) ;
118
132
textarea . dispatchEvent ( new Event ( 'change' ) ) ; // seems to be needed for jquery-are-you-sure
@@ -187,5 +201,6 @@ function getEditorConfigOptions(ec) {
187
201
opts . trimAutoWhitespace = ec . trim_trailing_whitespace === true ;
188
202
opts . insertSpaces = ec . indent_style === 'space' ;
189
203
opts . useTabStops = ec . indent_style === 'tab' ;
204
+ opts . eol = ec . end_of_line ?. toUpperCase ( ) ;
190
205
return opts ;
191
206
}
0 commit comments