Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 19 additions & 0 deletions src/OneScript.StandardLibrary/Xml/XmlReaderImpl.cs
Original file line number Diff line number Diff line change
Expand Up @@ -387,6 +387,16 @@ private void V8CompatibleSkip()

[ContextMethod("Прочитать", "Read")]
public bool Read()
{
var readingDone = ReadInternal();
if (readingDone && _reader.NodeType == XmlNodeType.XmlDeclaration && _settings.IgnoreXMLDeclaration)
{
readingDone = ReadInternal();
}
return readingDone;
}

private bool ReadInternal()
{
if (_reader == null)
return false;
Expand All @@ -396,6 +406,15 @@ public bool Read()
_emptyElemReadState = EmptyElemCompabilityState.EmptyElementRead;
return true;
}
else if (_reader.NodeType == XmlNodeType.XmlDeclaration || _reader.NodeType == XmlNodeType.DocumentType)
{
var readingDone = _reader.Read();
while (readingDone && _reader.NodeType == XmlNodeType.Whitespace)
{
readingDone = _reader.Read();
}
return readingDone;
}
else
{
bool readingDone = _ignoreWSChanged ? ReadWhenStateChanged() : _reader.Read();
Expand Down
2 changes: 2 additions & 0 deletions src/OneScript.StandardLibrary/Xml/XmlReaderSettingsImpl.cs
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,7 @@ public static XmlReaderSettingsImpl Constructor(
IgnoreComments = ignoreComments,
IgnoreProcessingInstructions = ignoreDataProcessorInstructions,
IgnoreWhitespace = ignoreSpaceCharacters,
DtdProcessing = ignoreDocumentType ? DtdProcessing.Ignore : DtdProcessing.Parse,
};

return new XmlReaderSettingsImpl(
Expand All @@ -128,6 +129,7 @@ public static XmlReaderSettingsImpl Create()
IgnoreComments = true, // отличается от конструктора скрипта
IgnoreProcessingInstructions = false,
IgnoreWhitespace = true,
DtdProcessing = DtdProcessing.Ignore,
};

return new XmlReaderSettingsImpl("1.0", context, settings);
Expand Down
105 changes: 104 additions & 1 deletion src/OneScript.StandardLibrary/Xml/XmlWriterImpl.cs
Original file line number Diff line number Diff line change
Expand Up @@ -183,7 +183,110 @@ public void WriteText(string text)
[ContextMethod("ЗаписатьТекущий","WriteCurrent")]
public void WriteCurrent(XmlReaderImpl reader)
{
_writer.WriteNode(reader.GetNativeReader(), false);
var nodeType = reader.NodeType.UnderlyingValue;
switch (nodeType)
{
case XmlNodeType.Element:
CopyElementAndAttributes(reader, this);
break;
case XmlNodeType.XmlDeclaration:
WriteXMLDeclaration();
break;
case XmlNodeType.DocumentType:
CopyDocumentType(reader, this);
break;
case XmlNodeType.Attribute:
CopyAttribute(reader.Name, reader.Value, reader, this);
break;
case XmlNodeType.EndElement:
WriteEndElement();
break;
case XmlNodeType.CDATA:
WriteCDATASection(reader.Value);
break;
case XmlNodeType.Text:
WriteText(reader.Value);
break;
case XmlNodeType.Whitespace:
case XmlNodeType.SignificantWhitespace:
WriteText(reader.Value);
break;
case XmlNodeType.Comment:
WriteComment(reader.Value);
break;
case XmlNodeType.EntityReference:
WriteEntityReference(reader.Name);
break;
case XmlNodeType.ProcessingInstruction:
WriteProcessingInstruction(reader.Name, reader.Value);
break;
case XmlNodeType.Entity:
case XmlNodeType.EndEntity:
case XmlNodeType.Document:
case XmlNodeType.DocumentFragment:
case XmlNodeType.Notation:
throw new RuntimeException(new Localization.BilingualString($"Копирование узла {nodeType} не поддерживается"));
default:
break;
}
}

private static void CopyDocumentType(XmlReaderImpl reader, XmlWriterImpl writer)
{
writer.WriteDocumentType(reader.Name, reader.Value);
}

private static void CopyElementAndAttributes(XmlReaderImpl reader, XmlWriterImpl writer)
{
writer.WriteStartElement(reader.Name);
var attributeCount = reader.AttributeCount();
if (attributeCount != 0)
{
for (var attributeIndex = 0; attributeIndex < attributeCount; attributeIndex++)
{
var attributeName = reader.AttributeName(attributeIndex);
var attributeValue = reader.GetAttribute(ValueFactory.Create(attributeIndex)).ExplicitString();
CopyAttribute(attributeName, attributeValue, reader, writer);
}
}
}

private static void CopyAttribute(string attributeNameIn, string attributeValue, XmlReaderImpl reader, XmlWriterImpl writer)
{
var splittedName = splitName(attributeNameIn);
if (!string.IsNullOrEmpty(splittedName.prefix))
{
var readerNsContext = (XmlNamespaceContext)reader.NamespaceContext;
var writerNsContext = (XmlNamespaceContext)writer.NamespaceContext;
if (splittedName.prefix.Equals("xmlns", StringComparison.Ordinal))
{
writer.WriteNamespaceMapping(splittedName.localName, attributeValue);
return;
}
else
{
var uri = readerNsContext.LookupNamespaceUri(splittedName.prefix);
if (uri is BslStringValue)
{
var value = uri.ExplicitString();
var currentPrefix = writerNsContext.LookupPrefix(value);
if (!(currentPrefix is BslStringValue && currentPrefix.ExplicitString().Equals(splittedName.prefix, StringComparison.Ordinal)))
{
writer.WriteNamespaceMapping(splittedName.prefix, value);
}
splittedName.prefix = value;
}
}
}
writer.WriteAttribute(splittedName.localName, splittedName.prefix, attributeValue);
}

private static (string prefix, string localName) splitName(string nameOrLocalName)
{
var parts = nameOrLocalName.Split(':');
if (parts.Length > 1) return (parts[0], parts[1]);
if (parts[0].Equals("xmlns", StringComparison.Ordinal)) return (parts[0], "");
return ("", parts[0]);
}

[ContextMethod("ЗаписатьТипДокумента","WriteDocumentType")]
Expand Down
28 changes: 24 additions & 4 deletions tests/testrunner.os
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,18 @@
КонецЕсли;
КонецПроцедуры

Процедура ПроверитьРавенствоСтрокБезУчетаРегистра(ПервоеЗначение, ВтороеЗначение, ДопСообщениеОшибки = "") Экспорт
Если нрег(ПервоеЗначение) <> нрег(ВтороеЗначение) Тогда
Если ТипЗнч(ПервоеЗначение) = Тип("Строка") и ТипЗнч(ВтороеЗначение) = Тип("Строка") Тогда
ВызватьИсключение ИсключениеНеравенстваСтрок(ПервоеЗначение, ВтороеЗначение, Истина) + "
|" + ДопСообщениеОшибки;
КонецЕсли;

СообщениеОшибки = "Сравниваемые значения ("+ПервоеЗначение+"; "+ВтороеЗначение+") не равны, а хотели, чтобы были равны." + ФорматДСО(ДопСообщениеОшибки);
ВызватьИсключение(СообщениеОшибки);
КонецЕсли;
КонецПроцедуры

Процедура ПроверитьНеРавенство(ПервоеЗначение, ВтороеЗначение, ДопСообщениеОшибки = "") Экспорт
Если ПервоеЗначение = ВтороеЗначение Тогда
СообщениеОшибки = "Сравниваемые значения ("+ПервоеЗначение+"; "+ВтороеЗначение+") равны, а хотели, чтобы были не равны." + ФорматДСО(ДопСообщениеОшибки);
Expand Down Expand Up @@ -196,20 +208,28 @@
Возврат СтрЗаменить(СтрЗаменить(Строка, Символы.ПС, "\n"), Символы.ВК, "\r");
КонецФункции

Функция ИсключениеНеравенстваСтрок(ПервоеЗначение, ВтороеЗначение)
ДиапазонОтНачала = 5;
ДиапазонВКонце = 5;
СтрокаНабора = " "; // длина = 2*ДиапазонОтНачала
Функция ИсключениеНеравенстваСтрок(ПервоеЗначение, ВтороеЗначение, Знач БезУчетаРегистра = Ложь)
ДиапазонОтНачала = 17;
ДиапазонВКонце = 17;
СтрокаНабора = СтрСоединить(Новый Массив(2*ДиапазонОтНачала), " ");

МинДлина = Мин(СтрДлина(ПервоеЗначение), СтрДлина(ВтороеЗначение));
ИндексРазличия = МинДлина + 1;
Для Сч = 1 По МинДлина Цикл

Символ1 = Сред(ПервоеЗначение, Сч, 1);
Символ2 = Сред(ВтороеЗначение, Сч, 1);

Если БезУчетаРегистра Тогда
Символ1 = нрег(Символ1);
Символ2 = нрег(Символ2);
КонецЕсли;

Если Символ1 <> Символ2 Тогда
ИндексРазличия = Сч;
Прервать;
КонецЕсли;

КонецЦикла;

ОтступНачала = ИндексРазличия - ДиапазонОтНачала;
Expand Down
Loading