<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Peter Solopov</title>
    <description>The latest articles on DEV Community by Peter Solopov (@petersolopov).</description>
    <link>https://dev.to/petersolopov</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F408937%2F10db5066-7f13-455b-b679-b64a6a2ed1b2.jpeg</url>
      <title>DEV Community: Peter Solopov</title>
      <link>https://dev.to/petersolopov</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/petersolopov"/>
    <language>en</language>
    <item>
      <title>~40 lines code editor in pure js</title>
      <dc:creator>Peter Solopov</dc:creator>
      <pubDate>Tue, 16 Jun 2020 14:54:19 +0000</pubDate>
      <link>https://dev.to/petersolopov/40-lines-code-editor-in-pure-js-5a1b</link>
      <guid>https://dev.to/petersolopov/40-lines-code-editor-in-pure-js-5a1b</guid>
      <description>&lt;p&gt;There are many awesome full-features code editors like CodeMirror, Ace, and Monaco. But if you want to edit small code snippets you probably want to use tiny editor and keep your bundle size small. Also, you can create your own!&lt;/p&gt;

&lt;h2&gt;
  
  
  Plan
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Create a class &lt;code&gt;Editor&lt;/code&gt;. The constructor take CSS selector and options: initial value and highlighter function.&lt;/li&gt;
&lt;li&gt;Create &lt;code&gt;pre&lt;/code&gt; and &lt;code&gt;textarea&lt;/code&gt; elements.&lt;/li&gt;
&lt;li&gt;Listen to &lt;code&gt;textarea&lt;/code&gt; &lt;code&gt;input&lt;/code&gt; event.&lt;/li&gt;
&lt;li&gt;Add HTML to &lt;code&gt;pre&lt;/code&gt; element with external highlighter when &lt;code&gt;textarea&lt;/code&gt; is changed.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Trick
&lt;/h2&gt;

&lt;p&gt;We will be interacting with &lt;code&gt;textarea&lt;/code&gt; element but see only highlighted HTML in &lt;code&gt;pre&lt;/code&gt; element. &lt;code&gt;textarea&lt;/code&gt; text will be hidden by CSS rule &lt;a href="https://caniuse.com/#feat=mdn-css_properties_-webkit-text-fill-color"&gt;-webkit-text-fill-color: transparent&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--XX2jv3pT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/xjlox9pwyqieb6svb9v1.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--XX2jv3pT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/xjlox9pwyqieb6svb9v1.gif" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Uses
&lt;/h2&gt;

&lt;p&gt;You can check all code in &lt;a href="https://codesandbox.io/s/vigorous-roentgen-5j46e?file=/src/Editor.js"&gt;sandbox&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Editor&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./Editor.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="c1"&gt;// use highligh.js as external highlighter&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;hljs&lt;/span&gt; &lt;span class="nx"&gt;form&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;highlight.js&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;editor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;Editor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;#editor&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;my awesome code&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;highlighter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;hljs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;highlight&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;javascript&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="nx"&gt;editor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;onUpdate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Live demo
&lt;/h2&gt;

&lt;p&gt;&lt;iframe src="https://codesandbox.io/embed/vigorous-roentgen-5j46e"&gt;
&lt;/iframe&gt;
&lt;/p&gt;
&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;If you don't need features like code folding, multi cursors, etc., you can create your code editor to keep your bundle size small.&lt;/p&gt;

&lt;p&gt;If you need tiny editor with only features you want, like line numbers, handling tab for indentation, cut line, etc. you can check &lt;code&gt;yace&lt;/code&gt;: &lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vJ70wriM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://practicaldev-herokuapp-com.freetls.fastly.net/assets/github-logo-ba8488d21cd8ee1fee097b8410db9deaa41d0ca30b004c0c63de0a479114156f.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/petersolopov"&gt;
        petersolopov
      &lt;/a&gt; / &lt;a href="https://github.com/petersolopov/yace"&gt;
        yace
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      yet another code editor for browser
    &lt;/h3&gt;
  &lt;/div&gt;
&lt;/div&gt;



&lt;p&gt;It's lightweight ~1KB code editor, with ability to add your plugins. It also uses &lt;code&gt;textarea&lt;/code&gt; + &lt;code&gt;pre&lt;/code&gt; idea.&lt;/p&gt;

&lt;h2&gt;
  
  
  Thanks
&lt;/h2&gt;

</description>
      <category>javascript</category>
      <category>css</category>
      <category>webdev</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
