Почему Prettify использует стандартное регулярное выражение, даже когда я добавляю пользовательское регулярное выражение для PR_TYPE в отдельный обработчик языка? - PullRequest
0 голосов
/ 31 марта 2019

Я пытаюсь написать Дополнительный обработчик языка Google Prettify для Qiskit , для реализации в Quantum Computing Stack Exchange раздвоил код-prettify репозиторий и добавил lang-qiskit.js :

PR['registerLangHandler'](
    PR['createSimpleLexer'](
        [   
            // plain text
            [PR['PR_PLAIN'],       /^\s+/, null, ' \r\n\t\xA0'],
            // string literals
            [PR['PR_STRING'],      /^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/, null],
        ],
        [   // hash comments 
            [PR['PR_COMMENT'],    /^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/, null, '#'],
            // Python v3.7.3 keywords
            [PR['PR_KEYWORD'],     /\b(?:False|None|True|and|as|assert|async|await|break|class|continue|def|del|elif|else|except|finally|for|from|global|if|import|in|is|lambda|nonlocal|not|or|pass|raise|return|try|while|with|yield)\b/],
            // valid class names
            [PR['PR_TYPE'],        /^(?:[@_]?[a-zA-Z]+[a-zA-Z0-9][A-Za-z_$@0-9]*|\w+_t\b)/, null],
            // valid literals
            [PR['PR_LITERAL'],     /^(?:0x[a-f0-9]+|(?:\d(?:_\d+)*\d*(?:\.\d*)?|\.\d\+)(?:e[+\-]?\d+)?)[a-z]*/],
            // valid variable names
            [PR['PR_PLAIN'],       /^[a-zA-Z_$][a-zA-Z_$0-9]*/],
    ]),
['qiskit']);

Я считаю, PR_TYPE regex - это то, что обрабатывает имена классов (например, в Python).Поскольку Переполнение стека также использует Google Prettify , я приведу пример:

from qiskit import QuantumRegister, ClassicalRegister, U3Gate
from qiskit.extensions.simulator import wait

Вы заметите, что при выделении QuantumRegister, ClassicalRegister, U3Gate иwait нет.Это потому, что регулярное выражение PR_TYPE равно ^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b) ( regex101 link ), которое не допускает слова, начинающиеся с нижнего регистра, или слова, содержащие цифру в середине.Я изменил это регулярное выражение на ^(?:[@_]?[a-zA-Z]+[a-zA-Z0-9][A-Za-z_$@0-9]*|\w+_t\b) ( regex101 link ), как вы можете заметить в моем первом фрагменте выше.

Теперь, когда я запускаю следующий файл Javascript в соответствии с инструкциями на странице Prettify Getting Started (т.е. с <script src="https://cdn.jsdelivr.net/gh/BlueStackExchange/code-prettify@master/loader/run_prettify.js?lang=qiskit&amp;skin=sunburst"></script> в заголовке) Я все еще вижу, что U3Gateи wait не выделяются .

<code><script src="https://cdn.jsdelivr.net/gh/BlueStackExchange/code-prettify@master/loader/run_prettify.js?lang=qiskit&amp;skin=sunburst"></script>
<?prettify lang=qiskit?>
<pre class="prettyprint qiskit">
from qiskit import QuantumCircuit, QuantumRegister, ClassicalRegister, U3Gate, wait

def build_bell_circuit():
    """Returns a circuit putting 2 qubits in the Bell state."""
    q = QuantumRegister(2)
    c = ClassicalRegister(2)
    qc = QuantumCircuit(q, c)
    qc.h(q[0])
    qc.cx(q[0], q[1])
    qc.measure(q, c)
    x = 3 + 4j
    return qc
    await async
# Create the circuit
bell_circuit = build_bell_circuit()

# Use the internal .draw() to print the circuit
print(bell_circuit)

Вот соответствующий выделенный код:

enter image description here

Вы можете запустить это и проверить это сами здесь .

Итак, в основном мой вопрос: почему Prettify все еще использует регулярное выражение для PR_TYP, хотя я включил модифицированное регулярное выражение в дополнение ?Как мне это исправить?

...