BatchMarc обрабатывем marc файлы на go + js

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

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

Спустя море потраченных нервных клеток, спустя ад документации по 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 для написания правил выбран как наиболее широко распростарненный (в библиотечной среде, в том числе) язык

© Geektimes