Генерируйте симпатичный различный HTML в Python

'Друг' понятие полезен в Java, например, для разделения API от его реализации. Классам реализации свойственно должно получить доступ к внутренностям класса API, но они не должны быть представлены клиентам API. Это может быть достигнуто с помощью 'Друга Средство доступа' шаблон, как детализировано ниже:

класс представил через API:

package api;

public final class Exposed {
    static {
        // Declare classes in the implementation package as 'friends'
        Accessor.setInstance(new AccessorImpl());
    }

    // Only accessible by 'friend' classes.
    Exposed() {

    }

    // Only accessible by 'friend' classes.
    void sayHello() {
        System.out.println("Hello");
    }

    static final class AccessorImpl extends Accessor {
        protected Exposed createExposed() {
            return new Exposed();
        }

        protected void sayHello(Exposed exposed) {
            exposed.sayHello();
        }
    }
}

класс, предоставляющий 'другу' функциональность:

package impl;

public abstract class Accessor {

    private static Accessor instance;

    static Accessor getInstance() {
        Accessor a = instance;
        if (a != null) {
            return a;
        }

        return createInstance();
    }

    private static Accessor createInstance() {
        try {
            Class.forName(Exposed.class.getName(), true, 
                Exposed.class.getClassLoader());
        } catch (ClassNotFoundException e) {
            throw new IllegalStateException(e);
        }

        return instance;
    }

    public static void setInstance(Accessor accessor) {
        if (instance != null) {
            throw new IllegalStateException(
                "Accessor instance already set");
        }

        instance = accessor;
    }

    protected abstract Exposed createExposed();

    protected abstract void sayHello(Exposed exposed);
}

доступ В качестве примера от класса в 'друге' пакет реализации:

package impl;

public final class FriendlyAccessExample {
    public static void main(String[] args) {
        Accessor accessor = Accessor.getInstance();
        Exposed exposed = accessor.createExposed();
        accessor.sayHello(exposed);
    }
}
29
задан The Unknown 16 October 2009 в 06:39
поделиться

4 ответа

Там diff_prettyHtml () в diff-match-patch ] библиотека от Google.

29
ответ дан 28 November 2019 в 01:34
поделиться

Обычно, если вы хотите, чтобы какой-то HTML отображался более красивым способом, вы делаете это, добавляя CSS.

Например, если вы генерируете HTML такой:

import difflib
import sys

fromfile = "xxx"
tofile = "zzz"
fromlines = open(fromfile, 'U').readlines()
tolines = open(tofile, 'U').readlines()

diff = difflib.HtmlDiff().make_file(fromlines,tolines,fromfile,tofile)

sys.stdout.writelines(diff)

тогда вы получите зеленый фон на добавленных строках, желтый на измененных строках и красный на удаленных. Если бы я делал это, я бы взял сгенерированный HTML, извлек бы тело, и добавлю к нему мой собственный рукописный блок HTML с большим количеством CSS, чтобы он выглядел хорошо. Я бы также, вероятно, вырезал таблицу легенды и переместил ее наверх или поместил в div, чтобы CSS мог это сделать.

На самом деле, я бы серьезно подумал о том, чтобы просто исправить модуль diffflib (который написан на python), чтобы сгенерировать лучший HTML и внести его обратно в проект. Если у вас есть эксперт по CSS, который может вам помочь, или вы сами являетесь одним из них, подумайте об этом.

20
ответ дан 28 November 2019 в 01:34
поделиться

попробуйте сначала очистить оба HTML с помощью lxml.html и проверить разницу с помощью difflib

0
ответ дан 28 November 2019 в 01:34
поделиться

Копия моего собственного ответа из здесь .


А как насчет DaisyDiff ( Java и PHP доступны версии).

Следующие функции действительно хороши:

  • Работает с плохо сформированным HTML, который можно найти «в дикой природе».
  • Различия более специализированы на HTML, чем на XML-дереве. Изменение части текстового узла не приведет к изменению всего узла.
  • В дополнение к визуальному различию по умолчанию, исходный HTML-код может быть согласован.
  • Предоставляет легкие для понимания описания изменений.
  • графический интерфейс по умолчанию позволяет легко просматривать изменения с помощью сочетаний клавиш и ссылок.
0
ответ дан 28 November 2019 в 01:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: