bug: fixed syntax highlighting bug on large pasted text
This commit is contained in:
		
							parent
							
								
									7e7452a016
								
							
						
					
					
						commit
						d928702e89
					
				| @ -1,4 +1,4 @@ | ||||
| # [BinCode](jsbin.asadk.dev) - A Complete Self-Hostable JSFiddle Alternative | ||||
| # [BinCode](https://bincode.asadk.dev) - A Complete Self-Hostable JSFiddle Alternative | ||||
| 
 | ||||
| ## Overview | ||||
| BinCode is a minimalist platform for managing and sharing code snippets, built with Vue.js and SQLite. It runs entirely on your own infrastructure, giving you full control over your data and workflow. | ||||
|  | ||||
| @ -153,6 +153,11 @@ createApp({ | ||||
|   }, | ||||
| 
 | ||||
|   mounted() { | ||||
|     const textarea = document.querySelector('.editor-content textarea'); | ||||
|     if (textarea) { | ||||
|       textarea.addEventListener('paste', this.handlePaste); | ||||
|     } | ||||
| 
 | ||||
|     this.loadPrismTheme(); | ||||
|     this.initThemeListener(); | ||||
| 
 | ||||
| @ -172,8 +177,37 @@ createApp({ | ||||
|       }; | ||||
|     } | ||||
|   }, | ||||
|   beforeUnmount() { | ||||
|     const textarea = document.querySelector('.editor-content textarea'); | ||||
|     if (textarea) { | ||||
|       textarea.removeEventListener('paste', this.handlePaste); | ||||
|     } | ||||
|   }, | ||||
| 
 | ||||
|   methods: { | ||||
|     handlePaste(event) { | ||||
|       const textarea = event.target; | ||||
|        | ||||
|       // scroll to cursor
 | ||||
|       requestAnimationFrame(() => { | ||||
|         this.scrollToCursor(textarea); | ||||
|       }); | ||||
|     }, | ||||
|     scrollToCursor(textarea) { | ||||
|       const cursorPosition = textarea.selectionStart; | ||||
|    | ||||
|       const lineHeight = parseInt(getComputedStyle(textarea).lineHeight, 10); | ||||
|       const lines = textarea.value.substr(0, cursorPosition).split('\n').length; | ||||
|    | ||||
|       const scrollTop = (lines - 1) * lineHeight; | ||||
|    | ||||
|       textarea.scrollTop = scrollTop; | ||||
|    | ||||
|       const pre = textarea.nextElementSibling; | ||||
|       if (pre) { | ||||
|         pre.scrollTop = scrollTop; | ||||
|       } | ||||
|     }, | ||||
|     loadPrismTheme() { | ||||
|       const existingTheme = document.querySelector("link[data-prism-theme]"); | ||||
|       if (existingTheme) { | ||||
| @ -214,6 +248,9 @@ createApp({ | ||||
|       const textarea = event.target; | ||||
|       const pre = textarea.nextElementSibling; | ||||
|       if (pre) { | ||||
|         pre.style.width = `${textarea.offsetWidth}px`; | ||||
|         pre.style.height = `${textarea.offsetHeight}px`; | ||||
|          | ||||
|         pre.scrollTop = textarea.scrollTop; | ||||
|         pre.scrollLeft = textarea.scrollLeft; | ||||
|       } | ||||
|  | ||||
| @ -13,6 +13,14 @@ | ||||
|     <link rel="stylesheet" href="./font.css"> | ||||
|     <!-- Prismjs css --> | ||||
|     <link rel="stylesheet" href="./libraries/prism/theme/prism.min.css" /> | ||||
| 
 | ||||
|     <!-- Code Mirror 6 --> | ||||
|     <script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror6/0.0.1/codemirror.min.js"></script> | ||||
|     <script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror6/0.0.1/language/javascript.min.js"></script> | ||||
|     <script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror6/0.0.1/language/css.min.js"></script> | ||||
|     <script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror6/0.0.1/language/html.min.js"></script> | ||||
|     <script src="https://cdnjs.cloudflare.com/ajax/libs/codemirror6/0.0.1/theme/dark.min.js"></script> | ||||
| 
 | ||||
|   </head> | ||||
|   <body> | ||||
|     <div id="app"> | ||||
| @ -80,15 +88,15 @@ | ||||
|           <!-- Editor content --> | ||||
|           <div class="editor-content"> | ||||
|             <textarea | ||||
|               :value="currentCode" | ||||
|               @input="handleInput" | ||||
|               @scroll="handleScroll" | ||||
|               @keydown="handleKeydown" | ||||
|               :class="{ 'active-editor': true }" | ||||
|               spellcheck="false" | ||||
|               autocomplete="off" | ||||
|               :placeholder="'Enter your ' + activeTab.toUpperCase() + ' code here...'" | ||||
|             ></textarea> | ||||
|             :value="currentCode" | ||||
|             @input="handleInput" | ||||
|             @scroll="handleScroll" | ||||
|             @keydown="handleKeydown" | ||||
|             :class="{ 'active-editor': true }" | ||||
|             spellcheck="false" | ||||
|             autocomplete="off" | ||||
|             :placeholder="'Enter your ' + activeTab.toUpperCase() + ' code here...'" | ||||
|           ></textarea> | ||||
|             <pre | ||||
|               class="editor-highlight" | ||||
|               aria-hidden="true" | ||||
|  | ||||
| @ -1 +1 @@ | ||||
| code[class*=language-],pre[class*=language-]{color:#d4d4d4;font-size:13px;text-shadow:none;font-family:Menlo,Monaco,Consolas,"Andale Mono","Ubuntu Mono","Courier New",monospace;direction:ltr;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{text-shadow:none;background:#264f78}@media print{code[class*=language-],pre[class*=language-]{text-shadow:none}}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto;background:#1e1e1e}:not(pre)>code[class*=language-]{padding:.1em .3em;border-radius:.3em;color:#db4c69;background:#1e1e1e}.namespace{opacity:.7}.token.boolean,.token.doctype .token.doctype-tag,.token.entity,.token.important,.token.keyword,.token.operator.arrow,.token.punctuation.interpolation-punctuation,.token.tag{color:#569cd6}.token.atrule .token.url,.token.attr-name,.token.console,.token.constant,.token.doctype .token.name,.token.exports .token.maybe-class-name,.token.imports .token.maybe-class-name,.token.interpolation,.token.parameter,.token.property,.token.variable,code[class*=language-javascript],code[class*=language-jsx],code[class*=language-tsx],code[class*=language-typescript],pre[class*=language-javascript],pre[class*=language-jsx],pre[class*=language-tsx],pre[class*=language-typescript]{color:#9cdcfe}.token.comment,.token.prolog{color:#6a9955}.language-html .language-css .token.punctuation,.language-html .language-javascript .token.punctuation,.token.atrule .token.url .token.punctuation,.token.attr-value .token.punctuation.attr-equals,.token.entity,.token.operator,.token.punctuation,code[class*=language-html],pre[class*=language-html]{color:#d4d4d4}.token.boolean,.token.constant,.token.inserted,.token.number,.token.property,.token.symbol,.token.tag,.token.unit{color:#b5cea8}.token.atrule,.token.attr-name,.token.attr-value,.token.attr-value .token.punctuation,.token.builtin,.token.char,.token.deleted,.token.selector,.token.string,code[class*=language-css],pre[class*=language-css]{color:#ce9178}.language-css .token.string.url{text-decoration:underline}.token.atrule .token.rule,.token.keyword.control-flow,.token.keyword.module{color:#c586c0}.language-regex .token.anchor,.token.atrule .token.url .token.function,.token.function,.token.function .token.maybe-class-name{color:#dcdcaa}.token.regex{color:#d16969}.token.italic{font-style:italic}.token.class-name,.token.maybe-class-name,.token.namespace{color:#4ec9b0}.token.escape,.token.selector{color:#d7ba7d}.language-html .token.punctuation,.token.cdata,.token.tag .token.punctuation{color:grey}pre[class*=language-]>code[class*=language-]{position:relative;z-index:1}.line-highlight.line-highlight{background:#f7ebc6;box-shadow:inset 5px 0 0 #f7d87c;z-index:0} | ||||
| code[class*=language-],pre[class*=language-]{color:#d4d4d4;font-size:13px;text-shadow:none;font-family:Menlo,Monaco,Consolas,"Andale Mono","Ubuntu Mono","Courier New",monospace;direction:ltr;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{text-shadow:none;background:#264f78}@media print{code[class*=language-],pre[class*=language-]{text-shadow:none}}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto;background:#1e1e1e}:not(pre)>code[class*=language-]{padding:.1em .3em;border-radius:.3em;color:#db4c69;background:#1e1e1e}.namespace{opacity:.7}.token.boolean,.token.doctype .token.doctype-tag,.token.entity,.token.important,.token.keyword,.token.operator.arrow,.token.punctuation.interpolation-punctuation,.token.tag{color:#569cd6}.token.attr-equals,.token.operator,.token.punctuation{background:0 0!important}.token.atrule .token.url,.token.attr-name,.token.console,.token.constant,.token.doctype .token.name,.token.exports .token.maybe-class-name,.token.imports .token.maybe-class-name,.token.interpolation,.token.parameter,.token.property,.token.variable,code[class*=language-javascript],code[class*=language-jsx],code[class*=language-tsx],code[class*=language-typescript],pre[class*=language-javascript],pre[class*=language-jsx],pre[class*=language-tsx],pre[class*=language-typescript]{color:#9cdcfe}.token.comment,.token.prolog{color:#6a9955}.language-html .language-css .token.punctuation,.language-html .language-javascript .token.punctuation,.token.atrule .token.url .token.punctuation,.token.attr-value .token.punctuation.attr-equals,.token.entity,.token.operator,.token.punctuation,code[class*=language-html],pre[class*=language-html]{color:#d4d4d4}.token.boolean,.token.constant,.token.inserted,.token.number,.token.property,.token.symbol,.token.tag,.token.unit{color:#b5cea8}.token.atrule,.token.attr-name,.token.attr-value,.token.attr-value .token.punctuation,.token.builtin,.token.char,.token.deleted,.token.selector,.token.string,code[class*=language-css],pre[class*=language-css]{color:#ce9178}.language-css .token.string.url{text-decoration:underline}.token.atrule .token.rule,.token.keyword.control-flow,.token.keyword.module{color:#c586c0}.language-regex .token.anchor,.token.atrule .token.url .token.function,.token.function,.token.function .token.maybe-class-name{color:#dcdcaa}.token.regex{color:#d16969}.token.italic{font-style:italic}.token.class-name,.token.maybe-class-name,.token.namespace{color:#4ec9b0}.token.escape,.token.selector{color:#d7ba7d}.language-html .token.punctuation,.token.cdata,.token.tag .token.punctuation{color:grey}pre[class*=language-]>code[class*=language-]{position:relative;z-index:1}.line-highlight.line-highlight{background:#f7ebc6;box-shadow:inset 5px 0 0 #f7d87c;z-index:0} | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user