From 5e2e5e727d939e912e558e9932c8b20b2f1f2bec Mon Sep 17 00:00:00 2001 From: Josh Goebel Date: Wed, 11 Nov 2020 15:59:22 -0500 Subject: [PATCH 1/9] (chore) static import vs runtime require --- src/languages/arduino.js | 4 +++- src/languages/c.js | 4 +++- src/languages/cpp.js | 4 +++- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/languages/arduino.js b/src/languages/arduino.js index ce105003c7..b95e980aa5 100644 --- a/src/languages/arduino.js +++ b/src/languages/arduino.js @@ -6,6 +6,8 @@ Requires: cpp.js Website: https://www.arduino.cc */ +import cPlusPlus from './cpp.js'; + /** @type LanguageFn */ export default function(hljs) { @@ -95,7 +97,7 @@ export default function(hljs) { 'DEFAULT OUTPUT INPUT HIGH LOW' }; - var ARDUINO = hljs.requireLanguage('cpp').rawDefinition(); + var ARDUINO = cPlusPlus(hljs); var kws = ARDUINO.keywords; diff --git a/src/languages/c.js b/src/languages/c.js index d2eb8223f2..c97e7f4a35 100644 --- a/src/languages/c.js +++ b/src/languages/c.js @@ -5,9 +5,11 @@ Website: https://en.wikipedia.org/wiki/C_(programming_language) Requires: c-like.js */ +import cLike from './c-like.js'; + /** @type LanguageFn */ export default function(hljs) { - var lang = hljs.requireLanguage('c-like').rawDefinition(); + const lang = cLike(hljs); // Until C is actually different than C++ there is no reason to auto-detect C // as it's own language since it would just fail auto-detect testing or // simply match with C++. diff --git a/src/languages/cpp.js b/src/languages/cpp.js index 7c9f940031..febc59c7bf 100644 --- a/src/languages/cpp.js +++ b/src/languages/cpp.js @@ -5,9 +5,11 @@ Website: https://isocpp.org Requires: c-like.js */ +import cLike from './c-like.js'; + /** @type LanguageFn */ export default function(hljs) { - var lang = hljs.requireLanguage('c-like').rawDefinition(); + const lang = cLike(hljs); // return auto-detection back on lang.disableAutodetect = false; lang.name = 'C++'; From b82a9cede4afe93ec69d3b94cec356badadcfa23 Mon Sep 17 00:00:00 2001 From: Josh Goebel Date: Wed, 11 Nov 2020 16:04:36 -0500 Subject: [PATCH 2/9] (docs) we deprecated fixMarkup, say so in the docs --- docs/api.rst | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/api.rst b/docs/api.rst index 73fb131c65..3d4e3597a7 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -45,8 +45,10 @@ Returns an object with the following properties: * ``second_best``: object with the same structure for second-best heuristically detected language (may be absent) -``fixMarkup(value)`` --------------------- +``fixMarkup(value)`` (deprecated as of 10.3) +-------------------------------------------- + +**fixMarkup is deprecated and will be removed entirely in v11.** Post-processing of the highlighted markup. Currently consists of replacing indentation TAB characters and using ``
`` tags instead of new-line characters. Options are set globally with ``configure``. From 7534666061a79aac63b5a8e230144bd89d946f31 Mon Sep 17 00:00:00 2001 From: Josh Goebel Date: Wed, 11 Nov 2020 16:09:25 -0500 Subject: [PATCH 3/9] (docs) document the deprecation of requireLanguage --- CHANGES.md | 6 ++++++ docs/api.rst | 9 +++++++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 5f08790487..7eb1c5a32f 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,5 +1,11 @@ ## Version 10.4.0 (work in process) +Deprecations: + +- (chore) `requireLanguage` is deprecated. + - Prefer `getLanguage` (with custom error handling) or built-time dependencies. + - See [Library API](https://highlightjs.readthedocs.io/en/latest/api.html#requirelanguage-name) for more information. + Parser: - fix(vue): Language name now appears in CSS class (#2807) [Michael Rush][] diff --git a/docs/api.rst b/docs/api.rst index 3d4e3597a7..877f2c0bda 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -140,8 +140,13 @@ Looks up a language by name or alias. Returns the language object if found, ``undefined`` otherwise. -``requireLanguage(name)`` -------------------------- +``requireLanguage(name)`` (deprecated as of 10.4) +------------------------------------------------- + +**This has been deprecated and will be removed in a future release.** If you +need this type of functionality use ``getLanguage`` with your own error +handling. It is highly recommended that all inter-dependencies between grammars +be handled at built-time, not run-time. This is what the core library now does. Looks up a language by name or alias. From 9a59f1d5e0c09c957e442129565ce84d64fe2d90 Mon Sep 17 00:00:00 2001 From: Josh Goebel Date: Wed, 11 Nov 2020 16:12:16 -0500 Subject: [PATCH 4/9] add warn --- src/highlight.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/highlight.js b/src/highlight.js index f4bc9e1e74..2d45dc9fc6 100644 --- a/src/highlight.js +++ b/src/highlight.js @@ -787,6 +787,9 @@ const HLJS = function(hljs) { @returns {Language | never} */ function requireLanguage(name) { + console.warn("requireLanguage is deprecated and will be removed entirely in the future."); + console.warn("Please see https://github.com/highlightjs/highlight.js/pull/2844"); + const lang = getLanguage(name); if (lang) { return lang; } From 7e6595df3e2ebf1962393d2306088597f2b66235 Mon Sep 17 00:00:00 2001 From: Josh Goebel Date: Wed, 11 Nov 2020 16:14:54 -0500 Subject: [PATCH 5/9] remove Requires: for runtime requires --- src/languages/arduino.js | 1 - src/languages/c.js | 1 - src/languages/cpp.js | 1 - 3 files changed, 3 deletions(-) diff --git a/src/languages/arduino.js b/src/languages/arduino.js index b95e980aa5..9102cb87a2 100644 --- a/src/languages/arduino.js +++ b/src/languages/arduino.js @@ -2,7 +2,6 @@ Language: Arduino Author: Stefania Mellai Description: The Arduino® Language is a superset of C++. This rules are designed to highlight the Arduino® source code. For info about language see http://www.arduino.cc. -Requires: cpp.js Website: https://www.arduino.cc */ diff --git a/src/languages/c.js b/src/languages/c.js index c97e7f4a35..1ace9d497d 100644 --- a/src/languages/c.js +++ b/src/languages/c.js @@ -2,7 +2,6 @@ Language: C Category: common, system Website: https://en.wikipedia.org/wiki/C_(programming_language) -Requires: c-like.js */ import cLike from './c-like.js'; diff --git a/src/languages/cpp.js b/src/languages/cpp.js index febc59c7bf..7aab27f772 100644 --- a/src/languages/cpp.js +++ b/src/languages/cpp.js @@ -2,7 +2,6 @@ Language: C++ Category: common, system Website: https://isocpp.org -Requires: c-like.js */ import cLike from './c-like.js'; From c82a12dba56254003793b6b44179013414e599cf Mon Sep 17 00:00:00 2001 From: Josh Goebel Date: Wed, 11 Nov 2020 16:41:14 -0500 Subject: [PATCH 6/9] linter --- src/languages/arduino.js | 173 +++++++++++++++++++-------------------- 1 file changed, 86 insertions(+), 87 deletions(-) diff --git a/src/languages/arduino.js b/src/languages/arduino.js index 9102cb87a2..d9195672af 100644 --- a/src/languages/arduino.js +++ b/src/languages/arduino.js @@ -9,96 +9,95 @@ import cPlusPlus from './cpp.js'; /** @type LanguageFn */ export default function(hljs) { - - var ARDUINO_KW = { - keyword: - 'boolean byte word String', - built_in: - 'setup loop ' + - 'KeyboardController MouseController SoftwareSerial ' + - 'EthernetServer EthernetClient LiquidCrystal ' + - 'RobotControl GSMVoiceCall EthernetUDP EsploraTFT ' + - 'HttpClient RobotMotor WiFiClient GSMScanner ' + - 'FileSystem Scheduler GSMServer YunClient YunServer ' + - 'IPAddress GSMClient GSMModem Keyboard Ethernet ' + - 'Console GSMBand Esplora Stepper Process ' + - 'WiFiUDP GSM_SMS Mailbox USBHost Firmata PImage ' + - 'Client Server GSMPIN FileIO Bridge Serial ' + - 'EEPROM Stream Mouse Audio Servo File Task ' + - 'GPRS WiFi Wire TFT GSM SPI SD ' + - 'runShellCommandAsynchronously analogWriteResolution ' + - 'retrieveCallingNumber printFirmwareVersion ' + - 'analogReadResolution sendDigitalPortPair ' + - 'noListenOnLocalhost readJoystickButton setFirmwareVersion ' + - 'readJoystickSwitch scrollDisplayRight getVoiceCallStatus ' + - 'scrollDisplayLeft writeMicroseconds delayMicroseconds ' + - 'beginTransmission getSignalStrength runAsynchronously ' + - 'getAsynchronously listenOnLocalhost getCurrentCarrier ' + - 'readAccelerometer messageAvailable sendDigitalPorts ' + - 'lineFollowConfig countryNameWrite runShellCommand ' + - 'readStringUntil rewindDirectory readTemperature ' + - 'setClockDivider readLightSensor endTransmission ' + - 'analogReference detachInterrupt countryNameRead ' + - 'attachInterrupt encryptionType readBytesUntil ' + - 'robotNameWrite readMicrophone robotNameRead cityNameWrite ' + - 'userNameWrite readJoystickY readJoystickX mouseReleased ' + - 'openNextFile scanNetworks noInterrupts digitalWrite ' + - 'beginSpeaker mousePressed isActionDone mouseDragged ' + - 'displayLogos noAutoscroll addParameter remoteNumber ' + - 'getModifiers keyboardRead userNameRead waitContinue ' + - 'processInput parseCommand printVersion readNetworks ' + - 'writeMessage blinkVersion cityNameRead readMessage ' + - 'setDataMode parsePacket isListening setBitOrder ' + - 'beginPacket isDirectory motorsWrite drawCompass ' + - 'digitalRead clearScreen serialEvent rightToLeft ' + - 'setTextSize leftToRight requestFrom keyReleased ' + - 'compassRead analogWrite interrupts WiFiServer ' + - 'disconnect playMelody parseFloat autoscroll ' + - 'getPINUsed setPINUsed setTimeout sendAnalog ' + - 'readSlider analogRead beginWrite createChar ' + - 'motorsStop keyPressed tempoWrite readButton ' + - 'subnetMask debugPrint macAddress writeGreen ' + - 'randomSeed attachGPRS readString sendString ' + - 'remotePort releaseAll mouseMoved background ' + - 'getXChange getYChange answerCall getResult ' + - 'voiceCall endPacket constrain getSocket writeJSON ' + - 'getButton available connected findUntil readBytes ' + - 'exitValue readGreen writeBlue startLoop IPAddress ' + - 'isPressed sendSysex pauseMode gatewayIP setCursor ' + - 'getOemKey tuneWrite noDisplay loadImage switchPIN ' + - 'onRequest onReceive changePIN playFile noBuffer ' + - 'parseInt overflow checkPIN knobRead beginTFT ' + - 'bitClear updateIR bitWrite position writeRGB ' + - 'highByte writeRed setSpeed readBlue noStroke ' + - 'remoteIP transfer shutdown hangCall beginSMS ' + - 'endWrite attached maintain noCursor checkReg ' + - 'checkPUK shiftOut isValid shiftIn pulseIn ' + - 'connect println localIP pinMode getIMEI ' + - 'display noBlink process getBand running beginSD ' + - 'drawBMP lowByte setBand release bitRead prepare ' + - 'pointTo readRed setMode noFill remove listen ' + - 'stroke detach attach noTone exists buffer ' + - 'height bitSet circle config cursor random ' + - 'IRread setDNS endSMS getKey micros ' + - 'millis begin print write ready flush width ' + - 'isPIN blink clear press mkdir rmdir close ' + - 'point yield image BSSID click delay ' + - 'read text move peek beep rect line open ' + - 'seek fill size turn stop home find ' + - 'step tone sqrt RSSI SSID ' + - 'end bit tan cos sin pow map abs max ' + - 'min get run put', - literal: - 'DIGITAL_MESSAGE FIRMATA_STRING ANALOG_MESSAGE ' + - 'REPORT_DIGITAL REPORT_ANALOG INPUT_PULLUP ' + - 'SET_PIN_MODE INTERNAL2V56 SYSTEM_RESET LED_BUILTIN ' + - 'INTERNAL1V1 SYSEX_START INTERNAL EXTERNAL ' + - 'DEFAULT OUTPUT INPUT HIGH LOW' + const ARDUINO_KW = { + keyword: + 'boolean byte word String', + built_in: + 'setup loop ' + + 'KeyboardController MouseController SoftwareSerial ' + + 'EthernetServer EthernetClient LiquidCrystal ' + + 'RobotControl GSMVoiceCall EthernetUDP EsploraTFT ' + + 'HttpClient RobotMotor WiFiClient GSMScanner ' + + 'FileSystem Scheduler GSMServer YunClient YunServer ' + + 'IPAddress GSMClient GSMModem Keyboard Ethernet ' + + 'Console GSMBand Esplora Stepper Process ' + + 'WiFiUDP GSM_SMS Mailbox USBHost Firmata PImage ' + + 'Client Server GSMPIN FileIO Bridge Serial ' + + 'EEPROM Stream Mouse Audio Servo File Task ' + + 'GPRS WiFi Wire TFT GSM SPI SD ' + + 'runShellCommandAsynchronously analogWriteResolution ' + + 'retrieveCallingNumber printFirmwareVersion ' + + 'analogReadResolution sendDigitalPortPair ' + + 'noListenOnLocalhost readJoystickButton setFirmwareVersion ' + + 'readJoystickSwitch scrollDisplayRight getVoiceCallStatus ' + + 'scrollDisplayLeft writeMicroseconds delayMicroseconds ' + + 'beginTransmission getSignalStrength runAsynchronously ' + + 'getAsynchronously listenOnLocalhost getCurrentCarrier ' + + 'readAccelerometer messageAvailable sendDigitalPorts ' + + 'lineFollowConfig countryNameWrite runShellCommand ' + + 'readStringUntil rewindDirectory readTemperature ' + + 'setClockDivider readLightSensor endTransmission ' + + 'analogReference detachInterrupt countryNameRead ' + + 'attachInterrupt encryptionType readBytesUntil ' + + 'robotNameWrite readMicrophone robotNameRead cityNameWrite ' + + 'userNameWrite readJoystickY readJoystickX mouseReleased ' + + 'openNextFile scanNetworks noInterrupts digitalWrite ' + + 'beginSpeaker mousePressed isActionDone mouseDragged ' + + 'displayLogos noAutoscroll addParameter remoteNumber ' + + 'getModifiers keyboardRead userNameRead waitContinue ' + + 'processInput parseCommand printVersion readNetworks ' + + 'writeMessage blinkVersion cityNameRead readMessage ' + + 'setDataMode parsePacket isListening setBitOrder ' + + 'beginPacket isDirectory motorsWrite drawCompass ' + + 'digitalRead clearScreen serialEvent rightToLeft ' + + 'setTextSize leftToRight requestFrom keyReleased ' + + 'compassRead analogWrite interrupts WiFiServer ' + + 'disconnect playMelody parseFloat autoscroll ' + + 'getPINUsed setPINUsed setTimeout sendAnalog ' + + 'readSlider analogRead beginWrite createChar ' + + 'motorsStop keyPressed tempoWrite readButton ' + + 'subnetMask debugPrint macAddress writeGreen ' + + 'randomSeed attachGPRS readString sendString ' + + 'remotePort releaseAll mouseMoved background ' + + 'getXChange getYChange answerCall getResult ' + + 'voiceCall endPacket constrain getSocket writeJSON ' + + 'getButton available connected findUntil readBytes ' + + 'exitValue readGreen writeBlue startLoop IPAddress ' + + 'isPressed sendSysex pauseMode gatewayIP setCursor ' + + 'getOemKey tuneWrite noDisplay loadImage switchPIN ' + + 'onRequest onReceive changePIN playFile noBuffer ' + + 'parseInt overflow checkPIN knobRead beginTFT ' + + 'bitClear updateIR bitWrite position writeRGB ' + + 'highByte writeRed setSpeed readBlue noStroke ' + + 'remoteIP transfer shutdown hangCall beginSMS ' + + 'endWrite attached maintain noCursor checkReg ' + + 'checkPUK shiftOut isValid shiftIn pulseIn ' + + 'connect println localIP pinMode getIMEI ' + + 'display noBlink process getBand running beginSD ' + + 'drawBMP lowByte setBand release bitRead prepare ' + + 'pointTo readRed setMode noFill remove listen ' + + 'stroke detach attach noTone exists buffer ' + + 'height bitSet circle config cursor random ' + + 'IRread setDNS endSMS getKey micros ' + + 'millis begin print write ready flush width ' + + 'isPIN blink clear press mkdir rmdir close ' + + 'point yield image BSSID click delay ' + + 'read text move peek beep rect line open ' + + 'seek fill size turn stop home find ' + + 'step tone sqrt RSSI SSID ' + + 'end bit tan cos sin pow map abs max ' + + 'min get run put', + literal: + 'DIGITAL_MESSAGE FIRMATA_STRING ANALOG_MESSAGE ' + + 'REPORT_DIGITAL REPORT_ANALOG INPUT_PULLUP ' + + 'SET_PIN_MODE INTERNAL2V56 SYSTEM_RESET LED_BUILTIN ' + + 'INTERNAL1V1 SYSEX_START INTERNAL EXTERNAL ' + + 'DEFAULT OUTPUT INPUT HIGH LOW' }; - var ARDUINO = cPlusPlus(hljs); + const ARDUINO = cPlusPlus(hljs); - var kws = ARDUINO.keywords; + const kws = /** @type {Record} */ (ARDUINO.keywords); kws.keyword += ' ' + ARDUINO_KW.keyword; kws.literal += ' ' + ARDUINO_KW.literal; From 083b7bf129610ce37d5372037e63eea3eb1027aa Mon Sep 17 00:00:00 2001 From: Josh Goebel Date: Wed, 11 Nov 2020 16:50:32 -0500 Subject: [PATCH 7/9] introduce supersetOf concept --- src/highlight.js | 12 +++++++++++- src/languages/arduino.js | 1 + 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/highlight.js b/src/highlight.js index 2d45dc9fc6..16889eeef8 100644 --- a/src/highlight.js +++ b/src/highlight.js @@ -592,7 +592,17 @@ const HLJS = function(hljs) { const sorted = results.sort((a, b) => { // sort base on relevance - return b.relevance - a.relevance; + if (a.relevance != b.relevance) return b.relevance - a.relevance; + + // always award the tie to the base language + // ie if C++ and Arduino are tied, it's more likely to be C++ + if (a.language && b.language) { + if (getLanguage(a.language).supersetOf === b.language) { + return 1; + } else if (getLanguage(b.language).supersetOf === a.language) { + return -1; + } + } // otherwise say they are equal, which has the effect of sorting on // relevance while preserving the original ordering - which is how ties diff --git a/src/languages/arduino.js b/src/languages/arduino.js index d9195672af..a706ad6ff5 100644 --- a/src/languages/arduino.js +++ b/src/languages/arduino.js @@ -105,6 +105,7 @@ export default function(hljs) { ARDUINO.name = 'Arduino'; ARDUINO.aliases = ['ino']; + ARDUINO.supersetOf = "cpp"; return ARDUINO; } From 59a9b0a38a9f1ca3848ecfbed78ea3329d0898ed Mon Sep 17 00:00:00 2001 From: Josh Goebel Date: Wed, 11 Nov 2020 16:53:46 -0500 Subject: [PATCH 8/9] fix lint --- src/highlight.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/highlight.js b/src/highlight.js index 16889eeef8..f50c39b277 100644 --- a/src/highlight.js +++ b/src/highlight.js @@ -592,7 +592,7 @@ const HLJS = function(hljs) { const sorted = results.sort((a, b) => { // sort base on relevance - if (a.relevance != b.relevance) return b.relevance - a.relevance; + if (a.relevance !== b.relevance) return b.relevance - a.relevance; // always award the tie to the base language // ie if C++ and Arduino are tied, it's more likely to be C++ From 1f7d6d7eeba6c0a88b94dce6071b56efa3db2c38 Mon Sep 17 00:00:00 2001 From: Josh Goebel Date: Wed, 11 Nov 2020 16:55:22 -0500 Subject: [PATCH 9/9] lint --- src/highlight.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/highlight.js b/src/highlight.js index f50c39b277..c4e2f6ddb5 100644 --- a/src/highlight.js +++ b/src/highlight.js @@ -608,6 +608,7 @@ const HLJS = function(hljs) { // relevance while preserving the original ordering - which is how ties // have historically been settled, ie the language that comes first always // wins in the case of a tie + return 0; }); const [best, secondBest] = sorted;