public static void ToXmlReturnsNewXElement() { var element = new XElement("Tjoho"); var fragment = SourceFragment.FromXml(element); Assert.AreNotEqual(element, fragment.ToXml()); }
public static void ToXmlIsRoundtripInvariant() { var fragmentXml = Fragment.ToXml(); var trippedFragment = SourceFragment.FromXml(fragmentXml); Assert.AreEqual(Fragment, trippedFragment); }
public void Mutate(AbsoluteFilePath file, int iterations) { var element = SourceFragment.FromString(File.ReadAllText(file.NativePath)).ToXml(); for (int i = 0; i < iterations; i++) { Mutate(element); } File.WriteAllText(file.NativePath, SourceFragment.FromXml(element).ToString()); }
public Task <SourceFragment> Copy() { var fragment = SourceFragment.FromXml(Element); string elementIndent; if (Element.TryGetElementIndent(out elementIndent)) { fragment = RemoveIndentFromDescendantNodes(fragment, elementIndent); } return(Task.FromResult(fragment)); }
async Task ExtractClassToFile(IElement element, string name, RelativeFilePath fileName) { var xml = (await element.Copy()).ToXml(); xml.SetAttributeValue(KeyToName("ux:Class"), name); await _project.CreateDocument(fileName, SourceFragment.FromXml(xml)); // Don't replace original element before new class is loaded await _project.Classes .WherePerElement(x => x.UxClass().Is(name)) .Where(x => x.Any()) .FirstAsync() .Timeout(TimeSpan.FromSeconds(2)); await element.Replace(_ => Task.FromResult(SourceFragment.FromString(string.Format("<{0} />", name)))); }
public static LiveDocument Open( AbsoluteFilePath path, IFileSystem fs, IObservable <ILookup <ObjectIdentifier, ObjectIdentifier> > metadata, BehaviorSubject <Dictionary <ObjectIdentifier, IElement> > idToElement, IObserver <IBinaryMessage> mutations, IScheduler scheduler) { IDocument <byte[]> fileOnDisk = new FileWatchingDocument(fs, path); var parsingErrors = new BehaviorSubject <Optional <Exception> >(Optional.None()); var invalidated = new Subject <Unit>(); var root = new LiveElement( file: path, metadata: metadata, isReadOnly: fileOnDisk.ErrorsDuringLoading.Or(parsingErrors) .Select(e => e.HasValue) .DistinctUntilChanged() .Replay(1).RefCount(), invalidated: invalidated, mutations: mutations, getElement: id => idToElement.Value.TryGetValue(id).Or(Element.Empty)); Optional <XElement> xElementForSaving = Optional.None <XElement>(); var allElements = root.Subtree().Replay(1); var source = new ReplaySubject <SourceFragment>(1); return(new LiveDocument { _garbage = Disposable.Combine( // Save on internal changes invalidated .Select(_ => { if (xElementForSaving.HasValue) { var sourceFragment = SourceFragment.FromXml(xElementForSaving.Value); source.OnNext(sourceFragment); return Optional.Some(sourceFragment); } return Optional.None(); }) .NotNone() .Throttle(TimeSpan.FromSeconds(0.5), scheduler) .Select(sourceFragment => Observable.FromAsync(async() => await fileOnDisk.Save(sourceFragment.ToBytes()))) .Concat() .Subscribe(), // Load on external changes fileOnDisk.ExternalChanges .ObserveOn(Application.MainThread) .Subscribe(reload => { var sourceFragment = SourceFragment.FromBytes(reload); source.OnNext(sourceFragment); try { var simulatorWasFaulted = parsingErrors.Value.HasValue; var newDocument = sourceFragment.ToXml(); parsingErrors.OnNext(Optional.None()); xElementForSaving = Optional.None(); Console.WriteLine("Reloading " + path + " from disk..."); root.UpdateFrom(newDocument); // no known reasons to throw xElementForSaving = Optional.Some(newDocument); // hack to clear errors from the simulator, // since UpdateFrom() doesn't know that the simulator // have failed and will try to emit incremental updates if (simulatorWasFaulted) { mutations.OnNext(new ReifyRequired()); } } catch (Exception e) { parsingErrors.OnNext(e); // hack to get errors from the simulator mutations.OnNext(new ReifyRequired()); } }), // Share subscription to Eleements allElements.Connect(), // Dispose fileOnDisk when disposed fileOnDisk), FilePath = Observable.Return(path), Errors = fileOnDisk.Errors.Or(parsingErrors), SimulatorIdPrefix = path.NativePath, Source = source, Root = root, Elements = allElements, _root = root, _path = path, _idToElement = idToElement, }); }