Я пытаюсь проанализировать файл сцены Unity YAML с Ruby и самоцветом Psych. Файл Unity предположительно является подмножеством YAML. Каждый объект Unity является отдельным документом YAML. Вот пример:
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!29 &1
OcclusionCullingSettings:
m_ObjectHideFlags: 0
serializedVersion: 2
m_OcclusionBakeSettings:
smallestOccluder: 5
smallestHole: 0.25
backfaceThreshold: 100
m_SceneGUID: 00000000000000000000000000000000
m_OcclusionCullingData: {fileID: 0}
--- !u!104 &2
RenderSettings:
m_ObjectHideFlags: 0
serializedVersion: 9
m_Fog: 0
m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1}
m_FogMode: 3
m_FogDensity: 0.01
Я анализирую его с помощью:
require 'psych'
scene = Psych.load_stream(File.read "./Scene.unity")
Что приводит к этому сообщению об ошибке:
Psych::SyntaxError ((<unknown>): found undefined tag handle while parsing a node at line 13 column 5)
После некоторого расследования появляется что Psych ожидает, что у каждого документа YAML будет своя собственная директива TAG, в то время как синтаксический анализатор Unity YAML должен считать директивы в начале файла глобальными. Итак ...
Вопрос 1: Кто прав? Расширяется ли область действия директивы TAG от объявления до конца файла или только до конца документа (следующее вхождение ---
)?
Я хотел бы иметь возможность проанализировать файл без необходимости его изменения. Это приводит к ...
Ouestion 2: Есть ли чистый способ сделать это? Скажите опцию Psych, которую я пропустил, или способ передать блок на File.read
, чтобы я мог добавить директивы TAG на лету?