LINUX.ORG.RU

В Chromium highlight.pack.js и combined.css неправильно отображают Haskell

 


1

2

Для теста — пять строчек

module A (a, b, c) where
import A (a, b, c)
data A = A { _a :: Int }
newtype A = A (B ())
foreign import ccall "a" a :: A (B ())

помещаются в [ code = haskell ]:

module A (a, b, c) where
import A (a, b, c)
data A = A { _a :: Int }
newtype A = A (B ())
foreign import ccall "a" a :: A (B ())

при включённых highlight.pack.js и combined.css у меня они разбиваются на куски (http://i.imgur.com/RNg2WCf.png), хромиум 28, происходит во всех темах, если посмотреть по форуму — уже существующий код тоже плохо отображается (пример — Haskell импорт сишных структур), при копировании обратно в редактор всё отображается нормально, то есть проблема в css который добавляет highlight.pack.js:

<code class="haskell"><span class="module"><span class="keyword">module</span> A <span class="container">(<span class="title">a</span>, <span class="title">b</span>, <span class="title">c</span>)</span> <span class="keyword">where</span></span>
<span class="import"><span class="keyword">import</span> A <span class="container">(<span class="title">a</span>, <span class="title">b</span>, <span class="title">c</span>)</span></span>
<span class="typedef"><span class="keyword">data</span> <span class="type">A</span> = <span class="type">A</span> <span class="container">{ <span class="title">_a</span> :: <span class="type">Int</span> }</span></span>
<span class="typedef"><span class="keyword">newtype</span> <span class="type">A</span> = <span class="type">A</span> <span class="container">(<span class="type">B</span> ()</span>)</span>
<span class="title">foreign</span> <span class="import"><span class="keyword">import</span> ccall "a" a :: A <span class="container">(<span class="type">B</span> ()</span>)</span>
</code>

исправляется устранением

.container:before, .container:after {
    content: "";
    display: table;
}

К слову:

k: "let in if then else case of where do module import hiding qualified type data newtype deriving class instance not as foreign ccall safe unsafe"

not тут лишний (это функция) — http://www.haskell.org/haskellwiki/Keywords.

----

import qualified A.B.C as A.B hiding (a, {- ... -} B(..), c) --
data family A = A { {- ... -} _a :: {-# UNPACK #-} !Int -- ...
#if __Q__
                  , _a :: C -- ...
#endif
                  } deriving (Foo) -- ...
newtype A = A (B ()) {- ... -}
  deriving (Foo) {-
type A a b = B (C a b) -}
class family (B a) => {- ... -} A a where -- ...
class instance Bar {- ... -} where -- ...
a :: forall a. a -- ...
{-# INLINE a #-}
a = not >> mdo print 1 >> rec 1 '2' '\'' '\n' ':':' ':msg >> proc 1 2 3 >> " -- ..."
    + importA 1
    + moduleA 1
    + classA 1
    + instanceA 1
    + dataA 1
    + newtypeA 1
    + typeA 1
    + defaultA 1
    + infixA 1
    + foreignA 1
    + whereA 1
    + doA 1
default Num {- ... -} ( Int ) -- ...
infix {- ... -} + 1 -- ...
foreign import ccall {- ... -} "a" a :: A (B ()) -- ...
#!/usr/bin/env runhaskell
#if __GLASGOW_HASKELL__
{-# LANGUAGE ... #-}
#endif
-- | ...
module A.B.C (a, {- ... -} B(..), c, -- ...
              d, -- ...
              e) {- ... -} where -- ...
{- ... -}
import qualified A.B.C as A.B hiding (a, {- ... -} B(..), c) --
data family A = A { {- ... -} _a :: {-# UNPACK #-} !Int -- ...
#if __Q__
                  , _a :: C -- ...
#endif
                  } deriving (Foo) -- ...
newtype A = A (B ()) {- ... -}
  deriving (Foo) {-
type A a b = B (C a b) -}
class family (B a) => {- ... -} A a where -- ...
class instance Bar {- ... -} where -- ...
a :: forall a. a -- ...
{-# INLINE a #-}
a = not >> mdo print 1 >> rec 1 '2' '\'' '\n' ':':' ':msg >> proc 1 2 3 >> " -- ..."
    + importA 1
    + moduleA 1
    + classA 1
    + instanceA 1
    + dataA 1
    + newtypeA 1
    + typeA 1
    + defaultA 1
    + infixA 1
    + foreignA 1
    + whereA 1
    + doA 1
default Num {- ... -} ( Int ) -- ...
infix {- ... -} + 1 -- ...
foreign import ccall {- ... -} "a" a :: A (B ()) -- ...
★★★★

Последнее исправление: quasimoto (всего исправлений: 1)

Как красиво написать, что тэги экранируются вторыми скобачками? [code] [[code]]

hizel ★★★★★
()

да, это уже вторая проблема в этом районе — наши имена css классов конфликтуют с теми что использует highlight. Поправим.

maxcom ★★★★★
()
Ответ на: комментарий от hizel

Контейнеры ('container') вовсе не в хаскеле а в этом самом src/languages/haskell.js.

$script('/js/highlight.pack.js', function() {

  hljs.LANGUAGES.haskell=function(f){var g={cN:"hljs_hs_type",b:"\\b[A-Z][\\w']*",r:0};var h={cN:"hljs_hs_container",b:"\\(",e:"\\)",c:[{cN:"hljs_hs_type",b:"\\b[A-Z][\\w]*(\\((\\.\\.|,|\\w+)\\))?"},{cN:"hljs_hs_title",b:"[_a-z][\\w']*"}]};var e={cN:"hljs_hs_container",b:"{",e:"}",c:h.c};return{k:"let in if then else case of where do module import hiding qualified type data newtype deriving class instance as default infix infixl infixr foreign export ccall stdcall cplusplus jvm dotnet safe unsafe family forall mdo proc rec",c:[{cN:"hljs_hs_comment",b:"--",e:"$"},{cN:"hljs_hs_preprocessor",b:"{-#",e:"#-}"},{cN:"hljs_hs_comment",c:["self"],b:"{-",e:"-}"},{cN:"hljs_hs_string",b:"\\s+'",e:"'",c:[f.BE],r:0},f.QSM,{cN:"hljs_hs_import",b:"\\bimport",e:"$",k:"import qualified as hiding",c:[h],i:"\\W\\.|;"},{cN:"hljs_hs_module",b:"\\bmodule",e:"where",k:"module where",c:[h],i:"\\W\\.|;"},{cN:"hljs_hs_class",b:"\\b(class|instance)",e:"where",k:"class where instance",c:[g]},{cN:"hljs_hs_typedef",b:"\\b(data|(new)?type)",e:"$",k:"data type newtype deriving",c:[g,h,e]},f.CNM,{cN:"hljs_hs_shebang",b:"#!\\/usr\\/bin\\/env runhaskell",e:"$"},g,{cN:"hljs_hs_title",b:"^[_a-z][\\w']*"}]}}(hljs);

  hljs.initHighlightingOnLoad();
});

так hljs.LANGUAGES.haskell переписывается функцией у которой hljs_hs_container который уже не конфликтует с container.

quasimoto ★★★★
() автор топика
Ответ на: комментарий от quasimoto

Нет, так не честно: для каскеля придется свой style.css делать и вообще. Если делать то приставку ко всем классам во всех языках, я считаю!

hizel ★★★★★
()
Ответ на: комментарий от hizel

Если делать то приставку ко всем классам во всех языках, я считаю!

И это правильно! Библиотечный код должен подстраиваться и делать хорошо, а не наоборот. Но кто это будет делать?

Проще всего проблема решается (ключевое слово :)) добавлением

hljs.LANGUAGES.haskell=function(g){var e={cN:"haskell_comment",b:"--",e:"$"};var c={cN:"haskell_comment",c:["self"],b:"{-",e:"-}"};var b={cN:"haskell_pragma",b:"{-#",e:"#-}"};var a={cN:"haskell_preprocessor",b:"^#",e:"$"};var f={cN:"haskell_variable",b:"^[_a-z][\\w']*"};var i={cN:"haskell_constructor",b:"\\b[A-Z][\\w']*",r:0};var h={cN:"haskell_list",b:"\\(",e:"\\)",i:'"',c:[b,e,c,a,{cN:"haskell_constructor",b:"\\b[A-Z][\\w]*(\\((\\.\\.|,|\\w+)\\))?"},f]};var d={cN:"haskell_record",b:"{",e:"}",c:h.c};return{k:"let in if then else case of where do module import hiding qualified type data newtype deriving class instance as default infix infixl infixr foreign export ccall stdcall cplusplus jvm dotnet safe unsafe family forall mdo proc rec",c:[{cN:"haskell_module",b:"\\bmodule ",e:"where",k:"module where",c:[h,c],i:"\\W\\.|;"},{cN:"haskell_import",b:"\\bimport ",e:"$",k:"import qualified as hiding",c:[h,e,c],i:"\\W\\.|;"},{cN:"haskell_class",b:"\\b(class |instance )",e:"where",k:"class family instance where",c:[i,h,c]},{cN:"haskell_type",b:"\\b(data |(new)?type )",e:"$",k:"data family type newtype deriving",c:[i,h,d,e,c]},{cN:"haskell_default",b:"\\bdefault ",e:"$",k:"default",c:[i,h,e,c]},{cN:"haskell_infix",b:"\\b(infix |infixl |infixr )",e:"$",k:"infix infixl infixr",c:[g.CNM,e,c]},{cN:"haskell_foreign",b:"\\bforeign ",e:"$",k:"foreign import export ccall stdcall cplusplus jvm dotnet safe unsafe",c:[i,g.QSM,e,c]},{cN:"haskell_shebang",b:"#!\\/usr\\/bin\\/env runhaskell",e:"$"},b,e,c,a,g.QSM,g.CNM,i,f,{b:"->|<-"}]}}(hljs);

из моей сборки (чтобы уж вообще весь форк не использовать) перед hljs.initHighlightingOnLoad();

Минимальный css для танго я написал в test.html — могу написать не минимальный для всех тем и потестировать.

quasimoto ★★★★
() автор топика
Ответ на: комментарий от maxcom

Что-то опять не то. OP и вот ещё — Какие есть годные языки с производительностью на уровне C? (комментарий), .container опять портит вид :) Ещё по последней ссылке pragma распознаётся как container и два комментария в import не распознаются — это мелкие баги в самой highlight.js, у меня (http://github.com/treep/highlight.js-build) они исправлены, выглядит как-то так — http://treep.github.io/highlight.js-build/ (августовский combined.css).

quasimoto ★★★★
() автор топика
Ответ на: комментарий от quasimoto

я все равно не понял что имеено сломалось. Я лечил лишние переводы строк которые из-за .container появлялись, этого вроде больше нет

maxcom ★★★★★
()
Ответ на: комментарий от maxcom

Переводов нет, но теперь есть лишние пробелы/отступы — на первых двух картинках видно, и это тоже из-за .container, то есть если его отключить, то эти отступы пропадают (так же как пропадали переносы).

Остальное — на третьей картинке вообще не работает подсветка, на четвёртой — char убивает подсветку до конца кода, комментарии не всегда распознаются, ключевые слова распознаются когда не надо. Но это всё уже проблемы в самой highlight.js.

quasimoto ★★★★
() автор топика
Последнее исправление: quasimoto (всего исправлений: 1)
20 ноября 2013 г.
Ответ на: комментарий от maxcom

Вот сейчас вроде нормально выглядит по части отсутствия отступов и переносов.

В highlight.js 7.5 Haskell обновился — должно начать лучше подсвечивать. И в 8.0 планируется сделать hljs- префиксы ко всем классам (во всех темах в т.ч.), так что по идее конфликты должны исчезнуть.

quasimoto ★★★★
() автор топика
Ответ на: комментарий от quasimoto

надо будет обновить. Не хочешь кстати сам этим заняться? Наши исходники на github'е, список языков которые надо включить там тоже где-то есть

maxcom ★★★★★
()
Ответ на: комментарий от maxcom

Несколько вопросов:

1. Были какие-то проблемы в том чтобы добавить поддержку всех языков из highlight.js? Или все просто не нужны? Тогда почему бы не включить ещё D, OCaml, Rust, Clojure, F#, R, JSON, Makefile?

2. Почему нет

.put("c++", "language-cpp")

в CodeTag.java чтобы делать [code=c++]?

3. toLowerCase там же, чтобы [code=Java] работало как и [code=java]?

quasimoto ★★★★
() автор топика
Ответ на: комментарий от quasimoto

Проблем небыло. Настроили то, что просили добавить в подсветку, не хотелось за зря увеличивать размер js.

Про C++ не знаю, добавь если считаешь что нужно. Возможно парсер лоркода не любит неалфавитные символы, надо проверить заработает или нет.

Lowercase не помешает, можно добавить.

maxcom ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.