Всем бобра!
Сегодня пятница, а это значит время подводить итоги!

Продолжая темы нашего библиотечного клуба спешу немного порадовать всех причастных: я сделяль!

Спустя море потраченных нервных клеток, спустя ад документации по marc форматам, и кучу костылей я всё таки собрал относительно вменяемый (но пока с ужасным кодом :) ) конвертор (+обработчик +всё, на что хватит фантазии) для marc форматов.

https://github.com/HerzenLibRu/BatchMarc (обработчик, правила пишутся на js)

https://github.com/t0pep0/marc21 (библиотека на Go для работы с marc форматами)



Запускать можно вот так:
go run main.go inputFile.ldb outputFile.ldb rules.js

Правила применяются к каждой marc записи в файле.
Документация пока ещё не писалась, но у нас же все впереди? =)

Некоторые ньюансы библиотеки (а соответсвенно и конвертора):
  • подполя хранятся связным списком с сортировкой при добавлении (специфичные запросы от коллег не позволили использовать hashmap)
  • именование флагов лидера может Вам не понравится


Особености написания правил:
Когда Ваше правило начинает выполняться уже существует два объекта: orig и res — orig — оригинальная запись, res — то, что в итоге будет записанно в выходной файл и при старте Вашего правила res — пустой объект, только что инициализированный, в то время как orig заполнен данными

  function VariableSubField(name, data){
      this.Name = name;
      this.Data = data;
    }

    function VariableField(tag, indicatorOne, indicatorTwo) {
      this.Tag = tag;
      this.IndicatorOne = indicatorOne;
      this.IndicatorTwo = indicatorTwo;
      this.RawData = [];
      this.SubField = [];
    }

    function Leader() {
        this.Status = "";
        this.Type = "";
        this.BibLevel = "";
        this.ControlType = "";
        this.CharacterEncoding = "";
        this.IndicatorCount = "";
        this.SubfieldCodeCount = "";
        this.EncodingLevel = "";
        this.CatalogingForm = "";
        this.MultipartLevel = "";
        this.LengthOFFieldPort = "";
        this.StartCharPos = "";
        this.LengthImplemenDefine = "";
        this.Undefine = "";
    }

    function MarcRecord(){
      this.Leader = new Leader()
      this.VariableField = []
    };

    orig = new MarcRecord();
    res = new MarcRecord();


Когда Ваши правила отработают, Go заберет данные из res, и запишет их в файл.

Внимание! Код не оптимизирован, считайте что это минимальный жизнеспособный продукт.

Пример правил можете найти в репозитарии BatchMarc.

PullRequest, IssueRequest — принимаются

UPD: js для написания правил выбран как наиболее широко распростарненный (в библиотечной среде, в том числе) язык
Стоит ли на базе проекта создавать альтернативу OPAC\IRBIS?

Проголосовало 10 человек. Воздержалось 5 человек.

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.

Поделиться с друзьями
-->

Комментарии (6)


  1. Shaz
    17.06.2016 23:59

    Не факт что выйдет именно альтернатива OPAC\IRBIS, но развивать проект стоит.


  1. Shaz
    18.06.2016 13:33

    Кстати сейчас появилась мысль что возможно стоило разместить пост на самом Хабре.


    1. t0pep0
      18.06.2016 22:40

      В посте мало технических подробностей для Хабра, ИМХО


      1. Shaz
        19.06.2016 12:25

        Ну можно попробовать собрать обе статьи в одну, тогда подробностей вполне хватит. Имхо на хабре можно получить больший отклик и помощь в разработке.


        1. t0pep0
          20.06.2016 08:51

          Спасибо за совет, пожалуй так и сделаю, после того, как приведу код в порядок


          1. Shaz
            20.06.2016 11:59

            Ну можно и так, а можно и в текущем виде код опубликовать — не исключено что спецы по go смогут дать полезные советы.