Тэг [graphviz]
От: Lazy Cjow Rhrr Россия lj://_lcr_
Дата: 29.11.06 17:17
Оценка: 83 (11) +5
Привет всем!

В свете повторно всплывшей темы про раскраску ещё кучи языков, я не мог обойти вниманием очень интересный и нужный (практически всем) язык. (Любопытный парадокс заключается в том, что чем больше человек владеет этим языком, тем больше он ему нужен).
Взгляните на это убожество:
  (A)
  / |
 v  |
(B) |
 |  |
  v v
  (C)

А теперь посмотрите в окно — на дворе 21-й век. А мы как в старые добрые времена БК и Спектрумов рисуем псевдографикой... Есть ли альтернатива? (Ну кроме конечно графических редакторов).

Есть! GraphViz — инструментальная программа, которая принимает на вход описание графа, а выдаёт картинку с этим графом. Пользуется большой популярностью, используется в куче инструментов в качестве движка для создания диаграмм (например doxygen).

Пора от рекламных лозунгов перейти к делу
SourceResult
digraph
{
// feel the difference!
size="1,2"
A->B
B->C
A->C
}
digraph
{
size="2,5"; // maximum size in inches
S0 -> S0 [ label = "0.5"];
S0 -> S1 [ label = "0.3"];
S0 -> S2 [ label = "0.1"];
S1 -> S0 [ label = "0.2"];
}
digraph G 
{
size ="4,4"; // size in inches
main [shape=box];

main -> parse [weight=8];
parse -> execute;
main -> init [style=dotted];
main -> cleanup;
execute -> { make_string; printf}
init -> make_string;
edge [color=red]; // so is this
main -> printf [style=bold,label="100 times"];
make_string [label="make a\nstring"];
node [shape=box,style=filled,color=".7 .3 1.0"];
execute -> compare;
}
// Something complicated
digraph structs
{
node [shape=record, fontsize=9];
struct1 [shape=record,
    label="<f0> left|<f1> middle|<f2> right"];
struct2 [shape=record,
    label="<f0> one|<f1> two"];
struct3 [shape=record,
    label="hello\nworld |{ b |{c|<here> d|e}| f}| g | h"];
struct1:f1 -> struct2:f0;
struct1:f2 -> struct3:here;
}
// At last, UML!
digraph G {
fontname = "Verdana";
fontsize = 7;

node [
    fontname = "Verdana"
    fontsize = 7
    shape = "record"
    width = 1
]

edge [
    fontname = "Verdana"
    fontsize = 7
]

Animal [
    label = 
"{Animal|+ name : string\l+ age : int\l|+ die() : void\l}"
]

subgraph clusterAnimalImpl {
    label = "Package animal.impl"

    Dog [
        label = "{Dog||+ bark() : void\l}"
    ]

    Cat [
        label = "{Cat||+ meow() : void\l}"
    ]
}

edge [
    arrowhead = "empty"
]

Dog -> Animal
Cat -> Animal

edge [
    arrowhead = "none"

    headlabel = "0..*"
    taillabel = "0..*"
]

Dog -> Cat
}
После такого вступления моё пожелание совсем нетрудно предугадать: ввести тэг [graphviz]:
[graphviz] ... здесь определение графа ... [/graphviz]

который бы преобразовывал текст в картинку и вставлял картинку в сообщение.

Пожалуйста, высказывайтесь, что вы думаете об этом.

PS:
Кстати (надо же какое совпадение!) буквально вчера я наткнулся на ajax-сервис (написан на Руби) http://ashitani.jp/gv/
Можно зайти, поиграться. Есть несколько особенностей, о которых можно глянуть здесь. Кроме того, картинки генерятся в гифах, посему совсем не переливаются всеми цветами радуги. И остаётся открытым вопрос, насколько долго там хранятся сгенерированные картинки и можно вешать прямые линки отсюда прямо туда...
quicksort =: (($:@(<#[),(=#[),$:@(>#[)) ({~ ?@#)) ^: (1<#)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.