Вы можете визуализировать любой график с помощью чистого javascript! Это руководство не предназначено для визуализации схемы, его можно применить к любому графу, который вы хотите.

Что такое AAG-Visualizer? Это элегантный визуализатор, который может конвертировать сложный формат схемы, такой как AIGER (трудный для понимания человеком), в простой и красивый .svg одним щелчком мыши.

Вдохновленный финальным проектом «Fraig» раздела Структура данных и программирование (проведенного профессором Риком Хуангом) на факультете электротехники Тайваньского национального университета.

Краткое введение Fraig и AAG

Что делает FRAIG?

Он функционально сокращает график И-инвертора, делая схему как можно меньше.

Все еще не знаете, что это? Посмотрите картинку ниже, и вы все поймете.

Что такое AAG?

Это выглядит так:

aag 8 2 0 2 2
2
4
9
10
8 3 16
10 5 2
c
generated by Byron Hsu

Подробнее см. Краткое руководство по формату Aiger.

Необязательно разбираться в этом досконально. Что вам нужно знать, так это то, что это просто формат And-Inverter Graph.

Хорошо, давайте перейдем к теме. Как мне преобразовать .aag в .svg в браузере?

Структура приложения

.
├── .gitignore
├── README.md
├── package.json
├── public
│   ├── bundle.js
│   ├── index.html
│   └── assets/
├── server
│   ├── config.js
│   └── server.js
├── src
│   ├── assets
│   ├── js
│   │   └── animate.js
│   │   └── parser.js
│   ├── scss
│   │   └──  index.scss
│   ├── index.js
│   └── template.html
├── webpack.dev.config.js
└── webpack.prod.config.js

Viz.js

Краткое введение в Viz.js

Этот проект представляет собой Makefile для создания Graphviz с Emscripten и простую оболочку для его использования в браузере - супербыстрый и удобный способ рисования графиков в браузере. Если вы хотите узнать больше о Viz.js, загляните в официальную документацию.

  • Установить
npm install viz.js
  • Базовое использование в javascript
// format ofi .dot
let digraph = 'digraph { a -> b; }';
// for svg
let svgXml = Viz(digraph, { format: "svg"});
document.body.innerHtml = svgXml;
// for img-element
let img-element = Viz(digraph, { format: "png-image-element"});
document.body.append(img-element);
  • Настройка

Что еще? Вы можете настроить цвет узла, ширину вершины и т. Д. На графике. Просто засучите рукава и измените стиль по своему желанию. См. документацию здесь.

Это так просто.

Теперь нам нужно только проанализировать наш ввод в файл .dot. И мы видим, как наша строка волшебным образом превращается в красивую схему .svg!

Парсер

  • parser.js

Используйте мощь regexp в javascript, и вы легко сможете разобрать что угодно. Просмотрите этот фантастический учебник: JavaScript: изучение регулярных выражений для начинающих.

Ввиду разного формата ввода необходимо иметь свой парсер; поэтому я пропускаю часть обсуждения того, как их разбирать. Однако я считаю, что если вы умеете правильно использовать регулярное выражение, это не имеет большого значения.

//parser.js
function parser(args...){
}
export default parser;

Комбинировать

import parser from './js/parser.js'
// format of .dot
let digraph = parser(data);
//for svg
let svgXml = Viz(digraph, { format: "svg"});
document.body.innerHtml = svgXml;
//for img-element
let img-element = Viz(digraph, { format: format: "png-image-element"});
document.body.append(img-element);

Наслаждайтесь фантастической графикой, которую вы строите!

Animate.css

Краткое введение в animate.css

Очень простая библиотека для создания фантастической анимации на dom-объекте. Если вы хотите узнать больше о a nimate.css, загляните в официальную документацию.

  • Установить
<head>
  <!-- animate.css -->
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/animate.css/3.5.2/animate.min.css">
  <!-- jquery -->
  <script
	src="https://code.jquery.com/jquery-3.1.1.min.js"
	integrity="sha256-hVVnYaiADRTO2PzUGmuLJr8BLUSjGIZsDYGmIJLv2b8="
	crossorigin="anonymous"></script>
</head>
  • Основное использование
// animate.js
$.fn.extend({
    animateCss: function (animationName, callback) {
        let animationEnd = 'webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend';
        this.addClass('animated ' + animationName).one(animationEnd, function() {
            $(this).removeClass('animated ' + animationName);
            if (callback) {
              callback();
            }
        });
        return this;
    }
});
// index.js
// load animate.js in advance for repeated animation
import './js/animate.js'
document.getElementById('container').animateCss('shake');

Реализация

Моя цель - добавить анимацию «встряхивания» на кнопке визуализации при неправильном формате. И добавьте к нему анимацию «сжатия», когда он будет успешно визуализирован.

Как это сделать? Это невероятно просто. Вам не нужно писать много ключевых кадров и какие-то раздражающие вещи. Просто позвоните animateCss, и волшебство произойдет.

  • Кнопка "Визуализировать"
// index.js
function handleFileSelected(event) {
	...
	if(input.files.length === 0) { // no file in <input>
		$('#btn').animateCss('shake');
		return;
	}else
	if(!/.aag/g.test(input.files[0].name)){ // format is wrong
		$('#btn').animateCss('shake');
		return;
	}
	...
	// Right format and ready to visualize
	$('#btn').animateCss('rubberBand');
}
document.getElementById('btn').addEventListener('click', handleFileSelected);

Напишите 10 строк кода и произведите впечатление на всех пользователей, которые зайдут на ваш сайт. Почему нет ?

❤ Если этот пост был полезен, ударьте сердечко!

И не забудьте поставить звездочку моему репо ✨: AAG-Visualizer.

Приветствуется любой пиар и выпуск!

Вы можете клонировать из Github, загрузить любой файл .aag в папки с примерами и дождаться волшебных моментов.

git clone https://github.com/ByronHsu/AAG-Visualizer.git

Надеюсь, ты повеселишься!

Моя ссылка на GitHub: https://github.com/ByronHsu/