Проект преобразования Freemind в JSON в Protovis xlst

У меня есть очень простая таксономия, которую я редактирую в freemind, и я хочу визуализировать ее в protovis как визуализацию солнечных лучей. Глубина таксономии неизвестна.

Я предпринял попытку создать преобразование XLST, которое можно использовать с экспортом Freemind с помощью функций сценария xsl - для вывода данных в точном формате JSON, необходимом Protovis для создания солнечных лучей - идея заключается в том, что в javascript не требуется никаких дополнительных преобразований.

Пример выходного формата JSON, который я ищу, находится здесь: http://mbostock.github.com/protovis/ex/sunburst.html

По сути, входным файлом является формат файла Freemind .mm.

Запуск моего альфа-кода (показанного ниже) в stylus studio создает формат json (плохо отформатированный, но кажется законным), который хорошо передает protovis, когда я сохраняю вывод, созданный из stylus studio, непосредственно в файл .js вручную. По какой-то причине Freemind не экспортирует данные с помощью этого кода...

Есть что-то, что мне не хватает? Любая помощь приветствуется.

Большое спасибо, Андрей

===========ОБНОВЛЕНИЕ=============

Я исправил код, проблема заключалась в том, что некоторые из моих xsl не поддерживались движком xslt, используемым freemind. Я поправил код и перенес его на гитхаб под либеральной лицензией, а отсюда удалил.

Адаптер доступен здесь: https://github.com/minkymorgan/Freemind2JSON#readme

  • Эндрю

person Minkymorgan    schedule 03.02.2012    source источник
comment
Как насчет того, чтобы написать конвертер, а затем получить здесь помощь с кодом? Так вы получите больше ответов.   -  person Andrew Cowenhoven    schedule 03.02.2012
comment
:-) Я уверен, что да, и я начинаю с этого. Просто спрашиваю, сделано ли это, прежде чем я пойду изобретать велосипед. А   -  person Minkymorgan    schedule 03.02.2012


Ответы (2)


Вот моя попытка. Я взял за основу вашу версию и добавил еще несколько функций.

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text"/>

    <xsl:template match="/map">
        <xsl:text>var Map = {
</xsl:text>
        <xsl:apply-templates select="node">
            <xsl:with-param name="indent">
                <xsl:text>    </xsl:text>
            </xsl:with-param>
        </xsl:apply-templates>
        <xsl:text>
};
</xsl:text>
    </xsl:template>

    <xsl:template match="node">
        <xsl:param name="indent"/>
        <xsl:if test="position() != 1">
            <xsl:text>,
</xsl:text>
        </xsl:if>
        <xsl:value-of select="$indent"/>
        <xsl:text>"</xsl:text>
        <xsl:call-template name="escape-javascript">
            <xsl:with-param name="string"
                select="descendant-or-self::node/@TEXT"/>
        </xsl:call-template>
        <xsl:text>": </xsl:text>
        <xsl:choose>
            <xsl:when test="node">
                <xsl:text>{
</xsl:text>
                <xsl:apply-templates select="node">
                    <xsl:with-param name="indent">
                        <xsl:value-of select="$indent"/>
                        <xsl:text>    </xsl:text>
                    </xsl:with-param>
                </xsl:apply-templates>
                <xsl:text>
</xsl:text>
                <xsl:value-of select="$indent"/>
                <xsl:text>}</xsl:text>
            </xsl:when>
            <xsl:otherwise>
                <xsl:text>10</xsl:text>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:template>

    <!--
        Javascript string escape template by Jeni Tennison
        Source: http://holytshirt.blogspot.com/2008/06/xslt-javascript-escaping.html
        Author page: http://www.jenitennison.com/
    -->
    <xsl:template name="escape-javascript">
        <xsl:param name="string" />
        <xsl:choose>
            <xsl:when test='contains($string, "&apos;")'>
                <xsl:call-template name="escape-javascript">
                    <xsl:with-param name="string"
                        select='substring-before($string, "&apos;")' />
                </xsl:call-template>
                <xsl:text>\'</xsl:text>
                <xsl:call-template name="escape-javascript">
                    <xsl:with-param name="string"
                        select='substring-after($string, "&apos;")' />
                </xsl:call-template>
            </xsl:when>
            <xsl:when test="contains($string, '&#xA;')">
                <xsl:call-template name="escape-javascript">
                    <xsl:with-param name="string"
                        select="substring-before($string, '&#xA;')" />
                </xsl:call-template>
                <xsl:text>\n</xsl:text>
                <xsl:call-template name="escape-javascript">
                    <xsl:with-param name="string"
                        select="substring-after($string, '&#xA;')" />
                </xsl:call-template>
            </xsl:when>
            <xsl:when test="contains($string, '\')">
                <xsl:value-of select="substring-before($string, '\')" />
                <xsl:text>\\</xsl:text>
                <xsl:call-template name="escape-javascript">
                    <xsl:with-param name="string"
                        select="substring-after($string, '\')" />
                </xsl:call-template>
            </xsl:when>
            <xsl:otherwise><xsl:value-of select="$string" /></xsl:otherwise>
        </xsl:choose>
    </xsl:template>
</xsl:stylesheet>

При запуске на Тестовый файл Freemind, он выдает следующий результат:

var Map = {
    "Notetest": {
        "Notetest": 10,
        "This is a node": {
            "with a linbreak \n subnode": 10,
            "and another subnode": 10,
            "and some folded subnodes": {
                "fold1": 10,
                "fold2": 10,
                "fold3": 10
            }
        },
        "Attributes": 10
    }
};
person Markus Jarderot    schedule 04.02.2012
comment
Эй, это здорово, я проверю это. Спасибо. - person Minkymorgan; 04.02.2012
comment
Привет MizardX, я сделал несколько тестов. Хотя ваш код выглядит намного лучше, чем мой, я все еще не могу отрисовать графику Protvis, где мои элементарные усилия связаны с визуализацией с его помощью. Пока не уверен, почему, но буду изучать это дальше. Имейте в виду, что вчера я изучил XLST, поэтому уделите мне немного времени, чтобы понять, работает ли ваш код. - person Minkymorgan; 05.02.2012
comment
Как это было с этим? Вы нашли проблему? - person Markus Jarderot; 12.02.2012
comment
Я думаю так. Проблема не столько в вашей конверсии, сколько в коде protovis, который я использую. Поправки можно было вносить в любом месте. Пока protovis может читать json, вы можете манипулировать данными там. - person Minkymorgan; 25.02.2012
comment
(извините, мой комментарий обрезан, вот остальная часть моей мысли) ... в javascript. Таким образом, ваше преобразование отлично подходит для тех, кто создает новые шаблоны protovis, d3.js, поскольку результат будет чище, чем мои усилия. Мои рудиментарные усилия также работают со стандартной компоновкой солнечных лучей, и я получаю то, что мне нужно, поэтому у меня не было необходимости идти дальше с этим. Но спасибо за вашу помощь и вклад, так как я многому научился, читая ваш xlst. - person Minkymorgan; 25.02.2012

Если интересно... Я только что выложил XSLT-скрипт для преобразования FreeMind в JSON. Мой скрипт немного проще и еще не поддерживает экранирование Javascript.

Он также не предназначен для использования в Protovis.

person Tony O'Hagan    schedule 01.12.2012