skim lines

This commit is contained in:
Víctor Losada Hernández
2026-08-23 22:11:30 +02:00
parent 9a8148a179
commit 613cea91a3
+36 -88
View File
@@ -84,18 +84,13 @@ const Editor = forwardRef(
const isView = (name)=>view === name; const isView = (name)=>view === name;
//componentDidMount equivalent
useEffect(()=>{ useEffect(()=>{
const brewRenderer = document.getElementById('BrewRenderer'); const brewRenderer = document.getElementById('BrewRenderer');
brewRenderer.onload = ()=>brewRenderer.contentDocument?.addEventListener('keydown', handleControlKeys); brewRenderer.onload = ()=>brewRenderer.contentDocument?.addEventListener('keydown', handleControlKeys);
document.addEventListener('keydown', handleControlKeys); document.addEventListener('keydown', handleControlKeys);
const editorTheme = window.localStorage.getItem(EDITOR_THEME_KEY); const editorTheme = window.localStorage.getItem(EDITOR_THEME_KEY);
if(editorTheme && EditorThemes.includes(editorTheme)) { if(editorTheme && EditorThemes.includes(editorTheme)) setEditorTheme(editorTheme); else setEditorTheme('default');
setEditorTheme(editorTheme);
} else {
setEditorTheme('default');
}
const snippetBar = document.querySelector('.editor > .snippetBar'); const snippetBar = document.querySelector('.editor > .snippetBar');
if(!snippetBar) return; if(!snippetBar) return;
@@ -103,55 +98,18 @@ const Editor = forwardRef(
const height = document.querySelector('.editor > .snippetBar').offsetHeight; const height = document.querySelector('.editor > .snippetBar').offsetHeight;
setSnippetBarHeight(height); setSnippetBarHeight(height);
}); });
resizeObserver.observe(snippetBar); resizeObserver.observe(snippetBar);
//ComponentWillUnmount equivalent
return ()=>{ return ()=>{
if(resizeObserver) resizeObserver.disconnect(); if(resizeObserver) resizeObserver.disconnect();
}; };
}, []); }, []);
const previousProps = useRef({ useEffect(()=>{ if(moveBrew) brewJump(); }, [moveBrew]);
moveBrew, useEffect(()=>{ if(moveSource) sourceJump(); }, [moveSource]);
moveSource, useEffect(()=>{ if(liveScroll) sourceJump(currentBrewRendererPageNum, false); }, [currentBrewRendererPageNum, liveScroll]);
currentBrewRendererPageNum, useEffect(()=>{ if(liveScroll) brewJump(currentEditorViewPageNum, false); }, [currentEditorViewPageNum, liveScroll]);
currentEditorViewPageNum, useEffect(()=>{ if(liveScroll) brewJump(currentEditorCursorPageNum, false); }, [currentEditorCursorPageNum, liveScroll]);
currentEditorCursorPageNum,
});
//componentDidUpdate Equivalent
useEffect(()=>{
const prev = previousProps.current;
if(prev.moveBrew !== moveBrew) brewJump();
if(prev.moveSource !== moveSource) sourceJump();
if(liveScroll) {
if(prev.currentBrewRendererPageNum !== currentBrewRendererPageNum) {
sourceJump(currentBrewRendererPageNum, false);
} else if(prev.currentEditorViewPageNum !== currentEditorViewPageNum) {
brewJump(currentEditorViewPageNum, false);
} else if(prev.currentEditorCursorPageNum !== currentEditorCursorPageNum) {
brewJump(currentEditorCursorPageNum, false);
}
}
previousProps.current = {
moveBrew,
moveSource,
currentBrewRendererPageNum,
currentEditorViewPageNum,
currentEditorCursorPageNum,
};
}, [
moveBrew,
moveSource,
liveScroll,
currentBrewRendererPageNum,
currentEditorViewPageNum,
currentEditorCursorPageNum,
]);
const handleControlKeys = (e)=>{ const handleControlKeys = (e)=>{
if(!(e.ctrlKey && e.metaKey && e.shiftKey)) return; if(!(e.ctrlKey && e.metaKey && e.shiftKey)) return;
@@ -164,6 +122,7 @@ const Editor = forwardRef(
e.preventDefault(); e.preventDefault();
} }
}; };
const updateCurrentCursorPage = (pageNumber)=>{ const updateCurrentCursorPage = (pageNumber)=>{
onCursorPageChange(pageNumber); onCursorPageChange(pageNumber);
}; };
@@ -180,7 +139,6 @@ const Editor = forwardRef(
setMoveArrows(newView === 'text'); setMoveArrows(newView === 'text');
setView(newView); setView(newView);
}; };
useEffect(()=>{ useEffect(()=>{
codeEditor.current?.focus(); codeEditor.current?.focus();
}, [view]); }, [view]);
@@ -189,25 +147,25 @@ const Editor = forwardRef(
if(!window || !isText() || isJumping || jumpSource === 'source') return; if(!window || !isText() || isJumping || jumpSource === 'source') return;
const brewRenderer = const brewRenderer =
window.frames['BrewRenderer'].contentDocument.getElementsByClassName('brewRenderer')[0]; window.frames['BrewRenderer'].contentDocument.getElementsByClassName('brewRenderer')[0];
const currentPos = brewRenderer.scrollTop; const currentPos = brewRenderer.scrollTop;
const targetPos = window.frames['BrewRenderer'].contentDocument const targetPos = window.frames['BrewRenderer'].contentDocument
.getElementById(`p${targetPage}`) .getElementById(`p${targetPage}`)
.getBoundingClientRect().top; .getBoundingClientRect().top;
let scrollingTimeout; let scrollingTimeout;
const checkIfScrollComplete = ()=>{ const checkIfScrollComplete = ()=>{// Prevent interrupting a scroll in progress if user clicks multiple times
clearTimeout(scrollingTimeout); clearTimeout(scrollingTimeout);// Reset the timer every time a scroll event occurs
scrollingTimeout = setTimeout(()=>{ scrollingTimeout = setTimeout(()=>{
isJumping = false; isJumping = false;
jumpSource = null; jumpSource = null;
brewRenderer.removeEventListener('scroll', checkIfScrollComplete); brewRenderer.removeEventListener('scroll', checkIfScrollComplete);
}, 150); }, 150);// If 150 ms pass without a brewRenderer scroll event, assume scrolling is done
}; };
isJumping = true; isJumping = true;
@@ -217,31 +175,20 @@ const Editor = forwardRef(
brewRenderer.addEventListener('scroll', checkIfScrollComplete); brewRenderer.addEventListener('scroll', checkIfScrollComplete);
if(smooth) { if(smooth) {
const bouncePos = targetPos >= 0 ? -30 : 30; const bouncePos = targetPos >= 0 ? -30 : 30; //Do a little bounce before scrolling
const now = Date.now(); const now = Date.now();
// leading: true, trailing: false, 500ms throttle
if(now - throttleBrewMove.current >= 500) { if(now - throttleBrewMove.current >= 500) {
throttleBrewMove.current = now; throttleBrewMove.current = now;
brewRenderer.scrollTo({ brewRenderer.scrollTo({ top: currentPos + bouncePos, behavior: 'smooth' });
top : currentPos + bouncePos,
behavior : 'smooth',
});
setTimeout(()=>{ setTimeout(()=>{
brewRenderer.scrollTo({ brewRenderer.scrollTo({ top: currentPos + targetPos, behavior: 'smooth', block: 'start' });
top : currentPos + targetPos,
behavior : 'smooth',
block : 'start',
});
}, 100); }, 100);
} }
} else { } else {
brewRenderer.scrollTo({ brewRenderer.scrollTo({ top : currentPos + targetPos, behavior : 'instant', block : 'start',
top : currentPos + targetPos,
behavior : 'instant',
block : 'start',
}); });
} }
}; };
@@ -249,11 +196,10 @@ const Editor = forwardRef(
const sourceJump = (targetPage = currentBrewRendererPageNum, smooth = true)=>{ const sourceJump = (targetPage = currentBrewRendererPageNum, smooth = true)=>{
if(!isText() || isJumping || jumpSource === 'brew') return; if(!isText() || isJumping || jumpSource === 'brew') return;
const editor = codeEditor.current; if(!codeEditor.current) return;
if(!editor) return;
jumpSource = 'source'; jumpSource = 'source';
editor.scrollToPage(targetPage); codeEditor.current.scrollToPage(targetPage);
setTimeout(()=>{ setTimeout(()=>{
jumpSource = null; jumpSource = null;
}, 200); }, 200);
@@ -303,20 +249,6 @@ const Editor = forwardRef(
</> </>
); );
} }
if(isMeta()) {
return (
<>
<CodeEditor key='codeEditor' view={view} style={{ display: 'none' }} />
<MetadataEditor
metadata={brew}
themeBundle={themeBundle}
onChange={onBrewChange('metadata')}
reportError={reportError}
userThemes={userThemes}
/>
</>
);
}
if(isSnip()) { if(isSnip()) {
if(!brew.snippets) { if(!brew.snippets) {
brew.snippets = DEFAULT_SNIPPET_TEXT; brew.snippets = DEFAULT_SNIPPET_TEXT;
@@ -339,13 +271,29 @@ const Editor = forwardRef(
</> </>
); );
} }
if(isMeta()) {
return (
<>
<CodeEditor key='codeEditor' view={view} style={{ display: 'none' }} />
<MetadataEditor
metadata={brew}
themeBundle={themeBundle}
onChange={onBrewChange('metadata')}
reportError={reportError}
userThemes={userThemes}
/>
</>
);
}
}; };
const redo = ()=>codeEditor.current?.redo(); const redo = ()=>codeEditor.current?.redo();
const historySize = ()=>codeEditor.current?.historySize(); const historySize = ()=>codeEditor.current?.historySize();
const undo = ()=>codeEditor.current?.undo(); const undo = ()=>codeEditor.current?.undo();
const foldCode = ()=>codeEditor.current?.foldAll(); const foldCode = ()=>codeEditor.current?.foldAll();
const unfoldCode = ()=>codeEditor.current?.unfoldAll(); const unfoldCode = ()=>codeEditor.current?.unfoldAll();
//Called when there are changes to the editor's dimensions
const update = ()=>{}; const update = ()=>{};
useImperativeHandle(ref, ()=>({ useImperativeHandle(ref, ()=>({
@@ -382,7 +330,7 @@ const Editor = forwardRef(
{renderEditor()} {renderEditor()}
</div> </div>
); );
}, }
); );
export default Editor; export default Editor;