(old) method for adding languages to highlight.js on Discourse

:warning: This method doesn’t work any more. See This method no longer works. Please see Install a new language for Highlight.JS via a theme component instead.

Original Post

Warning: This is a crazy hack!

I’m just sharing because (1) it maybe helpful to someone and (2) hopefully you will teach me a better way.

I hired a “Discourse as a Service” instance, so I don’t control the source code, nor can install plugins.

I wanted my forum to highlight the Beancount language.

First I wrote the syntax definition and sent it to upstream, but I didn’t want to wait for a Highlight.JS and Discourse release, and for my host to upgrade my instance.

Then I went to Admin -> Customize -> CSS/HTML -> </head> and added this hack to inject the Beancount language into Discourse’s Highlight.JS.

<script>
// Crazy hack to install Beancount syntax.
function waitForHighlightJS() {
    if(typeof hljs !== "undefined"){
        console.debug('HighlightJS ready... installing Beancount syntax.');
        
        // Install Beancount syntax.
        //Got this building highlight.js with: node tools/build.js -t cdn
        hljs.registerLanguage("beancount",function(e){var c="[A-Z][A-Za-z0-9-]*",a="[0-9]{4}[-|/][0-9]{2}[-|/][0-9]{2}",b="(balance|commodity|custom|document|event|note|open|pad|price|query)",t={cN:"literal",b:/([\-|\+]?)([\d]+[\.]?[\d]*)/,r:0},n={cN:"string",b:'"',e:'"',r:0,c:[e.BE]},s={cN:"name",b:"\\{",e:"\\}",c:[{cN:"literal",b:a},t,n,{cN:"subst",b:"[A-Z][A-Z0-9'._-]{0,22}[A-Z0-9]"}]};return{aliases:["beancount","bean","ledger"],c:[{cN:"built_in",b:"^(include|option|plugin|popmeta|poptag|pushmeta|pushtag)",r:0},{b:"^"+a+"\\s+"+b,rB:!0,r:10,c:[{cN:"type",b:a,e:/\s+/,eE:!0},{cN:"keyword",b:b}]},{b:"^"+a+"\\s+.\\s",rB:!0,r:10,c:[{cN:"type",b:a,e:"\\s+",eE:!0},{cN:"variable",b:".",endsParent:!0}]},e.C(";","$"),{cN:"meta",b:/^\s{2,}[a-z][A-Za-z0-9\-_]+:/},s,{cN:"name",b:"@"},{cN:"type",b:c+":",r:0,c:[{cN:"subst",b:c+"(:"+c+")?"}]},{cN:"section",b:/^\*\s+?.*/},{cN:"link",b:/\^[A-Za-z0-9\-_\/.]+/},{cN:["emphasis"],b:/#[A-Za-z0-9\-_\/.]+/},n,t]}});
        
        // Realod syntax for codeblocks.
        $("pre code[class]").each(function(i, e){
            hljs.highlightBlock(e);
        })
        
        console.debug('HighlightJS updated. Everything should look good.');
    }
    else{
        console.debug('HighlightJS not ready yet.')
        setTimeout(waitForHighlightJS, 250);
    }
}
setTimeout(waitForHighlightJS, 250);
</script>

Works for me. If you have any suggestions I would be glad to hear. Mainly if you know how it can be done without the setTimeout.

's!

4 إعجابات

Ideally I would prefer simply to upgrade highlight and make the brand new languages an option. This hack is very very very hacky.

4 إعجابات

Me too! :smiley: Unfortunately this is not under my control.

I was wandering… Discourse’s HLJS plugin already allow some customization on init. Maybe it would be useful to not limit this customization to languages. Maybe passing an object that would be merged with the config object could do this trick and more.

However, I don’t think ppl need this very much. I’ll stick with my hack until (1) HLJS is released and (2) Discourse updated.

How do you indiciate which syntax highlighter to use when you insert code into a post?

AFAIK HighlightJS uses the first language that match.

However, every language has a “registration name”.

hljs.registerLanguage("beancount",function(e){...})

So if you want to explicitly define the language, inform the name after the triple ```.

``` python
Some code
```
4 إعجابات

Thanks - I had seen the registration name but it wasn’t clear how to specify that name when posting code.

تم تقسيم منشور إلى موضوع جديد: تثبيت لغة جديدة لـ Highlight.JS عبر مكون سمة

لقد صادفت هذه المقالة أثناء بحثي عن كيفية إضافة دعم لتظليل صيغة Chapel على موقع Chapel Language Discourse الخاص بنا باستخدام إضافة highlight.js من طرف ثالث لدعم Chapel.

في المثال السابق من @pmusaraj، أفهم كيفية تحديثه لاستبدال beancount بـ chapel. لكنني جديد بما يكفي على Discourse لدرجة أنه ليس واضحًا بالنسبة لي ما الذي سأفعله بعد ذلك مع كتلة النص البرمجي لتمكينها على موقع Discourse الخاص بنا. هل يمكن لأحد تقديم توجيهات إضافية للمبتدئين مثلي؟

شكرًا لكم!

يمكنك إنشاء مكون سمة جديد تحت الإدارة > التخصيص > السمات، ثم لصق هذا الكود في قسم </head>. من هناك، قم بالتعديل والتحسين حسب الحاجة.

معلومات إضافية:

دليل المبتدئين لاستخدام سمات Discourse
دليل المطورين لسمات Discourse

4 إعجابات

شكرًا لك @justin، هذا بالضبط ما كنت أفتقده (ولم أكن لأصل إليه بنفسي قبل الاستسلام)! الآن، يعرض Discourse الخاص بنا لغة Chapel بشكل صحيح (أو على الأقل، بقدر ما يسمح به سكريبت highlight.js الخاص بي، وهو بداية رائعة…).

هناك بعض النقاط التي ظلت غير واضحة لي حتى بعد بعض التجارب والأخطاء:

  1. هل من الصحيح أن وسم اللغة في كتلة مُشارَكة ثلاثية، مثل:

    ```chapel
    

    يتم مطابقته فقط مع (المُعرِّف الأول) لمُعرِّف registerHighlightJSLanguage()؟ أم أنه يُطابق أيضًا الأسماء البديلة المُعرَّفة داخل تعريف لغة highlight.js الخاص بالمُبرمج؟ إذا كان الأمر كذلك، فهل هناك سبب لتجنب تسجيل تعريف اللغة عدة مرات تحت أسماء بديلة مختلفة لدعم أشكال متعددة (مثل ```chapel مقابل ```chpl

  2. هل من الصحيح أنه يجب إضافة اللغة إلى إعداد “اللغات المبرزة” في الموقع أيضًا لكي يتم التعرف على كتل الكود؟ وهل يجب أن يتطابق هذا الاسم مع السلسلة النصية الممررة إلى registerHighlightJSLanguage()؟

شكرًا مجددًا.

لقد قمت بإنشاء تمييز بناء جملة جديد لـ Jai: GitHub - Jai-Community/discourse-highlightjs-jai: Discourse theme component to highlight Jai syntax · GitHub

ومع ذلك، عند تثبيتها ودخول وضع معاينة المظهر، ثم إنشاء موضوع جديد وإضافة بعض الأكواد، مثل هذا:

```jai
#run {}
```

… فإنه يكتشف اللغة (انظر سمة class)، لكنه لا يحلل أي شيء:

<pre><code class="lang-jai hljs">#run {}
</code></pre>

بينما يؤدي تشغيل نفس تعريف اللغة مع إعداد محلي إلى تمييز بناء جملة Jai بنجاح:

جرب بنفسك بفتح _dev/test-syntax-highlight.html في متصفحك.

أفكار؟

اتضح أن Discourse يستخدم الإصدار الرئيسي السابق من Highlight.js، وهو غير متوافق مع الإصدار الحالي. لذلك كان عليّ إصلاح تعريف اللغة الخاص بي، وقد نجح الأمر بشكل رائع.

ولأي شخص مهتم بأمثلة كاملة لمستودع مكون موضوع للتمييز النحوي، إليك الرابط:

إعجابَين (2)

Screenshot 2024-01-21 at 8.41.45 PM

مرحباً @what، كان المنشور الأصلي في هذا الموضوع قديماً. لقد قمت بسحب التعليمات العاملة إلى موضوع جديد:

3 إعجابات